Pardot

Creates or updates Salesforce Marketing Cloud Account Engagement (Pardot) prospects server-side through the v5 upsertLatestByEmail API.

Why route Pardot through Datafly Signal

  • Profiles are updated from the server, not the browser. Events reach Pardot even when a tracker blocker or a failed page unload would have dropped a client-side call, so the profile reflects what actually happened.
  • Token lifecycle is handled for you. Signal obtains and refreshes the OAuth credentials Pardot requires, so nothing expires quietly in the middle of a campaign.
  • One consent decision governs every destination. Pardot is gated by the same consent state as the rest of your stack, so a withdrawal applies everywhere at once.

Prerequisites

Find your Business Unit ID

Salesforce Setup > Account Engagement > Business Unit Setup: the ID starts 0Uv.

Create a Connected App

With the pardot_api and refresh_token scopes; authorise it once to obtain a refresh token for a user with the Prospects create and update abilities.

Configuration

FieldTypeRequiredDescription
business_unit_idstringYesYour Pardot Business Unit ID. Found in Salesforce Setup > Pardot > Account Setup. Sent as the Pardot-Business-Unit-Id request header.
client_idstringYesThe Salesforce Connected App consumer key with Pardot API access.
client_secretsecretYesThe Salesforce Connected App consumer secret.
refresh_tokensecretYesA Salesforce OAuth refresh token with the pardot_api scope. Used by the refresh_token OAuth grant to mint access tokens.

Signal Setup

  1. Navigate to Integrations in the sidebar and open the Integration Library tab.
  2. Find Pardot, click Install and fill in the fields above.
  3. Pick the preset for your vertical, then review the mappings in the blueprint editor.
curl -X POST http://localhost:8084/v1/admin/integration-catalog/pardot/install \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Pardot",
    "config": {
      "business_unit_id": "0Uv...",
      "client_id": "3MVG9...",
      "client_secret": "YOUR_CLIENT_SECRET",
      "refresh_token": "YOUR_REFRESH_TOKEN"
    },
    "delivery_mode": "server_side"
  }'

API endpoint

POST https://pi.pardot.com/api/v5/objects/prospects/do/upsertLatestByEmail
Authorization: Bearer (from the refresh token)
Pardot-Business-Unit-Id: {business_unit_id}

Example body:

{"matchEmail": "jane.doe@example.com",
 "prospect": {"email": "jane.doe@example.com", "company": "Acme Ltd", "website": "https://acme.example"}}

The presets turn on the strict output contract: only the fields the blueprint maps are sent.

Event mapping

B2B / SaaS preset (saas)

Create or update the Account Engagement prospect (upsertLatestByEmail) on identify, sign-up, lead, demo request, trial start and subscription start, so scoring, grading and Engagement Studio can act on the person. The email is sent in plain text: Account Engagement matches prospects by it. Only email, company and website are written; custom prospect fields go by their API name with the __c suffix and must exist first, because Account Engagement rejects unknown fields.

Signal eventSent to the vendor as
identifyupsertLatestByEmail
sign_upupsertLatestByEmail
generate_leadupsertLatestByEmail
demo_requestedupsertLatestByEmail
trial_startedupsertLatestByEmail
subscription_startedupsertLatestByEmail

Identity and personal data

The prospect is matched on email (trimmed, lowercased). The email is sent in plain text: Account Engagement matches prospects on it. Custom prospect fields go by their API name with the __c suffix and must exist first, because the API rejects unknown fields.

Pardot events should be sent under the marketing consent category. Pardot maintains its own opt-in fields and works alongside Salesforce CRM’s consent records — Signal forwards CMP consent state so workflows can sync opted_out appropriately.

Known limitations

  • Sandbox business units (pi.demo.pardot.com) are not supported yet.

Troubleshooting

SymptomCause and fix
400 invalid fieldA mapped prospect field does not exist.
401Refresh token revoked, or the Business Unit ID does not match the user.

See also