kintone
投稿日:

「保険の契約更新、いつも直前にバタバタしていませんか?」─ kintoneで契約更新管理を自動化する

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

先日、保険代理店のお客様から「契約更新の連絡漏れが年に数件ある」と相談がありました。

担当者8名の代理店で、契約の満期日をExcelで管理しているのですが、件数が増えてくると「3ヶ月前に更新案内を送るはずが、気づいたら1週間前だった」ということが起きてしまう。満期を過ぎて無保険状態になりかけた契約者から連絡が来て初めて気づく、、、、という事故が実際に起きていました。

今回の記事は、担当者8名程度の保険代理店で事務・内務を担当されている方に向けて書いています。契約満期のExcel管理に限界を感じている方に、kintoneで段階的なリマインドと更新進捗管理を自動化した事例をお伝えします。

Excel管理で起きている問題

お客様の状況を整理すると、以下の問題が見えてきました。

  • 契約満期のExcelリストを毎月手動でフィルタして「今月対応分」を抽出している
  • 3ヶ月前・1ヶ月前・2週間前の連絡タイミングを、担当者の記憶と手帳で管理している
  • 営業担当と事務担当の役割分担が曖昧で、「誰がいつ連絡したか」が見えない
  • 更新率(更新した件数 / 満期を迎えた件数)を月末にExcelで手集計している
  • 担当者が休むと、その人の案件の対応状況が誰もわからない

特に「段階的な連絡タイミングの管理」が一番の課題でした。1件ずつ「この契約は今どのフェーズか」を把握するのが、Excelでは限界になっていたとのことです。

kintoneでどう解決したか

構成は2つのアプリです。

アプリ名役割主なフィールド
契約管理契約者・保険内容・満期日の管理契約者名、保険種別、満期日、担当営業、更新ステータス
更新タスク段階的リマインドの管理契約(ルックアップ)、タスク種別、対応期限、対応者、完了フラグ

契約管理アプリが主テーブル、更新タスクアプリがリマインドの実行管理です。1つの契約に対して「3ヶ月前連絡」「1ヶ月前連絡」「2週間前連絡」の3つのタスクが自動生成される仕組みです。

契約管理アプリのフィールド構成

フィールド名フィールドタイプフィールドコード
契約者名文字列(1行)contractor_name
契約者電話番号文字列(1行)contractor_phone
保険種別ドロップダウンinsurance_type
保険会社文字列(1行)insurance_company
証券番号文字列(1行)policy_number
契約開始日日付start_date
満期日日付expiry_date
保険料(年額)数値annual_premium
担当営業ドロップダウンsales_rep
事務担当ドロップダウンadmin_rep
更新ステータスドロップダウンrenewal_status
更新結果ドロップダウンrenewal_result
対応メモ文字列(複数行)notes

保険種別は「自動車保険」「火災保険」「生命保険」「傷害保険」「賠償責任保険」の5つ。更新ステータスは「未着手」「案内済」「提案中」「更新確定」「解約」の5段階です。

ポイントは「担当営業」と「事務担当」を分けていることです。保険代理店では、契約者とのやり取りは営業担当が行い、書類の準備や保険会社への連絡は事務担当が行います。この役割分担をkintone上で明確にすることで、「誰が何を対応すべきか」が見えるようになります。

満期日から逆算してリマインドタスクを自動生成する

契約管理アプリにレコードを追加したとき、満期日から逆算して3つのリマインドタスクを自動生成するカスタマイズです。

(function() {
  'use strict';

  kintone.events.on('app.record.create.submit.success', function(event) {
    var record = event.record;
    var expiryDate = record.expiry_date.value;
    var contractorName = record.contractor_name.value;
    var salesRep = record.sales_rep.value;
    var contractId = event.recordId;

    if (!expiryDate) return event;

    var TASK_APP_ID = 88; // 更新タスクアプリID(環境に合わせて変更)

    // 3つのリマインドタスクを生成
    var reminders = [
      { type: '3ヶ月前案内', daysBeforeExpiry: 90 },
      { type: '1ヶ月前確認', daysBeforeExpiry: 30 },
      { type: '2週間前最終確認', daysBeforeExpiry: 14 }
    ];

    var expiry = new Date(expiryDate);
    var taskRecords = reminders.map(function(r) {
      var deadline = new Date(expiry);
      deadline.setDate(deadline.getDate() - r.daysBeforeExpiry);
      var deadlineStr = deadline.getFullYear() + '-' +
        ('0' + (deadline.getMonth() + 1)).slice(-2) + '-' +
        ('0' + deadline.getDate()).slice(-2);

      return {
        contract_id: { value: String(contractId) },
        contractor_name_task: { value: contractorName },
        task_type: { value: r.type },
        deadline: { value: deadlineStr },
        assigned_to: { value: salesRep },
        is_completed: { value: '未完了' }
      };
    });

    var params = {
      app: TASK_APP_ID,
      records: taskRecords
    };

    kintone.api(kintone.api.url('/k/v1/records.json', true), 'POST', params)
      .then(function() {
        console.log('リマインドタスクを3件生成しました');
      })
      .catch(function(err) {
        console.error('タスク生成に失敗:', err);
      });

    return event;
  });
})();

このコードは契約管理アプリのレコード追加成功時に動きます。満期日から90日前・30日前・14日前の日付を計算し、更新タスクアプリに3件のレコードを一括登録します。

たとえば満期日が2026年12月1日の契約を登録すると、以下のタスクが自動で作られます。

タスク種別対応期限
3ヶ月前案内2026-09-02
1ヶ月前確認2026-11-01
2週間前最終確認2026-11-17

