kintone
投稿日:

「反響対応、LINEとメモ帳でやりくりしていませんか?」── kintoneで不動産仲介の追客と物件管理を仕組み化する

皆さんこんにちは。kintoneアプリエンジニアのtomiokaです。

先日、店舗数3つの不動産仲介会社の営業担当の方から「反響の対応漏れがなくならない」と相談がありました。

SUUMOやHOME’Sなどのポータルサイトから来る反響(問い合わせ)は月に80件ほど。それを5人の営業で分担しているのですが、反響が来たことに気づくのが遅れたり、初回連絡はしたもののその後のフォローが抜けたりする。「反響が来てから最初の連絡までに2日以上かかることがある。その時点で他社に決められていることも多い」と。

この記事は、店舗数1〜5の不動産仲介会社で、反響対応や追客管理がLINE・メモ帳・Excelに散在している営業担当やマネージャーの方に向けて書いています。

LINEとExcelの管理で何が起きていたか

詳しく聞いてみると、問題は「対応漏れ」だけではありませんでした。

まず、情報の分散です。反響はポータルサイトからメールで届きますが、その後のやり取りはLINEに移行することが多い。LINEの履歴は営業個人のスマホにしかないため、別の営業が引き継ぐと「前回どこまで話したか」がわからなくなります。

次に、追客のタイミングです。内見まで進んだお客様に「その後いかがですか」と連絡するのは基本ですが、忙しい日が続くと後回しになる。1週間経ってから連絡すると「もう他で決めました」と言われるケースが、月に数件あったそうです。

そして、物件情報の管理です。管理物件の空室情報を、SUUMOやHOME’Sに手動で反映していました。入居が決まったのにポータルの掲載が残ったまま、、、、ということもあり、「問い合わせが来てから埋まっていることに気づく」のがストレスになっていたそうです。

kintoneで構築した3つのアプリ

反響・追客管理アプリ

ポータルサイトからの反響と、その後の追客状況を管理するアプリです。

フィールド名フィールドタイプ用途
反響ID文字列(1行)一意の識別子
顧客名文字列(1行)お客様のフルネーム
電話番号文字列(1行)連絡先
メールアドレス文字列(1行)連絡先
流入元ドロップダウンSUUMO/HOME’S/自社サイト/紹介/飛び込み
希望エリア文字列(1行)お客様の希望エリア
希望賃料上限数値万円単位
担当営業文字列(1行)営業担当者名
対応ステータスドロップダウン未対応/初回連絡済/内見調整中/内見済/申込済/契約済/失注
反響日日付反響を受けた日
最終対応日日付最後に対応した日
次回アクション文字列(1行)次にやるべきこと
次回アクション期限日付いつまでに対応するか
備考文字列(複数行)対応メモ

ポイントは「次回アクション」と「次回アクション期限」のフィールドです。追客は「次に何をするか」が明確でないと止まります。この2つのフィールドがあることで、毎朝「今日期限のアクション」を一覧で確認できるようになります。

物件マスタアプリ

自社で管理・仲介している物件の情報を管理するアプリです。

フィールド名フィールドタイプ用途
物件ID文字列(1行)一意の識別子
物件名文字列(1行)マンション名・ビル名
所在地文字列(1行)住所
間取りドロップダウン1R/1K/1LDK/2LDK/3LDK/その他
賃料数値万円単位
空室ステータスドロップダウン空室/申込中/入居中/退去予定
空室日日付空室になる日(退去予定の場合)
オーナー名文字列(1行)物件オーナー
掲載ステータスドロップダウン掲載中/非掲載

内見予約アプリ

お客様と物件の内見スケジュールを管理するアプリです。

フィールド名フィールドタイプ用途
内見日日付内見予定日
時間帯ドロップダウン午前/午後/夕方
顧客名ルックアップ反響・追客管理アプリから取得
電話番号文字列(1行)ルックアップで自動コピー
物件IDルックアップ物件マスタから取得
物件名文字列(1行)ルックアップで自動コピー
所在地文字列(1行)ルックアップで自動コピー
担当営業文字列(1行)案内する営業
結果ドロップダウン未実施/気に入った/検討中/見送り
備考文字列(複数行)お客様の反応メモ

対応漏れを防ぐ「追客リマインダー」

反響・追客管理アプリの一覧画面に、フォロー期限が過ぎている案件を抽出するボタンを設置するカスタマイズです。毎朝このボタンを押すだけで「今日対応すべきお客様」がわかります。

