Pipedrive is deal-shaped, which changes the integration question. In a support tool a conversation is the object. In Pipedrive the deal is the object and the conversation is something that happened to it — so the useful question is not 'how do we text from Pipedrive', it is 'where does the thread live, and what does the deal see of it'.
Decide the system of record first
Pipedrive as the record
- Every message becomes an activity or note on the person
- Reps work entirely in Pipedrive
- Sends fire from a Pipedrive automation or a button
- You maintain the write-back, forever
The provider inbox as the record
- Threads live where the messaging tooling is good
- Pipedrive gets a summary activity, not every message
- Reps switch tabs to have a conversation
- Much less to build, and much less to break
For a team of three, the second is almost always right and the first is a project nobody asked for. For a team of thirty with a manager reviewing pipeline in Pipedrive, the first earns its cost. What does not work is both at once with no owner.
The integration, in three endpoints
Pipedrive's API is REST with webhooks in both directions, so this is small. Three pieces do the whole job.
- Send — triggered by an automation, a webhook on a stage change, or a button in the UI.
- Receive — the provider's inbound webhook, matched to a person by normalised phone number.
- Write back — the message recorded against the person, and linked to the open deal so the timeline is complete.
const API = "https://api.pipedrive.com/v1"; /** Numbers come out of CRMs in every format humans have invented. */export const e164 = (raw: string) => { const digits = raw.replace(/\D/g, ""); if (digits.length === 10) return `+1${digits}`; // adjust for your market if (digits.length === 11 && digits.startsWith("1")) return `+${digits}`; return raw.startsWith("+") ? raw : `+${digits}`;}; export async function findPersonByPhone(phone: string) { const url = new URL(`${API}/persons/search`); url.searchParams.set("term", e164(phone)); url.searchParams.set("fields", "phone"); url.searchParams.set("exact_match", "true"); url.searchParams.set("api_token", process.env.PIPEDRIVE_TOKEN!); const { data } = await fetch(url).then((r) => r.json()); return data?.items?.[0]?.item ?? null;} export async function logMessage(opts: { personId: number; dealId?: number; text: string; direction: "in" | "out";}) { await fetch(`${API}/activities?api_token=${process.env.PIPEDRIVE_TOKEN}`, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ subject: opts.direction === "in" ? "iMessage received" : "iMessage sent", type: "task", done: true, // it already happened; do not create a to-do person_id: opts.personId, deal_id: opts.dealId, note: opts.text, }), });}Store the phone number in one canonical format, once
The single most common failure in a CRM messaging integration is a reply that arrives from +15551234567 and matches nothing, because the record holds (555) 123-4567. Normalise on write, normalise on search, and backfill the existing records before you go live rather than after the first lost reply.
Inbound, and what a reply should do to a deal
A reply is not just a message to log. In a deal-shaped CRM it is a signal, and the integration is worth much more if it acts on that.
import { after } from "next/server";import { findPersonByPhone, logMessage, openDealFor } from "@/lib/pipedrive"; export async function POST(req: Request) { const raw = await req.text(); if (!verifySignature(req.headers.get("x-signature"), raw)) { return new Response("bad signature", { status: 401 }); } after(async () => { const event = JSON.parse(raw); const person = await findPersonByPhone(event.from); if (!person) return await createLead(event); // an unknown number is still a lead const deal = await openDealFor(person.id); await logMessage({ personId: person.id, dealId: deal?.id, text: event.text, direction: "in", }); // A human replied. That is the strongest signal this channel produces — // do not let it sit unread behind a notification setting. if (deal) await nudgeOwner(deal, event.text); }); return Response.json({ ok: true });}That last step is the one that pays for the integration. A customer replying to a text is a warmer signal than an email open or a page view will ever be, and the whole point of putting it in Pipedrive is that the deal owner sees it inside their working day rather than at the end of it.
Choosing a provider for this
- [Sendara](/providers/sendara-reviews) — lists Pipedrive among its native integrations, so there is less to build. $249 for the first line and $149 for each additional, with a $99 setup fee.
- [Blooio](/providers/blooio-reviews) — $39/month flat with an OpenAPI spec, if you are writing the integration anyway and want the cheapest sensible line.
- [Miss Blue](/providers/missblue-reviews) — if you decide the provider inbox is the system of record, a shared team inbox plus API is the right shape.
- [The full comparison](/compare/best-imessage-api-for-crm) — CRM integration ranked across the category.
Whichever you pick, wrap it. One send(to, text) function that is the only thing in your codebase which knows the vendor's name turns a future migration into a one-file change — see switching providers, and iMessage API for Node.js for the wrapper itself.
Do the boring half properly
Opt-outs must write back to Pipedrive as a field the automations respect, not just to the provider. Otherwise someone who texted STOP stays in a sequence, and the next campaign texts them again from a CRM that never heard about it. Consent before you text has the rest.
Common questions
- Can Pipedrive send iMessages?
- Not natively. Pipedrive's messaging integrations cover SMS and third-party chat; iMessage is not among them, because Apple publishes no API for anyone to integrate with. You add it through an iMessage provider.
- Which iMessage provider integrates with Pipedrive?
- Sendara lists Pipedrive among its native CRM integrations. Everyone else connects through webhooks and Pipedrive's own API, which is a well-documented and genuinely small piece of work.
- Where should the conversation live — Pipedrive or the provider's inbox?
- Pick one as the system of record and treat the other as a mirror. Two-way sync between two inboxes that both allow replies is the version of this that produces duplicate messages and lost threads.