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
| Field | Type | Required | Description |
|---|---|---|---|
business_unit_id | string | Yes | Your Pardot Business Unit ID. Found in Salesforce Setup > Pardot > Account Setup. Sent as the Pardot-Business-Unit-Id request header. |
client_id | string | Yes | The Salesforce Connected App consumer key with Pardot API access. |
client_secret | secret | Yes | The Salesforce Connected App consumer secret. |
refresh_token | secret | Yes | A Salesforce OAuth refresh token with the pardot_api scope. Used by the refresh_token OAuth grant to mint access tokens. |
Signal Setup
- Navigate to Integrations in the sidebar and open the Integration Library tab.
- Find Pardot, click Install and fill in the fields above.
- 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 event | Sent to the vendor as |
|---|---|
identify | upsertLatestByEmail |
sign_up | upsertLatestByEmail |
generate_lead | upsertLatestByEmail |
demo_requested | upsertLatestByEmail |
trial_started | upsertLatestByEmail |
subscription_started | upsertLatestByEmail |
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.
Consent
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
| Symptom | Cause and fix |
|---|---|
400 invalid field | A mapped prospect field does not exist. |
401 | Refresh token revoked, or the Business Unit ID does not match the user. |
See also
- Marketo — alternative B2B marketing automation
- HubSpot — CRM alternative
- Salesforce CDP — Data Cloud