事務担当は更新タスクアプリの一覧画面で「今月期限のタスク」をフィルタすれば、対応すべき契約が一目でわかります。

「今月対応すべき契約」ビューの実装

一覧画面のヘッダーに、今月期限のタスク件数をカード表示するカスタマイズです。更新タスクアプリの一覧で使います。

(function() {
  'use strict';

  kintone.events.on('app.record.index.show', function(event) {
    var headerSpace = kintone.app.getHeaderMenuSpaceElement();
    if (!headerSpace) return event;
    if (headerSpace.querySelector('#renewal-summary')) return event;

    var records = event.records;

    // 今月のタスクを集計
    var today = new Date();
    var thisMonth = today.getFullYear() + '-' + ('0' + (today.getMonth() + 1)).slice(-2);

    var summary = { total: 0, completed: 0, overdue: 0 };

    records.forEach(function(record) {
      var deadline = record.deadline.value;
      var isCompleted = record.is_completed.value;

      if (!deadline) return;
      if (deadline.substring(0, 7) !== thisMonth) return;

      summary.total++;
      if (isCompleted === '完了') {
        summary.completed++;
      } else if (new Date(deadline) < today) {
        summary.overdue++;
      }
    });

    var remaining = summary.total - summary.completed;

    var container = document.createElement('div');
    container.id = 'renewal-summary';
    container.style.cssText = 'display:flex;gap:16px;padding:12px 0;';

    var cards = [
      { label: '今月のタスク', value: summary.total, bg: '#E3F2FD', border: '#1976D2' },
      { label: '対応済', value: summary.completed, bg: '#E8F5E9', border: '#388E3C' },
      { label: '未対応', value: remaining, bg: '#FFF3E0', border: '#F57C00' },
      { label: '期限超過', value: summary.overdue, bg: '#FFEBEE', border: '#D32F2F' }
    ];

    cards.forEach(function(c) {
      var card = document.createElement('div');
      card.style.cssText =
        'padding:12px 20px;border-radius:8px;min-width:100px;text-align:center;' +
        'background:' + c.bg + ';border-left:4px solid ' + c.border + ';';

      var label = document.createElement('div');
      label.textContent = c.label;
      label.style.cssText = 'font-size:12px;color:#666;margin-bottom:4px;';

      var value = document.createElement('div');
      value.textContent = c.value;
      value.style.cssText = 'font-size:24px;font-weight:bold;color:' + c.border + ';';

      card.appendChild(label);
      card.appendChild(value);
      container.appendChild(card);
    });

    headerSpace.appendChild(container);
    return event;
  });
})();

一覧画面を開くと、ヘッダーに「今月のタスク」「対応済」「未対応」「期限超過」の4つのカードが表示されます。期限超過が赤く表示されるので、朝一で一覧を開けば「今日やるべきこと」がすぐにわかります。

ただし、この集計はevent.records(一覧に表示されているレコード)だけが対象です。一覧のフィルタやページネーションの影響を受けるため、正確な全件集計が必要な場合はREST APIで全レコードを取得する処理に変える必要があります。

ハマりどころ・注意点

app.record.create.submit.successでのrecordId

app.record.create.submit.successイベントでは、event.recordIdで作成されたレコードのIDを取得できます。ただし、event.record.$idではなくevent.recordIdを使う必要がある点に注意してください。最初record.$id.valueで取得しようとしてundefinedになりました、、、、

日付計算のsetDateの挙動

setDateで月をまたぐ計算をすると、JavaScriptのDateオブジェクトは自動的に月を繰り上げてくれます。たとえば3月1日の30日前は1月30日になります。これは便利ですが、月末の計算(1月31日の30日前は1月1日)が直感と合わないケースがあるので、テストデータで確認しておくのがおすすめです。

既存契約のタスク一括生成

このカスタマイズは「新規登録時」にタスクを生成します。既存のExcelデータをkintoneに移行した場合、既存レコードにはタスクが生成されません。移行時には、REST APIで全契約レコードを取得し、タスクを一括生成するスクリプトを別途用意する必要があります。お客様にも事前にこの点を説明しておくことが大事です。

導入結果

お客様に導入していただいたところ、以下の変化がありました。

  • 更新連絡の漏れ:年3〜4件 → 導入後6ヶ月でゼロ
  • 月初の「今月分の抽出作業」:半日 → 一覧画面を開くだけ
  • 営業・事務の対応状況の把握:口頭確認 → kintoneで即時確認
  • 更新率の集計:月末にExcelで半日 → リアルタイムで確認可能

事務担当の方からは「朝パソコンを開いたら今日やることが並んでいるので、もう手帳を見なくていい」とのことでした。

まとめ

今回は、保険代理店の契約更新管理をkintoneで自動化した事例を紹介しました。

  • 契約管理と更新タスクの2アプリ構成で、満期日ベースのリマインドを自動生成する
  • 3ヶ月前・1ヶ月前・2週間前の段階的な連絡タイミングを仕組み化する
  • 一覧画面のサマリーカードで「今月の対応状況」を一目で把握できるようにする
  • 営業担当と事務担当の役割分担をkintone上で明確にする

保険代理店の業務は「満期日」という明確な期限があるため、リマインドの自動化が特に効果的です。Excel管理で「漏れが怖い」と感じている方は、まず契約管理アプリだけでも作ってみるのがおすすめです。

株式会社ファストコーディングでは、kintoneのカスタマイズや業務アプリの構築をお手伝いしています。「保険業務に合ったkintoneの使い方を相談したい」という方は、お問い合わせフォームからお気軽にご連絡ください。