
AI音声エージェントをCRMに接続:HubSpot、Salesforce、Pipedrive(Webhookコード付き)
今年初めにリリースしたVapiベースの構築事例では、音声エージェント → 社内ルックアップAPI → HubSpotコンタクト読み取りの処理時間が、p50で410ms、p95で1,240msでした。この数値こそが、この記事を書く主な理由です。音声エージェントのCRM連携は、発信者がコントロールする「時計」との勝負で成否が決まります。Zapierの同期のような仕組みで実装してしまうと、Webhookの処理遅延により、エージェントが発話途中で沈黙してしまいます。解決策はAPI呼び出しを増やすことではありません。必要なのは2つのパターン、1つのタイムアウト設定、そしてフォールバック用のフレーズです。以下に、すぐにデプロイ可能なコードと共にその3つをすべて紹介します。
このトピックに関する多くのガイドは概念を説明した後、自社の製品を販売しようとします。しかし、実際に動作するハンドラーを提供するものはほとんどありません。私たちは逆のアプローチを取ります。
主要なポイント
- 音声エージェントはCRMに2つの方法で接続します:通話中のライブ読み取りには関数呼び出し(function calling)、通話後の書き込みにはWebhookを使用します。
- 通話中の読み取りには、発信者が沈黙を聞かないよう5秒の時間予算と音声によるフォールバックフレーズが必要です。
- Webhookの再試行で重複レコードを作成しないよう、**冪等性キー(idempotency key)**を使用して通話データをCRMフィールドにマッピングします。
- Pipedriveにはカスタムフィールド変更用のWebhookが存在しないため、代わりにスケジュールに従って
dealFieldsをポーリングする必要があります。
「音声エージェントCRM連携」の実際的な意味(1つではなく2つの方法)
音声エージェントCRM連携とは、音声エージェントをCRMに接続する2つの明確な方法を指します。1つは発話者がオンライン中にライブでデータを読み取るための関数呼び出し、もう1つは切断後に通話結果を書き戻すためのWebhookです。ライブ読み取りは会話をパーソナライズし、通話後の書き込みは何が起こったかを記録します。これらは異なるタイミングで動作し、異なる方法で失敗します。
一言で表現すると、関数呼び出しは音声エージェントが発話の途中でCRMに質問を投げかける行為であり、Webhookは切断後にエージェントが報告書を提出する行為です。
関数呼び出し:ライブでのデータ読み取り
関数呼び出しとは、LLMがテキスト生成を一時停止し、定義された外部ツールを呼び出し、その結果を次の発話内容に組み込む仕組みです。音声エージェントの場合、そのツールは「CRMでこの発信者を検索する」ことです。モデルがデータを必要だと判断し、サーバーがデータを取得すると、エージェントはプラン tier と共に名前で発信者に対応します。深い仕組みを知りたい場合は、関数呼び出しガイドでツール定義スキーマを解説しています。注意点は、これがライブで行われるため、発信者の忍耐との競争になることです。
Webhook:通話後のデータ書き込み
Webhookとは、何かが完了したときにサーバーが受信するPOSTリクエストです。音声エージェントにとって重要なのは通話終了イベントです。プラットフォームは通話終了と同時に、トランスクリプト、要約、処置結果、録音URLを送信します。あなたはそのペイロードを受け取り、CRMにアクティビティとして書き込み、ディールのステージを進めます。ここでは時間の制約はありません。発信者はすでに切断されているため、再試行、キューイング、整合性の確認が可能です。
本番環境の統合の多くは両方を使用します。ライブで読み取り、通話後に書き込むのです。
アーキテクチャ:インバウンド通話で起こること(エンドツーエンド)
音声エージェントCRM連携は、すべてのインバウンド通話において固定された5ステップのライフサイクルに従います。通話が到着し、エージェントが関数呼び出しを通じて発信者のレコードをライブで読み取り、会話が行われ、通話終了Webhookが発火し、ハンドラーが結果をCRMに書き込み、必要に応じて人間に通知します。この記事のすべてのコード例は、これら5つのステップのいずれかに基づいています。
フローは以下の通りです:
- インバウンド通話の到着。 プラットフォーム(Vapi、Retell、または独自の音声エージェントスタック)が応答し、電話番号で発信者を識別します。
- ライブルックアップ(関数呼び出し)。 エージェントがルックアップツールを呼び出し、CRMにクエリを実行して、コンタクト、ディールステージ、最近のコンテキストを返します。
- 会話。 エージェントが発話し、必要に応じて追加のツールを呼び出します(予約枠の確認、注文の検索など)。
- 通話終了Webhook。 通話が終了し、プラットフォームが通話終了レポートをサーバーにPOSTします。
- CRM書き込み + 引継ぎ。 ハンドラーがアクティビティを記録し、処置結果を設定し、ディールを移動させ、フルコンテキスト付きで人間の担当者向けにタスクを作成します。
上記のヒーロー図はこの流れを正確に表しています:1つのインバウンド矢印、「ライブ読み取り」と「通話後書き込み」への分岐、3つのCRM宛先カード、そして引継ぎノードです。この図を頭に浮かべてください。以下は単に各ボックスの中身を埋める作業です。
通話中のCRMデータ読み取り(そして5秒の時間予算が必要な理由)
はい、音声エージェントは通話中にCRMデータを取得できます。エージェントの次の発話の前に結果を返すルックアップエンドポイントをヒットする関数呼び出しを使用します。制約は時間です。Vapiのサーバーイベントドキュメントによると、関数ツール呼び出しはタイムアウトに対して実行され、ライブ通話における実際の上限はAPIではなく発信者の忍耐です。5秒の予算を組み、フォールバックを用意してください。
SERP(検索エンジン結果ページ)上の誰も測定していない部分がここにあります。Vapi → 社内ルックアップAPI → HubSpotコンタクト読み取りのパスにおいて、数千回の通話 across で往復時間を計測したところ、p50で410ms、p95で1,240msでした。ほとんどの読み取りは高速です。しかし、p95のテール部分(HubSpotのレート制限バックオフ、コールドスタートしたLambda、遅い関連付け取得)で通話が静寂になります。このテール部分が、関数呼び出しツールのタイムアウトを5秒に設定する理由です。これはp95より十分に長く、人間が「もしもし?いますか?」と言い出すポイントよりは十分に短いです。
そして重要なルールがあります:CRMルックアップが発信者の忍耐を超える場合、エージェントは何かを発話すべきです。決して沈黙しないでください。無音は通話を失う最も早い方法です。私たちの構築事例では、ツールがタイムアウトした瞬間にエージェントがフォールバックフレーズを発話します。「少しお待ちください、現在情報を引き出しています。」発信者が聞くのは、壊れたボットではなく、人間らしい間です。
以下は、ライブCRMルックアップ用に提供している関数呼び出しツールの定義です:
{
"type": "function",
"function": {
"name": "lookup_crm_contact",
"description": "Look up the caller in the CRM by phone number before greeting them. Returns name, plan, and open deal stage.",
"parameters": {
"type": "object",
"properties": {
"phone": {
"type": "string",
"description": "Caller phone number in E.164 format"
}
},
"required": ["phone"]
}
},
"server": {
"url": "https://api.yourdomain.com/voice/crm-lookup",
"timeoutSeconds": 5
}
}これを音声対応にする2つの要素があります。timeoutSeconds: 5という上限により、エージェントが永遠に待つことを防ぎます。また、server.urlはCRM直接ではなくあなたのエンドポイントを指しているため、キャッシュ、再試行、戻りデータの形状を制御できます。経験上、エージェントとCRMの間に内部APIを配置することが最良の決断です。そこにフォールバックロジックとフィールドマッピングが存在するからです。
通話後の書き戻し:アクティビティ、要約、処置結果の記録
AI音声エージェントの通話をCRMに記録するには、プラットフォームの通話終了Webhookを受信し、トランスクリプト、要約、処置結果を抽出してから、CRMに通話アクティビティをPOSTし、リードステータスを設定します。ここではレイテンシーの制約がありません(発信者はすでに切断されているため)、通話中にはリスクが高すぎて実行できない重い書き込み、再試行、ディールステージの移動在此处行います。
通話終了ペイロード(Vapiではサーバーイベントドキュメントに従いend-of-call-reportイベントと呼びます)には、トランスクリプト、生成された要約、通話結果、録音URL、通話時間が含まれます。あなたの仕事は、それをCRMアクティビティにマッピングし、レコードを進めることです。
以下は、レポートを受信してHubSpot通話エンゲージメントを書き込み、その後ディールステージを進める実行可能なNode/TypeScriptハンドラーです。POST /crm/v3/objects/callsエンドポイントとコンタクトへの関連付けパターンは、HubSpotのCalls APIガイドから直接引用しています:
import express from "express";
const app = express();
app.use(express.json());
const HUBSPOT_TOKEN = process.env.HUBSPOT_TOKEN!;
const seen = new Set<string>(); // swap for Redis/DB in production
app.post("/voice/end-of-call", async (req, res) => {
const report = req.body.message; // Vapi end-of-call-report
if (report?.type !== "end-of-call-report") return res.sendStatus(200);
const key = report.call.id; // idempotency key (see field-mapping section)
if (seen.has(key)) return res.sendStatus(200);
seen.add(key);
const { contactId, dealId } = report.call.metadata; // set when call started
// 1. Write the call Activity (engagement)
await fetch("https://api.hubapi.com/crm/v3/objects/calls", {
method: "POST",
headers: {
Authorization: `Bearer ${HUBSPOT_TOKEN}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
properties: {
hs_call_title: "AI Voice Agent Call",
hs_call_body: report.summary,
hs_call_duration: String(report.durationMs ?? 0),
hs_call_recording_url: report.recordingUrl ?? "",
hs_call_status: "COMPLETED",
hs_timestamp: Date.now(),
},
associations: [
{
to: { id: contactId },
types: [{ associationCategory: "HUBSPOT_DEFINED", associationTypeId: 194 }],
},
],
}),
});
// 2. Move the deal stage based on disposition
if (dealId && report.analysis?.disposition === "qualified") {
await fetch(`https://api.hubapi.com/crm/v3/objects/deals/${dealId}`, {
method: "PATCH",
headers: {
Authorization: `Bearer ${HUBSPOT_TOKEN}`,
"Content-Type": "application/json",
},
body: JSON.stringify({ properties: { dealstage: "qualifiedtobuy" } }),
});
}
res.sendStatus(200);
});
app.listen(3000);これがH1で約束した成果物です。説明だけでなく、デプロイ可能なハンドラーです。手動でコーディングしてホストしたくない場合、n8nのようなノーコードワークフロー代替案を使用すれば、同じWebhookを受信してビジュアルノードでCRMに書き込むことができます。ただし、再試行やエラー処理の制御性は多少犠牲になります。
重複を作成せずに通話データをCRMフィールドにマッピングする
フィールドマッピングとは、通話データの各部分を特定のCRMオブジェクトとフィールドに接続することです。例えば、発信者の意図をディールプロパティに、処置結果をリードステータスに、要約をアクティビティ本文に割り当てます。ここで注意すべき2つの本番環境での落とし穴があります。エージェントが読み上げる前にデータを読みやすい形式に整形すること、および再試行されたWebhookが同じ通話に対して2番目のレコードを作成しないよう冪等性キーを使用することです。
私たちの構築事例では、エンジニア以外でもハンドラーに触れずに編集できるよう、マッピングを1つの設定オブジェクトで管理しています。実際の形状は以下の通りです:
| 通話データ | CRM オブジェクト.フィールド | 型 | 例 |
|---|---|---|---|
| 発信者の意図 | deal.intent_summary | 文字列 | "Proプランのデモ希望" |
| 処置結果 | contact.lead_status | 列挙型 | "qualified" |
| 通話要約 | call.hs_call_body | 文字列 | "価格について議論、デモ予約済み" |
| 録音URL | call.hs_call_recording_url | URL | "https://..." |
| 持続時間 (ms) | call.hs_call_duration | 数値 | 184000 |
| 適格フラグ | deal.dealstage | 列挙型 | "qualifiedtobuy" |
最初の落とし穴:音声調整されたフォーマット。生のJSONを発信者に読み上げる音声エージェントは壊れているように聞こえます。TTS(テキスト音声変換)に渡す前に、CRMデータを文章としてフォーマットしてください。モデルに{"plan":"pro","renewed":"2026-03"}を返さないでください。「彼らはProプランを利用しており、昨年3月に更新されました」と返し、エージェントが自然に発話できるようにします。
2番目の落とし穴:冪等性。音声プラットフォームはWebhookを再試行します。ハンドラーが冪等でないと、同じ通話が2回記録され、重複レコードが発生します。通話IDをキーとして使用します:
const key = report.call.id;
if (await store.has(key)) return res.sendStatus(200); // already processed
await store.add(key);
// ...do the CRM write本番環境では、このstoreはメモリ内のSetではなく、通話IDに一意制約を持つRedisまたはデータベース行であるべきです。上記のSetはデモ用には機能しますが、サーバーが再起動するたびにメモリを失います。
CRM別セクションに入る前に、音声にとって実際に重要な点における3つのプラットフォームの違いを示します:
| HubSpot | Salesforce | Pipedrive | |
|---|---|---|---|
| アクティビティ/通話オブジェクト | engagement / crm/v3/objects/calls | Task / Activity | Activity |
| ディールオブジェクト | Deal | Opportunity | Deal |
| 認証 | OAuth / プライベートアプリトークン | OAuth | APIトークン / OAuth |
| 通話後書き込み | engagement API | REST / Composite | Activities API |
| カスタムフィールドWebhook | あり | あり | なし、dealFieldsをポーリング |
HubSpot連携(Vapi → HubSpot、ステップバイステップ)
Vapi → HubSpot連携では、ライブ読み取りをコンタクトルックアップに、通話後書き込みをそのコンタクトおよび関連ディールに関連付けられた通話エンゲージメントにマッピングします。HubSpotのオブジェクトモデルはコンタクト、ディール、エンゲージメント(アクティビティ)であり、POST /crm/v3/objects/callsエンドポイントが書き込み対象です。これは検索者が実際に求めているvapi hubspot連携のパターンです。
ライブ読み取りは、電話番号でGET /crm/v3/objects/contacts/searchをクエリし、コンタクトおよびオープンなディールを返すルックアップエンドポイントへの関数呼び出しです。通話後書き込みは前述のセクションのハンドラーです:通話エンゲージメントを作成し、関連付けタイプ194を介してコンタクトに関連付け、その後ディールのdealstageをPATCHします。
人々が見過ごす詳細:HubSpotの関連付けは型付けされています。通話からコンタクトへの関連付けには特定のassociationTypeIdを使用する必要があり、これを省略すると通話はコンタクトのタイムラインに表示されません。HubSpotのCalls APIガイドにIDが記載されています。認証については、単一ワークスペースの場合はプライベートアプリトークンが最も迅速な手段です。複数のHubSpotアカウントに出荷する場合はOAuthを使用してください。
Salesforce連携(オブジェクト、認証、リアルタイム読み取り/書き込み)
Salesforce音声エージェント連携は、通話中にコンタクトまたはリードから読み取り、通話後にTask(アクティビティオブジェクト)を書き込みます。ディールはOpportunity上に存在します。パターンはHubSpotと同じです(ライブ関数呼び出し読み取り、通話後書き込み)が、オブジェクト名と認証フローが異なります。書き込みにはREST APIまたはComposite APIを使用します。
ライブ読み取りの場合、ルックアップエンドポイントはSELECT Id, Name, Account.Name FROM Contact WHERE Phone = '...'のようなSOQLリクエストでSalesforceをクエリし、エージェントに返します。通話後書き込みの場合、Salesforce REST APIガイドに従い、WhoIdをコンタクト/リードに、WhatIdをOpportunityに設定してTaskを作成します:
await fetch(
`${INSTANCE_URL}/services/data/v60.0/sobjects/Task`,
{
method: "POST",
headers: {
Authorization: `Bearer ${sfToken}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
Subject: "AI Voice Agent Call",
Description: report.summary,
Status: "Completed",
WhoId: contactId, // Contact or Lead
WhatId: opportunityId, // Opportunity
CallDurationInSeconds: Math.round((report.durationMs ?? 0) / 1000),
}),
}
);音声特有の落とし穴:SalesforceのOAuthトークンは期限切れになります。5秒のライブ読み取り予算の中でトークン更新が競合することを避ける必要があります。バックグラウンドでスケジュールに従ってトークンを更新し、アクセストークンをキャッシュしてウォーム状態を保ち、ライブルックアップが通話中に更新コストを支払わないようにします。
Pipedrive連携(誰もがスキップするもの)
Pipedrive連携はPersons、Deals、Activitiesを通じて機能しますが、1つの重大な罠があります:カスタムフィールド変更用のWebhookが存在しないことです。音声エージェントがカスタムフィールドに書き込み、その変更に対して他の場所で反応する必要がある場合、サブスクライブできません。Pipedriveはカスタムフィールドが変更された際にWebhookを送信しません。代わりにスケジュールに従ってdealFieldsをポーリングする必要があります。これをカバーしている人はほとんどいません。これがまさに音声エージェントPipedrive連携が微妙な方法で破綻する理由です。
音声ライフサイクルは明確にマッピングされます:ライブ読み取りは電話番号でGET /persons/searchをクエリし、通話後書き込みはPersonとDealにリンクされたアクティビティ(POST /activities)を作成し、適格判定によりディールを次のステージに進めます。標準的なものです。
罠はカスタムフィールドです。Pipedriveでは、カスタムフィールドは人間の名前ではなく40文字のハッシュキーで参照されるため、マッピング設定にはplan_tierではなくdcf558aba6...のようなものを保存する必要があります。また、PipedriveのDealFieldsドキュメントによると、それらに対する変更イベントは存在しません。ダウンストリームシステムがエージェントがカスタムフィールドを更新した時期を知る必要がある場合、GET /dealFieldsをポーリングし、cronジョブで最後のスナップショットとの差分を取ります。エレガントではありません。しかし、それがPipedriveの仕様であり、本番環境で午前2時にこれを知るよりも、ここで読む方がましです。
リード適格判定の引継ぎ:ディールの移動と人間担当者へのブリーフィング
引継ぎとは、音声エージェントが適格判定に基づいてディールステージを移動し、人間担当者向けにタスクを作成し、トランスクリプトと要約を渡すことで、担当者がコンテキストを理解した状態で業務に入れるようにするプロセスです。正しく行えば、人間は冷たい名前と電話番号ではなく、メモ付きの温かく適格なリードを引き継ぎます。
機械的には、すべて通話後ハンドラー内で行われる3つの書き込みです。ディールを適格ステージにPATCHし、締切日付きで担当者に割り当てられたアクティビティ/タスクをPOSTし、通話要約をタスク本文に入れます。担当者はCRMを開き、「AI適格判定済み:Proデモ希望、予算確認済み、木曜日を希望」と表示され、準備を整えてコールバックします。
ここでもプラットフォームの選択が影響します。どのエンジンを構築基盤とするか迷っている場合、どのプラットフォームがCRM連携に最適かの比較記事では、Vapi、Retell、Blandが通話メタデータとWebhookイベントをどのように公開するかを比較しており、その違いが引継ぎの清潔さに直接影響します。
自作 vs 外注(正直な工数)
本番グレードの音声エージェントCRM連携の構築には、CRMあたり約20〜40時間かかります。そして、その時間は予想外の場所に使われます。ハッピーパスの読み取りと書き込みはせいぜい1日程度です。残りは認証トークンの管理、フィールドマッピング、フォールバック処理、冪等性、そしてCRMのレート制限や癖に対するテストです。では、実際に構築するにはどれくらいの時間がかかるのでしょうか。以下が正直な内訳です。
私たちの構築事例では、時間は概ね以下のように配分されます:認証とトークン更新に3〜5時間、フィールドマッピングと音声調整フォーマット層に4〜6時間、フォールバックとタイムアウト処理に4〜8時間、冪等性と重複排除に3〜5時間、残りは実際の通話トラフィックに対するテストです。最初のCRMでパターンを学び、2番目、3番目は速くなりますが、それぞれにPipedriveのカスタムフィールドWebhook欠如のような独自の罠があります。
構築すべきか、購入すべきか?Webhookエンドポイントをホストできる開発者がおり、1つのCRMを統合する場合、自作してください。この記事が青写真です。3つのCRM、マルチテナント認証、午前9時のHubSpotレート制限時に対応できる人員が必要な場合、計算式は変わります。この決定についてはDIY vs 雇用ガイドで詳しく解説しており、価格内訳では統合作業が構築コストにどれだけ加算されるかを示しています。
これらを一切維持したくない場合、私たちはクライアントのためにそれを行います。TechsyはCRMに接続された本番用音声エージェントを出荷します:関数呼び出し読み取り、Webhook書き戻し、フォールバック処理、すべてを含みます。どちらにしてもプレッシャーはありません。上記のコードはあなたが実行するためのものです。
著者について
Mert Batur GurbuzはTechsy.ioの共同創設者であり、チームはB2Bクライアント向けにAIエージェント、自動化システム、音声/SDRパイプラインを出荷しています。バーミンガム大学で学び、Techsyチームが生産環境で実際に使用しているLLMツールスタックについて執筆しています。LinkedInでつながってください。
よくある質問
AI音声エージェントをCRMと連携させるにはどうすればよいですか?
エージェントをCRMに2つの方法で接続します:通話中のライブ読み取りには関数呼び出し、通話後の書き込みにはWebhookを使用します。エージェントはあなたのエンドポイントを介してライブで発信者を検索し、その後通話終了Webhookがハンドラーを発火させ、アクティビティを記録してCRM内のディールステージを更新します。
音声エージェントは通話中にCRMデータを取得できますか?
はい。エージェントは関数呼び出しを使用してルックアップエンドポイントをヒットし、エージェントの次の発話の前にCRMをクエリしてコンタクトおよびディールデータを返します。ライブ通話ではAPIではなく発信者の忍耐との競争になるため、5秒のツールタイムアウトと音声によるフォールバックフレーズを設定してください。
AI音声エージェントの通話をCRMに記録するにはどうすればよいですか?
トランスクリプト、要約、処置結果、録音URLを含むプラットフォームの通話終了Webhookを受信します。ハンドラーはそれらを抽出し、コンタクトに関連付けられた通話アクティビティまたはエンゲージメントをCRMにPOSTし、リードステータスを設定します。発信者はすでに切断しているため、ここではレイテンシーの圧力はありません。
音声エージェントにおけるWebhookと関数呼び出しの違いは何ですか?
関数呼び出しは通話中のライブ読み取りです:エージェントは会話の途中でCRMに質問を投げかけ、答えを即座に使用します。Webhookは通話後の書き込みです:プラットフォームは通話終了後に通話結果をサーバーにPOSTします。関数呼び出しは時間との競争ですが、Webhookはそうではありません。
VapiはHubSpot、Salesforce、Pipedriveと連携しますか?
Vapiはこれら3つすべてに対してネイティブコネクターを提供していませんが、関数呼び出しツール(ライブ読み取り)とサーバーURL Webhook(通話後書き込み)を通じていずれとも連携します。あなたはそれらを独自のエンドポイントに向け、そのエンドポイントがREST APIを介してHubSpot、Salesforce、またはPipedriveと通信します。パターンは3つのCRMすべてで同一です。
通話データをCRMのカスタムフィールドにマッピングするにはどうすればよいですか?
各通話データフィールドをCRMオブジェクトとフィールドにマッピングする設定オブジェクトを保持します。HubSpotとSalesforceでは、カスタムフィールドは読みやすい内部名を使用します。Pipedriveはカスタムフィールドを40文字のハッシュキーで参照するため、設定にはフレンドリーな名前ではなくハッシュを保存します。エージェントが読み上げる前に値を読みやすい形式に整形します。
音声エージェントは通話中にリアルタイムでCRMを更新できますか?
リアルタイムで読み取ることはできますが、ほとんどの本番用構築では書き込みを通話後に延期します。ライブ読み取りは高速である必要があり、安全です。ライブ書き込みは、書き込み中に通話が切断された場合、レイテンシや部分的な更新のリスクがあります。標準的なパターンはライブで読み取り、通話終了Webhookで書き込むことで、発信者の体験を保護します。
音声エージェントが重複するCRMレコードを作成しないようにするにはどうすればよいですか?
冪等性キーを使用します。通話IDが最適です。ハンドラーが anything を書き込む前に、その通話IDをすでに処理済みかどうかを確認し、如果是的话、200を返してスキップします。キーはメモリ内ではなく、再起動後も生存するよう、一意制約を持つRedisまたはデータベースに保存します。Webhookは再試行するため、これは必須です。
RetellはPipedriveと連携しますか?
Retellは、ネイティブコネクターがリストされていない場合でも、他のCRMと同様の関数呼び出しおよびWebhookパターンを通じてPipedriveと連携します。Retellの通話イベントをエンドポイントに接続し、PipedriveのActivitiesおよびDeals APIを使用します。カスタムフィールドの制限に注意してください:Pipedriveにはカスタムフィールド変更用のWebhookがないため、代わりにdealFieldsをポーリングします。
音声エージェントCRM連携の構築にはどれくらい時間がかかりますか?
本番グレードの構築では、CRMあたり約20〜40時間かかります。ハッピーパスは迅速ですが、時間は認証とトークン更新、フィールドマッピング、フォールバックとタイムアウト処理、冪等性、そして実際の通話トラフィックに対するテストに使われます。最初のCRMはパターンを学ぶため最も時間がかかります。追加のCRMにもそれぞれ独自の癖があります。