【不動産BPR/RPA】営業体制の構築と業務改善を目的とした顧客管理・自動記録通知プロセス構築(GAS,Spread Sheet等)
株式会社Giving Firstのコンサルティング事例を紹介します。
本プロジェクトでは、不動産仲介会社さまからのご依頼で、SUUMOやホームズといった不動産媒体系からのリードを一元管理し営業体制を強化・効率化することを目的に営業体制の組成とシステム構築をご支援させていただきました。
目次
当プロジェクトでのご支援概要
不動産媒体サイトから流入するリードの顧客管理(ホットリード選別・追客・営業マンのステータス管理)の一元化・効率化を目的に、顧客管理を自動化する業務プロセスを構築しました。
- 顧客:不動産仲介・売買会社
- メインシステム:Google App Script(GAS)
- 関連・周辺システム:Google Spread Sheet、Gmail、Lark
- 担当領域
- 要求定義・要件定義・基本設計・詳細設計・開発工程
- BPR(業務フローの分解と新規構築、活用する情報システムの提案・決定、THE MODEL型の営業組織構築)
- システム開発(Java ScriptベースのGoogle App Script開発による案件管理表への自動転記)
- RPA(Webhookを活用した社内Chatへの通知自動化)
プロジェクトのゴール
情報共有の円滑化と業務運営の効率化を目的に、社内ポータルサイトと周辺システムの構築、業務フローを定義することをゴールとして設定し、ご支援致しました。
- リードの自動登録・管理(媒体サイト経由のリードを管理簿に自動登録する仕組み)
- リード発生時にタイムリーに対応できる仕組み(社内Chatへの即時通知)
- リード追客の営業体制構築(ISとしてのファーストコンタクト体制、内見フェーズのFSへのトスアップ体制etc)
当社からの支援・施策事例
- 業務フロー整理と再構築(BPR)
- 経営課題・社内組織体制の課題抽出と改善策の提案
- 顧客管理簿・案件管理(Google Spread Sheet)の構築
- THE MODEL型の営業体制とシステムフローの構築(IS,FS,CS組成、組織体制に合わせたCRMシステム構築)
SUUMOリード獲得時のGoogle Spread Sheetへの自動反映プログラム
弊社で納品したプログラムをサンプルとしてご紹介します。
当該プログラムは、Google App Scriptで実装し、5分程度のポーリング間隔で実行します。
不動産会社様で同じ悩みを抱えておられる場合は、弊社のお問合せフォームから実装したい旨をご相談ください。
プログラムの処理内容
- SUUMOからお問い合わせがあった際に受信する「通知メール」をトリガー
- 通知メール内に記載されている顧客情報を取得
- 過去のメールを重複して処理しないように、メールIDをキーに重複排除
- 通知メールから取得した顧客情報を任意のGoogle Spread Sheetに自動転記する
function extractAndWriteToSheet() {
// スプレッドシートとシートを指定
var spreadsheetId = 'XXXXX'; // スプレッドシートのIDを指定
var sheetName = 'XXXXX'; // シート名を指定
var logSheetName = 'XXXXX'; // 処理済みメールIDを記録するシート名
var spreadsheet = SpreadsheetApp.openById(spreadsheetId);
var sheet = spreadsheet.getSheetByName(sheetName);
var logSheet = spreadsheet.getSheetByName(logSheetName);
// 処理済みメールIDシートが存在しない場合は作成
if (!logSheet) {
logSheet = spreadsheet.insertSheet(logSheetName);
logSheet.appendRow(['メールID']); // ヘッダー行
}
// 処理済みメールIDのリストを取得
var lastRow = logSheet.getLastRow();
var processedEmailIds = [];
if (lastRow > 1) { // ヘッダー行があるため、2行目以降にデータがあるかを確認
processedEmailIds = logSheet.getRange(2, 1, lastRow - 1, 1).getValues().flat();
}
// Gmailのフィルタリング条件
var threads = GmailApp.search('subject:検索するメールの文字列');
// 各スレッド(メール)の処理
for (var i = 0; i < threads.length; i++) {
var messages = threads[i].getMessages();
for (var j = 0; j < messages.length; j++) {
var message = messages[j];
var messageId = message.getId();
// メールが既に処理されているかを確認
if (processedEmailIds.includes(messageId)) {
continue; // 既に処理されている場合はスキップ
}
var body = message.getPlainBody();
// 正規表現で特定の文字列を抽出
var inquiryDate = body.match(/お問合せ日時:(.+)/);
var responseCode = body.match(/反響送付先コード:(.+)/);
var nameKanji = body.match(/名前(漢字):(.+)/);
var nameKana = body.match(/名前(カナ):(.+)/);
var email = body.match(/メールアドレス:(.+)/);
var tel = body.match(/TEL:(.+)/);
var fax = body.match(/FAX:(.+)/);
var contactMethod = body.match(/連絡方法:(.+)/);
var inquiryContent = body.match(/お問合せ内容:(.+)/);
var propertyType = body.match(/物件種別:(.+)/);
var propertyCode = body.match(/物件コード:(.+)/);
var propertyName = body.match(/物件名:(.+)/);
var companyPropertyCode = body.match(/貴社物件コード:(.+)/);
var nearestStation = body.match(/最寄り駅:(.+)/);
var busWalk = body.match(/バス/歩:(.+)/);
var location = body.match(/所在地:(.+)/);
var rent = body.match(/賃料:(.+)/);
var floorPlan = body.match(/間取り:(.+)/);
var area = body.match(/専有面積:(.+)/);
var propertyDetailLink = body.match(/物件詳細画面:(.+)/);
var inquiryComment = body.match(/お問合せ内容コメント:(.+)/);
// スプレッドシートに書き込む
var lastRow = sheet.getLastRow() + 1; // 新しい行に書き込む
sheet.getRange(lastRow, 1).setValue(inquiryDate ? inquiryDate[1].trim() : '');
sheet.getRange(lastRow, 2).setValue(responseCode ? responseCode[1].trim() : '');
sheet.getRange(lastRow, 3).setValue(nameKanji ? nameKanji[1].trim() : '');
sheet.getRange(lastRow, 4).setValue(nameKana ? nameKana[1].trim() : '');
sheet.getRange(lastRow, 5).setValue(email ? email[1].trim() : '');
sheet.getRange(lastRow, 6).setValue(tel ? tel[1].trim() : '');
sheet.getRange(lastRow, 7).setValue(fax ? fax[1].trim() : '');
sheet.getRange(lastRow, 8).setValue(contactMethod ? contactMethod[1].trim() : '');
sheet.getRange(lastRow, 9).setValue(inquiryContent ? inquiryContent[1].trim() : '');
sheet.getRange(lastRow, 10).setValue(propertyType ? propertyType[1].trim() : '');
sheet.getRange(lastRow, 11).setValue(propertyCode ? propertyCode[1].trim() : '');
sheet.getRange(lastRow, 12).setValue(propertyName ? propertyName[1].trim() : '');
sheet.getRange(lastRow, 13).setValue(companyPropertyCode ? companyPropertyCode[1].trim() : '');
sheet.getRange(lastRow, 14).setValue(nearestStation ? nearestStation[1].trim() : '');
sheet.getRange(lastRow, 15).setValue(busWalk ? busWalk[1].trim() : '');
sheet.getRange(lastRow, 16).setValue(location ? location[1].trim() : '');
sheet.getRange(lastRow, 17).setValue(rent ? rent[1].trim() : '');
sheet.getRange(lastRow, 18).setValue(floorPlan ? floorPlan[1].trim() : '');
sheet.getRange(lastRow, 19).setValue(area ? area[1].trim() : '');
sheet.getRange(lastRow, 20).setValue(propertyDetailLink ? propertyDetailLink[1].trim() : '');
sheet.getRange(lastRow, 21).setValue(inquiryComment ? inquiryComment[1].trim() : '');
// 処理済みメールIDを記録
logSheet.appendRow([messageId]);
}
}
}
\本件と同様のご相談も受け付けております/