(function() {
  'use strict';

  var RESPONSE_APP_ID = 86; // 反響・追客管理アプリのID

  kintone.events.on('app.record.index.show', function(event) {
    if (document.getElementById('follow-reminder-btn')) {
      return event;
    }

    var headerSpace = kintone.app.getHeaderMenuSpaceElement();
    if (!headerSpace) {
      return event;
    }

    var btn = document.createElement('button');
    btn.id = 'follow-reminder-btn';
    btn.textContent = '未対応・期限切れチェック';
    btn.style.cssText = 'padding: 8px 16px; background: #e74c3c; color: #fff; border: none; border-radius: 4px; cursor: pointer; font-size: 14px;';
    headerSpace.appendChild(btn);

    btn.addEventListener('click', function() {
      var now = new Date();
      var today = now.getFullYear() + '-' +
        ('0' + (now.getMonth() + 1)).slice(-2) + '-' +
        ('0' + now.getDate()).slice(-2);

      // 未対応 or 期限切れのレコードを検索
      var query = '(対応ステータス in ("未対応") or (次回アクション期限 <= "' + today + '"';
      query += ' and 対応ステータス not in ("契約済", "失注")))';
      query += ' order by 次回アクション期限 asc';

      var body = {
        app: RESPONSE_APP_ID,
        query: query,
        fields: ['顧客名', '担当営業', '対応ステータス', '反響日', '次回アクション', '次回アクション期限', '流入元']
      };

      kintone.api(kintone.api.url('/k/v1/records.json', true), 'GET', body)
        .then(function(resp) {
          var records = resp.records;

          if (records.length === 0) {
            alert('未対応・期限切れの案件はありません。');
            return;
          }

          var message = '【要対応】' + records.length + '件\n\n';
          for (var i = 0; i < records.length; i++) {
            var r = records[i];
            var status = r['対応ステータス'].value;
            var action = r['次回アクション'].value || '(未設定)';
            var deadline = r['次回アクション期限'].value || '(未設定)';
            message += r['顧客名'].value + '(' + r['流入元'].value + ')\n';
            message += '  状態: ' + status + ' / 担当: ' + r['担当営業'].value + '\n';
            message += '  次回: ' + action + '(期限: ' + deadline + ')\n\n';
          }

          alert(message);
        })
        .catch(function(error) {
          console.error(error);
          alert('チェック中にエラーが発生しました。');
        });
    });

    return event;
  });
})();

処理の流れを整理すると、以下のようになります。

  • 一覧画面に「未対応・期限切れチェック」ボタンを配置する
  • クリック時に、ステータスが「未対応」のレコード、または次回アクション期限が今日以前で「契約済」「失注」でないレコードを検索する
  • 結果を一覧で表示し、誰がどのお客様にいつまでに何をすべきかがわかる

クエリの条件で「契約済」「失注」を除外しているのがポイントです。すでに終了した案件がリストに出てくると、ノイズになって本当に対応すべき案件が埋もれてしまうためです。

反響数を営業担当別に月間集計する

反響・追客管理アプリのデータを使って、月間の反響件数を営業担当別に集計するカスタマイズです。

(function() {
  'use strict';

  var RESPONSE_APP_ID = 86;  // 反響・追客管理アプリのID(実環境に合わせて変更)

  kintone.events.on('app.record.index.show', function(event) {
    if (document.getElementById('monthly-report-btn')) {
      return event;
    }

    var headerSpace = kintone.app.getHeaderMenuSpaceElement();
    if (!headerSpace) {
      return event;
    }

    var btn = document.createElement('button');
    btn.id = 'monthly-report-btn';
    btn.textContent = '月間レポート';
    btn.style.cssText = 'padding: 8px 16px; background: #3498db; color: #fff; border: none; border-radius: 4px; cursor: pointer; font-size: 14px; margin-left: 8px;';
    headerSpace.appendChild(btn);

    btn.addEventListener('click', function() {
      var now = new Date();
      var year = now.getFullYear();
      var month = now.getMonth() + 1;
      var startDate = year + '-' + ('0' + month).slice(-2) + '-01';
      var endYear = month === 12 ? year + 1 : year;
      var endMonth = month === 12 ? 1 : month + 1;
      var endDate = endYear + '-' + ('0' + endMonth).slice(-2) + '-01';

      // 反響件数を営業別に集計
      var query = '反響日 >= "' + startDate + '" and 反響日 < "' + endDate + '"';
      var body = {
        app: RESPONSE_APP_ID,
        query: query,
        fields: ['担当営業', '対応ステータス']
      };

      kintone.api(kintone.api.url('/k/v1/records.json', true), 'GET', body)
        .then(function(resp) {
          var records = resp.records;
          var summary = {};

          for (var i = 0; i < records.length; i++) {
            var sales = records[i]['担当営業'].value;
            var status = records[i]['対応ステータス'].value;
            if (!summary[sales]) {
              summary[sales] = { total: 0, contracts: 0 };
            }
            summary[sales].total++;
            if (status === '契約済') {
              summary[sales].contracts++;
            }
          }

          var message = '【' + month + '月の営業別レポート】\n\n';
          var names = Object.keys(summary).sort();
          for (var j = 0; j < names.length; j++) {
            var s = summary[names[j]];
            var rate = s.total > 0 ? Math.round(s.contracts / s.total * 1000) / 10 : 0;
            message += names[j] + ': 反響 ' + s.total + '件';
            message += ' / 契約 ' + s.contracts + '件';
            message += ' / 成約率 ' + rate + '%\n';
          }

          alert(message);
        })
        .catch(function(error) {
          console.error(error);
          alert('集計中にエラーが発生しました。');
        });
    });

    return event;
  });
})();

