> ## Documentation Index
> Fetch the complete documentation index at: https://docs.open.cx/llms.txt
> Use this file to discover all available pages before exploring further.

# Pipedrive connect

> Generate a Pipedrive API token and company domain, then hand both to the Update Lead workflow action.

export const PipedriveFlow = () => {
  const BEAM_COLOR = "#22c55e";
  const renderBeam = ({id, d, duration = 2.8, delay = 0, reverse = false}) => {
    const values = reverse ? {
      x1: "110%;-10%",
      x2: "120%;0%"
    } : {
      x1: "-10%;110%",
      x2: "0%;120%"
    };
    return <g key={id}>
        <path d={d} stroke="currentColor" strokeOpacity="0.18" strokeWidth="1.5" fill="none" strokeLinecap="round" />
        <path d={d} stroke={`url(#${id})`} strokeWidth="2" fill="none" strokeLinecap="round" />
        <defs>
          <linearGradient id={id} gradientUnits="userSpaceOnUse" x1="0" y1="0" x2="0" y2="0">
            <stop offset="0%" stopColor={BEAM_COLOR} stopOpacity="0" />
            <stop offset="45%" stopColor={BEAM_COLOR} stopOpacity="1" />
            <stop offset="55%" stopColor={BEAM_COLOR} stopOpacity="1" />
            <stop offset="100%" stopColor={BEAM_COLOR} stopOpacity="0" />
            <animate attributeName="x1" values={values.x1} dur={`${duration}s`} begin={`${delay}s`} repeatCount="indefinite" />
            <animate attributeName="x2" values={values.x2} dur={`${duration}s`} begin={`${delay}s`} repeatCount="indefinite" />
          </linearGradient>
        </defs>
      </g>;
  };
  const OCX_X = 260, PD_X = 620;
  const MID = 180, R = 44;
  const OUT_Y = MID - 50, IN_Y = MID + 50;
  const bOut = `M ${OCX_X + R},${OUT_Y} C ${OCX_X + 120},${OUT_Y - 20} ${PD_X - R - 120},${OUT_Y - 20} ${PD_X - R},${OUT_Y}`;
  const bIn = `M ${PD_X - R},${IN_Y} C ${PD_X - R - 120},${IN_Y + 20} ${OCX_X + 120},${IN_Y + 20} ${OCX_X + R},${IN_Y}`;
  return <div className="zendesk-flow not-prose my-8 w-full">
      <div className="zendesk-flow-frame relative w-full overflow-hidden rounded-md border border-black/10 bg-white px-4 py-6 dark:border-white/10 dark:bg-zinc-950">
        <div className="zendesk-flow-grid pointer-events-none absolute inset-0" aria-hidden />
        <svg viewBox="0 0 880 320" preserveAspectRatio="xMidYMid meet" xmlns="http://www.w3.org/2000/svg" className="relative z-[1] block w-full text-zinc-500 dark:text-zinc-400" role="img" aria-label="Pipedrive flow: outbound Update-Lead workflow action writes into Pipedrive; inbound Form Submit trigger fires an OpenCX workflow">
          {renderBeam({
    id: "pd-out",
    d: bOut,
    duration: 2.8,
    delay: 0
  })}
          {renderBeam({
    id: "pd-in",
    d: bIn,
    duration: 2.8,
    delay: 1.2,
    reverse: true
  })}

          <g className="fill-zinc-500 dark:fill-zinc-400" style={{
    font: "500 11px ui-sans-serif, system-ui, sans-serif"
  }}>
            <text x={(OCX_X + PD_X) / 2} y={OUT_Y - 30} textAnchor="middle">Update / Create Lead</text>
            <text x={(OCX_X + PD_X) / 2} y={IN_Y + 36} textAnchor="middle">Form Submit trigger</text>
          </g>

          {}
          <g className="fill-zinc-500 dark:fill-zinc-400">
            <polygon points={`${PD_X - R - 4},${OUT_Y - 4} ${PD_X - R + 2},${OUT_Y} ${PD_X - R - 4},${OUT_Y + 4}`} fill={BEAM_COLOR} />
            <polygon points={`${OCX_X + R + 4},${IN_Y - 4} ${OCX_X + R - 2},${IN_Y} ${OCX_X + R + 4},${IN_Y + 4}`} fill={BEAM_COLOR} />
          </g>

          {}
          <g>
            <circle cx={OCX_X} cy={MID} r={R + 4} className="fill-none" stroke={BEAM_COLOR} strokeOpacity="0.25" strokeWidth="1.5">
              <animate attributeName="r" values={`${R + 2};${R + 12};${R + 2}`} dur="3.6s" repeatCount="indefinite" />
              <animate attributeName="stroke-opacity" values="0.35;0;0.35" dur="3.6s" repeatCount="indefinite" />
            </circle>
            <circle cx={OCX_X} cy={MID} r={R} className="fill-white stroke-black/10 dark:fill-zinc-900 dark:stroke-white/10" strokeWidth="1" />
            <foreignObject x={OCX_X - 34} y={MID - 18} width="68" height="36">
              <div className="flex h-full w-full items-center justify-center">
                <img src="/logo-light.svg" alt="" className="block h-full w-full object-contain dark:hidden" />
                <img src="/logo.svg" alt="" className="hidden h-full w-full object-contain dark:block" />
              </div>
            </foreignObject>
            <text x={OCX_X} y={MID + R + 22} textAnchor="middle" className="fill-zinc-700 dark:fill-zinc-200" style={{
    font: "600 12px ui-sans-serif, system-ui, sans-serif"
  }}>OpenCX</text>
            <text x={OCX_X} y={MID + R + 36} textAnchor="middle" className="fill-zinc-500 dark:fill-zinc-400" style={{
    font: "400 10.5px ui-sans-serif, system-ui, sans-serif"
  }}>workflow builder</text>
          </g>

          {}
          <g>
            <circle cx={PD_X} cy={MID} r={R} className="fill-white stroke-black/10 dark:fill-zinc-900 dark:stroke-white/10" strokeWidth="1" />
            <text x={PD_X} y={MID + 5} textAnchor="middle" className="fill-zinc-800 dark:fill-zinc-100" style={{
    font: "700 14px ui-sans-serif, system-ui, sans-serif",
    letterSpacing: "-0.01em"
  }}>pipedrive</text>
            <text x={PD_X} y={MID + R + 22} textAnchor="middle" className="fill-zinc-700 dark:fill-zinc-200" style={{
    font: "600 12px ui-sans-serif, system-ui, sans-serif"
  }}>Pipedrive</text>
            <text x={PD_X} y={MID + R + 36} textAnchor="middle" className="fill-zinc-500 dark:fill-zinc-400" style={{
    font: "400 10.5px ui-sans-serif, system-ui, sans-serif"
  }}>Leads</text>
          </g>
        </svg>
      </div>
    </div>;
};

