皆さんこんにちは。kintoneアプリエンジニアのtomiokaです。
先日、不動産仲介会社のお客様からこんな相談をいただきました。「営業が休むと顧客対応が止まる。情報が個人のスマホに閉じていて引き継げない」と。
今回の記事は、店舗数2〜3の不動産仲介会社で営業を担当されている方に向けて書いています。反響対応から内見、追客、契約までを個人のスマホメモとLINEで管理していて、「自分が休んだら誰も対応できない」という状態をkintoneで解決した話です。
不動産仲介の「情報散在」問題
具体的には、「営業の引き継ぎができない」とのことでした。
聞いてみると、反響(SUUMOやHOME’Sからの問い合わせ)は各営業が個人のスマホで受けていて、内見予約はノートにメモ、追客はLINEのトーク履歴を遡って確認する運用でした。営業が3人いるのに、顧客情報が完全に個人に紐づいている。誰かが体調不良で休むと、その人の担当顧客に対応できない状態です。
この状態で起きる問題は明確です。
- 反響から3日以上経ってから連絡してしまい、他社に先を越される
- 内見後のフォロー漏れ。「あのお客さん、その後どうなった?」が誰もわからない
- 同じ物件を別の営業が別の顧客に案内してバッティング
- 月末の成約報告がExcel手集計で半日かかる
- 営業の退職時に顧客リストごと消える
kintoneでどう解決したか
構成は3つのアプリです。
| アプリ名 | 役割 | 主なフィールド |
|---|---|---|
| 顧客管理 | 反響から契約までの顧客情報 | 氏名、連絡先、反響経路、希望条件、担当営業、ステータス |
| 物件マスタ | 取り扱い物件の情報 | 物件名、所在地、賃料、間取り、空室状況 |
| 内見予約 | 内見スケジュールと結果 | 顧客(ルックアップ)、物件(ルックアップ)、内見日時、結果、次アクション |
顧客管理アプリがハブになります。反響が来たらまずここにレコードを作成し、そこから内見予約・追客・契約まで一気通貫で管理します。
顧客管理アプリのフィールド構成
| フィールド名 | フィールドタイプ | フィールドコード |
|---|---|---|
| 氏名 | 文字列(1行) | customer_name |
| 電話番号 | 文字列(1行) | phone |
| メールアドレス | 文字列(1行) | |
| 反響経路 | ドロップダウン | lead_source |
| 希望エリア | チェックボックス | desired_area |
| 希望賃料上限(万円) | 数値 | max_rent |
| 希望間取り | チェックボックス | desired_layout |
| 入居希望時期 | ドロップダウン | move_in_timing |
| 担当営業 | ドロップダウン | sales_rep |
| ステータス | ドロップダウン | customer_status |
| 反響日 | 日付 | lead_date |
| 最終対応日 | 日付 | last_contact_date |
| 対応メモ | 文字列(複数行) | contact_notes |
反響経路は「SUUMO」「HOME’S」「自社サイト」「紹介」「飛び込み」の5つ。ステータスは「反響受付」「内見調整中」「内見済」「申込済」「契約済」「見送り」「長期追客」の7段階です。
ここで重要なのは「最終対応日」フィールドです。このフィールドを使って「3日以上対応していない顧客」を検知します。
内見後に追客タスクを自動生成するカスタマイズ
内見予約アプリでステータスを「内見済」に変更したとき、顧客管理アプリの該当レコードに自動で「次アクション」と「対応期限」を書き込むカスタマイズです。
(function() {
'use strict';
// 内見予約アプリの編集保存時
kintone.events.on('app.record.edit.submit.success', function(event) {
var record = event.record;
var viewingResult = record.viewing_result.value;
// 内見結果が入力された場合のみ処理
if (!viewingResult) return event;
var customerAppId = 86; // 顧客管理アプリID(環境に合わせて変更)
var customerId = record.customer_id.value;
// 内見結果に応じて次アクションを決定
var nextAction = '';
var daysUntilFollow = 0;
switch (viewingResult) {
case '気に入った':
nextAction = '申込意思の確認(電話)';
daysUntilFollow = 1;
break;
case '検討中':
nextAction = '他物件の提案準備';
daysUntilFollow = 3;
break;
case '見送り':
nextAction = '条件ヒアリングのやり直し';
daysUntilFollow = 7;
break;
default:
nextAction = 'フォロー連絡';
daysUntilFollow = 3;
}
// 対応期限を計算
var followDate = new Date();
followDate.setDate(followDate.getDate() + daysUntilFollow);
var followDateStr = followDate.getFullYear() + '-' +
('0' + (followDate.getMonth() + 1)).slice(-2) + '-' +
('0' + followDate.getDate()).slice(-2);
// 最終対応日は「今日」をセット(対応期限ではない点に注意)
var todayStr = new Date().getFullYear() + '-' +
('0' + (new Date().getMonth() + 1)).slice(-2) + '-' +
('0' + new Date().getDate()).slice(-2);
// 顧客管理アプリのレコードを更新
// ※ contact_notesの追記は本来、顧客管理アプリのレコードをGETしてから
// 既存の値に連結してPUTすべきです(後述の注意点を参照)
var params = {
app: customerAppId,
id: customerId,
record: {
customer_status: { value: '内見済' },
last_contact_date: { value: todayStr },
contact_notes: {
value: record.contact_notes.value +
'\n【自動追記】' + followDateStr + 'までに:' + nextAction
}
}
};
kintone.api(kintone.api.url('/k/v1/record.json', true), 'PUT', params)
.then(function() {
console.log('顧客レコードの更新が完了しました');
})
.catch(function(err) {
console.error('顧客レコードの更新に失敗しました:', err);
});
return event;
});
})();このコードは内見予約アプリの編集保存成功時に動きます。内見結果(「気に入った」「検討中」「見送り」)に応じて、次にやるべきアクションとその期限を自動で決定し、顧客管理アプリに書き戻します。
「気に入った」なら翌日に申込確認の電話、「検討中」なら3日以内に別物件の提案、「見送り」なら1週間以内に条件の再ヒアリング。このルールを決めておくことで、「内見したけどその後放置」がなくなります。
追客漏れを検知する一覧カスタマイズ
顧客管理アプリの一覧画面に「対応が遅れている顧客」をハイライト表示します。最終対応日から3日以上経過した顧客の行を赤く表示するコードです。
(function() {
'use strict';
kintone.events.on('app.record.index.show', function(event) {
var records = event.records;
var today = new Date();
today.setHours(0, 0, 0, 0);
records.forEach(function(record, index) {
var lastContact = record.last_contact_date.value;
var status = record.customer_status.value;
// 契約済・見送りは除外
if (status === '契約済' || status === '見送り') return;
if (lastContact) {
var contactDate = new Date(lastContact);
var diffDays = Math.floor((today - contactDate) / (1000 * 60 * 60 * 24));
if (diffDays >= 3) {
// 一覧の該当行をハイライト
var rows = document.querySelectorAll('.recordlist-row-gaia');
if (rows[index]) {
rows[index].style.backgroundColor = '#FFF3CD';
if (diffDays >= 7) {
rows[index].style.backgroundColor = '#F8D7DA';
}
}
}
}
});
return event;
});
})();3日以上未対応は黄色、7日以上は赤色でハイライトします。営業担当が朝一で一覧画面を開けば「今日対応すべき顧客」がすぐにわかります。
ただし注意点があります。document.querySelectorAll('.recordlist-row-gaia')はkintoneの内部クラス名を参照しており、kintoneのアップデートで変わる可能性があります。公式にサポートされた方法ではないため、動作しなくなった場合はクラス名の確認が必要です。
ハマりどころ・注意点
app.record.edit.submit.successのタイミング
app.record.edit.submit.successイベントは、レコードの保存が成功した後に発火します。このイベント内で別アプリのレコードを更新する場合、画面遷移が先に起きてしまいAPI呼び出しが途中で切れることがあります。今回のコードでは非同期で更新しているため、稀に更新が反映されないケースがあります。より確実にするには、app.record.edit.submit(保存前)でreturn new kintone.Promiseを使う方法がありますが、保存前イベントでは他アプリへの書き込みを保証できないため、今回はsuccess時の非同期更新としました。実運用では処理結果をログに残して検知できるようにしておくと安心です。
REST APIのPUTでcontact_notesを追記する際の注意
既存のメモに追記する場合、先に現在のレコードを取得(GET)してから、既存の値に文字列を連結してPUTする必要があります。今回のコードではrecord.contact_notes.valueで内見予約側のメモを参照していますが、本来は顧客管理アプリ側の既存メモを取得すべきです。簡略化のためこの形にしていますが、本番環境では先にGETしてから追記するようにしてください。
一覧のハイライトは表示件数に依存する
一覧画面のハイライトはevent.recordsの件数分しか処理されません。kintoneの一覧はデフォルトで20件、最大100件です。100件を超える顧客がいる場合、ページ切り替えごとにハイライトが再適用されますが、全件を一度に確認することはできません。
導入結果
お客様に導入してもらったところ、以下の変化がありました。
- 反響から初回連絡までの時間:平均2日 → 当日中(反響受付時に担当を割り当てるフローにしたため)
- 内見後のフォロー漏れ:月5件前後 → ほぼゼロ(自動タスク生成により)
- 営業の引き継ぎ時間:丸1日かけて口頭 → kintoneの担当者変更だけで完了
特に営業の引き継ぎについては、以前は退職する営業が持っているLINEのトーク履歴やメモをすべて共有するのに丸1日かかっていたのが、kintoneで一元管理しているため担当者フィールドを変更するだけで完了するようになりました。
まとめ
今回は、不動産仲介会社の内見予約・顧客管理をkintoneで一元化した事例を紹介しました。
- 顧客管理・物件マスタ・内見予約の3アプリ構成で、反響から契約まで一気通貫で管理する
- 内見結果に応じた追客タスクを自動生成し、フォロー漏れを防止する
- 最終対応日からの経過日数で一覧をハイライトし、対応遅れを可視化する
- 営業個人に紐づいていた情報をkintoneに集約し、引き継ぎの属人化を解消する
不動産仲介の業務は「反響→内見→追客→契約」という明確なフローがあるため、kintoneとの相性が良いです。Excelやメモで管理している段階から、まずは顧客管理アプリだけでも移行してみるのがおすすめです。
株式会社ファストコーディングでは、kintoneのカスタマイズや業務アプリの構築をお手伝いしています。「不動産業務に合ったkintoneの使い方を知りたい」という方は、お問い合わせフォームからお気軽にご連絡ください。