このサンプルコードもレコード数が500件を超えると正しく集計できません。月間の反響数が500件を超える場合は、全件取得処理を組み込んでください。

ハマりどころ

反響メールの取り込み

ポータルサイトからの反響メールを自動でkintoneに取り込めると理想的ですが、メールのフォーマットはポータルサイトごとに異なります。今回は手動入力からスタートし、将来的にはメール連携サービスやRPAでの自動取り込みを検討する方針にしました。

自動化を急ぎすぎてメールパースの実装に時間をかけるより、まず「kintoneに情報を集約する」という習慣を定着させるほうが効果は大きいです。

「最終対応日」の自動更新

レコードを編集するたびに「最終対応日」を今日の日付に更新したい、というニーズがあります。app.record.edit.submit イベントで自動更新できますが、、、、備考欄に1文字追加しただけでも更新されてしまうため、「本当にお客様に連絡した日」とずれることがあります。

対策として、「対応ステータス」が変わったときだけ最終対応日を更新する条件分岐を入れました。小さな修正では更新しない、というルールです。

物件のステータス管理

「空室」から「申込中」「入居中」とステータスが進みますが、「入居中→退去予定→空室」というサイクルもあります。退去予定のタイミングで次の入居者の募集を始めるため、「退去予定」ステータスと「空室日」フィールドを設けて、先回りで募集準備ができるようにしています。

ポータルサイトへの掲載・非掲載はまだ手動で行っていますが、「空室ステータス」が変わったタイミングで担当者に通知を出す仕組みは入れました。掲載の消し忘れは、ステータスが「入居中」に変わったら自動でリマインド通知が飛ぶ、という運用で防いでいます。

導入結果

導入から2か月時点での変化です。

  • 反響の初回対応: 反響から初回連絡までの平均時間が2日から4時間に短縮。「未対応」ステータスが一覧で目立つため、放置ができなくなった
  • 追客の継続率: 次回アクション期限の管理により、フォロー漏れが月5件程度からほぼゼロに。「追客が途切れて失注するケースが明らかに減った」とのこと
  • 物件情報の鮮度: 空室ステータスの更新忘れが減り、「埋まっている物件に問い合わせが来る」ケースがなくなった
  • 引き継ぎ: 営業が休んだときに、別の営業がkintoneで対応履歴を確認して引き継げるようになった。LINEのやり取りも要点を備考欄に転記する運用を始め、情報の属人化が改善

まとめ

今回は、kintoneを使った不動産仲介業の追客管理と物件管理について紹介しました。

不動産仲介業では「反響からいかに早く、いかに継続的にフォローするか」が成約率を左右します。LINEやメモ帳でのやりくりは初期はなんとかなりますが、反響件数が増えるほど対応漏れのリスクが高くなります。

押さえておきたいポイントは以下の3つです。

  • 「次回アクション」と「期限」をフィールドとして持たせ、毎朝のチェック習慣を仕組み化する
  • 反響の流入元や対応ステータスを構造化して持つことで、営業別・流入元別の成約率が数字で見える
  • 物件のステータス変更を起点にした通知で、ポータルサイトの掲載管理ミスを防ぐ

不動産業務の案件管理やkintoneの導入を検討されている方は、株式会社ファストコーディングでkintoneのカスタマイズや業務アプリの構築を承っていますので、お問い合わせフォームからお気軽にご連絡ください。