OpenCX workflows authenticate to Pipedrive with two pieces of data: an <Tooltip tip="A long-lived credential issued per Pipedrive user from Settings → Personal preferences → API. Inherits that user's permissions." cta="Open Pipedrive API settings" href="https://app.pipedrive.com/settings/api">API token</Tooltip> and your <Tooltip tip="The subdomain at the front of your Pipedrive URL — yourcompany from yourcompany.pipedrive.com. Does not include .pipedrive.com.">company domain</Tooltip>. Both travel into the workflow action as inputs — there is no org-level connect screen today.

<PipedriveFlow />

<Warning>
  Pipedrive is in **beta**. Confirm with your OpenCX contact that the `Update PipeDrive Lead` action is enabled on your organization before you configure a workflow — otherwise the action will not appear in the flow builder's node picker.
</Warning>

## Generate credentials

<Steps>
  <Step title="Create a dedicated Pipedrive user (recommended)">
    Create a new Pipedrive user scoped to the pipelines OpenCX should touch. The API token inherits the user's permissions — a narrowly-scoped user limits blast radius if the token leaks.
  </Step>

  <Step title="Generate an API token">
    Sign in as that user, open **Personal preferences → API**, and copy the token. Full URL: [https://app.pipedrive.com/settings/api](https://app.pipedrive.com/settings/api).

    <Warning>
      Anyone with the token can read and write every record the user can see. Treat it like a password.
    </Warning>
  </Step>

  <Step title="Copy your company domain">
    Look at your Pipedrive URL. The first part — `yourcompany` in `yourcompany.pipedrive.com` — is the domain you need. Do not include `.pipedrive.com` or `https://`.
  </Step>

  <Step title="Store both somewhere safe">
    Drop both into your password manager or secret store. Every workflow node that touches Pipedrive expects them as inputs, so you will reuse them across flows.
  </Step>
</Steps>

<Info>
  OpenCX does not persist Pipedrive credentials at the organization level yet. Each workflow action reads the token and domain from its own configuration — rotating the token means updating every workflow that uses it.
</Info>

## Verify the connection

Before wiring credentials into a production workflow, smoke-test them:

<Steps>
  <Step title="Pick a throwaway lead">
    Open Pipedrive, create a test lead (or grab one you know is safe to touch), and copy its **Lead ID** from the URL.
  </Step>

  <Step title="Build a one-node workflow">
    In [your OpenCX dashboard](https://platform.open.cx), create a workflow with a manual trigger and a single **Update PipeDrive Lead** node. Paste the API token, company domain, and the Lead ID.
  </Step>

  <Step title="Add one field update">
    Set `fieldKey` to `title` and `value` to anything (e.g. `"OpenCX smoke test"`).
  </Step>

  <Step title="Run and confirm">
    Run the workflow. The action output should return `success: true` and the lead's title should reflect the new value in Pipedrive. If it doesn't, jump to [Troubleshooting](/integrations/pipedrive/troubleshooting).
  </Step>
</Steps>

***

## Related Documentation

<CardGroup cols={2}>
  <Card title="Update Lead Action" icon="user-round-pen" href="/integrations/pipedrive/update-lead-action">
    Full reference for the Update PipeDrive Lead workflow action.
  </Card>

  <Card title="Trigger workflows from Pipedrive" icon="bolt" href="/integrations/pipedrive/webhook-trigger">
    Wire Pipedrive automations into an OpenCX workflow.
  </Card>

  <Card title="Overview" icon="users-viewfinder" href="/integrations/pipedrive/overview">
    Capabilities and patterns at a glance.
  </Card>

  <Card title="Troubleshooting" icon="wrench" href="/integrations/pipedrive/troubleshooting">
    Credentials rejected, lead not found, field update errors.
  </Card>
</CardGroup>
