Pardot
Sync prospects, list membership, and custom field data to Salesforce Pardot (Marketing Cloud Account Engagement) for B2B marketing automation, lead scoring, and nurture campaigns. Zeotap pushes prospect records, manages list membership, and updates custom fields via the Pardot API v5 using Salesforce SSO authentication.
Prerequisites
- A Salesforce account with Pardot (Marketing Cloud Account Engagement) provisioned
- A Salesforce Connected App configured with the
pardot_apiOAuth scope - The Pardot Business Unit ID for your account
- API access enabled — Pardot API v5 requires Salesforce SSO authentication (classic Pardot API keys are no longer supported)
Permissions
Your Salesforce Connected App and user account must have the following permissions:
| Capability | Required Permission |
|---|---|
| Read/Write Prospects | Marketing User permission + Pardot role with Prospect access |
| Manage Lists | Pardot role with List access |
| Custom Fields | Pardot Administrator or custom role with Field access |
The Connected App must include the pardot_api OAuth scope. Without this scope, the Salesforce access token cannot authenticate against the Pardot API.
Tip: Assign the “Pardot Administrator” role to the integration user to avoid permission issues during initial setup. You can restrict permissions later once you have confirmed the sync is working.
Authentication
Pardot API v5 authenticates exclusively through Salesforce OAuth2 using a Connected App. Classic Pardot-only API keys (user key + API key) were deprecated with API v4 and are no longer supported.
- Log in to Salesforce as an administrator
- Navigate to Setup > App Manager and click New Connected App
- Fill in the required fields:
- Connected App Name: e.g., “Zeotap Pardot Integration”
- API Name: auto-populated
- Contact Email: your admin email
- Under API (Enable OAuth Settings), check Enable OAuth Settings
- Set the Callback URL to your Zeotap OAuth callback URL
- Under Selected OAuth Scopes, add:
Manage Pardot services (pardot_api)Perform requests at any time (refresh_token, offline_access)
- Click Save, then Continue
- On the Connected App detail page, click Manage Consumer Details to view the Consumer Key (Client ID) and Consumer Secret (Client Secret)
- Complete the OAuth authorization flow to obtain a Refresh Token with the
pardot_apiscope - Find your Pardot Business Unit ID in Salesforce under Setup > Pardot > Pardot Account Setup, or in Marketing Cloud Account Engagement Setup under Business Unit. The ID starts with
0Uv. - In Zeotap, create a new Pardot destination and enter the Client ID, Client Secret, Refresh Token, and Business Unit ID
Note: If your Salesforce org has multiple Pardot Business Units, you must create a separate destination in Zeotap for each Business Unit, each with its own Business Unit ID.
Configuration
| Field | Type | Required | Description |
|---|---|---|---|
| Pardot Business Unit ID | Text | Yes | The Salesforce Business Unit ID that owns the Pardot account (starts with 0Uv). Found in Salesforce Setup > Pardot > Pardot Account Setup. |
| Pardot API Base URL | Text | No | The Pardot API base URL. Defaults to https://pi.pardot.com. Use https://pi.demo.pardot.com for sandbox environments. |
| API Version | Select | No | Pardot API version. Version 5 is recommended (default). Version 4 is available for legacy compatibility. |
Target Settings
| Field | Type | Required | Description |
|---|---|---|---|
| Object Type | Select | Yes | The Pardot object type to sync data to: Prospects, List Membership, or Custom Fields |
| List ID | Text | Conditional | Numeric ID of the Pardot list (required for List Membership). Find this in Pardot under Marketing > Segmentation > Lists. |
| Upsert Field | Select | No | The field used to match prospects on upsert: Email Address (default) or Salesforce CRM ID (fid). |
Supported Operations
Sync Modes
| Mode | Supported |
|---|---|
| Upsert | Yes |
| Insert | Yes |
| Update | Yes |
| Mirror | — |
Audience Sync Modes
| Mode | Supported |
|---|---|
| Add | Yes |
| Remove | Yes |
| Mirror | Yes |
| Upsert | Yes |
Features
- Field Mapping: Yes
- Schema Introspection: No — Pardot prospect fields are well-known. Custom fields vary per account and are not auto-discovered.
Required Mapping Fields
All object types require the Email Address field as the primary identifier. For List Membership, you can alternatively use the Salesforce CRM ID (fid).
| Object Type | Required Fields | Purpose |
|---|---|---|
| Prospects | Primary prospect identifier in Pardot | |
| List Membership | email (or fid) | Identifies the prospect for list add/remove |
| Custom Fields | Identifies the prospect to update |
Default Destination Fields
Prospects
email, first_name, last_name, company, job_title, phone, city, state, country, zip, website, industry, annual_revenue, employees, source, campaign_id, score, grade, notes, fid
List Membership
email, fid
Custom Fields
email (plus any custom fields defined in your Pardot account)
Choosing the Right Object Type
Prospects
Use when you need to create or update prospect records in Pardot with profile data from your warehouse. This is the most common sync target. Typical use cases include enriching prospect records with firmographic data, syncing lead scores from your data warehouse, and pushing CRM attributes back to Pardot for segmentation.
List Membership
Use when you need to manage Pardot list membership based on audience segments. Lists in Pardot drive email campaigns, automation rules, and dynamic content. Typical use cases include syncing audience segments as Pardot lists, managing nurture campaign eligibility, and controlling email suppression lists.
Custom Fields
Use when you need to update custom field values on existing prospects. Custom fields in Pardot hold account-specific data like product usage metrics, subscription tiers, or custom scoring attributes. This object type patches the prospect record with the mapped custom field values.
How It Works
Prospects
Zeotap reads rows from your model query, applies field mapping, and sends each row as an individual API request to the Pardot Prospects API. Sync mode determines the endpoint:
- Upsert:
POST /api/v5/objects/prospects/do/upsertLatestByEmail?email=...— creates a new prospect when no match exists, or updates the most recently modified prospect matching the email. - Insert:
POST /api/v5/objects/prospects— creates a new prospect. Fails if a prospect with the same email already exists. - Update: Zeotap first resolves the email to a prospect ID via
GET /api/v5/objects/prospects/do/readByEmail, then issuesPATCH /api/v5/objects/prospects/{id}. Rows with no matching prospect are failed.
Pardot v5 expects field names in camelCase (for example, firstName, lastName, jobTitle, annualRevenue, campaignId). Zeotap automatically translates the standard snake_case field names in the default field list to their camelCase API equivalents before sending. Custom field API names (defined in your Pardot account as snake_case) are forwarded unchanged.
List Membership
Pardot v5 list memberships are identified by numeric IDs. Zeotap resolves the prospect email to a prospect ID (via readByEmail) before calling the List Memberships API.
- Add:
POST /api/v5/objects/list-membershipswith body{"listId": <id>, "prospectId": <id>}. - Remove: Zeotap queries
GET /api/v5/objects/list-memberships?listId=&prospectId=to find the membership row, then issuesDELETE /api/v5/objects/list-memberships/{id}. - Mirror: Uses DiffOps to split added vs removed rows and applies the two flows above.
Rows whose email does not resolve to a prospect are counted as failures on add and as no-ops (already removed) on remove.
Custom Fields
Custom field updates are processed as prospect upserts against do/upsertLatestByEmail. Zeotap sends the mapped custom field key-value pairs (custom field API names in Pardot are snake_case and are forwarded unchanged) to the Pardot Prospects API.
Rate Limits
Pardot enforces the following API rate limits:
| Limit Type | Threshold | Scope |
|---|---|---|
| Daily API calls | 25,000 | Per Pardot Business Unit |
| Concurrent API calls | 5 | Per Pardot Business Unit |
Zeotap automatically retries on HTTP 429 (Too Many Requests) responses with exponential backoff. If you consistently hit rate limits, consider:
- Reducing sync frequency
- Splitting large syncs across multiple schedules
- Contacting Salesforce to increase your API quota
Note: The 25,000 daily limit applies to all API calls across your Pardot account, not just Zeotap. Monitor your API usage in Pardot under Admin > Usage and Limits.
Best Practices
Email as the primary identifier
Pardot uses email address as the primary unique identifier for prospects. Ensure your source data has clean, deduplicated email addresses. Sending rows without an email (or with invalid emails) will cause row-level failures.
Custom field setup
Create custom fields in Pardot before syncing custom field data. Navigate to Admin > Prospect Fields > Custom Fields to define fields with the correct types. Custom field API names in Pardot are snake_case (for example, subscription_tier) and are forwarded to Pardot unchanged. Standard prospect fields are mapped from snake_case (as shown in Zeotap’s default field list) to Pardot’s camelCase API names automatically.
Connected App scoping
For security, restrict the Connected App to only the scopes needed: pardot_api and refresh_token. Avoid granting full access unless other integrations require it.
Sandbox testing
Use Pardot’s sandbox environment (https://pi.demo.pardot.com) for testing before syncing to production. Set the Pardot API Base URL to the sandbox URL in your Zeotap destination configuration.
Audience sync strategy
When using audience syncs to manage Pardot lists, use Mirror mode to keep the list in exact sync with your audience segment. This automatically adds new members and removes prospects that are no longer in the audience.
Troubleshooting
Authentication failed (401)
Verify your Connected App credentials in Salesforce under Setup > App Manager. Ensure the Connected App has the pardot_api OAuth scope. If using a refresh token, confirm it has not expired or been revoked. Re-authorize the Connected App to obtain a new refresh token.
Business Unit ID not found
The Business Unit ID must start with 0Uv. Find it in Salesforce under Setup > Pardot > Pardot Account Setup. If you have multiple Pardot Business Units, ensure you are using the correct ID for the target account.
Insufficient permissions (403)
The Salesforce user associated with the Connected App must have the “Marketing User” permission and an appropriate Pardot role (e.g., “Pardot Administrator”). Check the user’s profile and Pardot role in Salesforce Setup.
Prospect not found on update
When using Update sync mode, the prospect must already exist in Pardot. Zeotap resolves the email to a prospect ID before patching; rows whose email does not match any existing record are failed. Switch to Upsert mode to automatically create missing prospects.
Rate limit exceeded (429)
Pardot enforces a 25,000 daily API call limit per Business Unit. Zeotap retries automatically with backoff, but if the limit is exhausted, remaining rows will fail. Reduce sync frequency, batch sizes, or contact Salesforce to increase your quota.
List ID not found
Verify the List ID in Pardot under Marketing > Segmentation > Lists. Click the target list and check the URL for the numeric ID. The list must be active — archived or deleted lists will return errors.
API version mismatch
Pardot API v5 is required for Salesforce SSO authentication. If you receive errors about unsupported API versions, ensure the API Version is set to “5” in the destination configuration. Version 4 is available for legacy compatibility but requires the deprecated Pardot-only authentication.
Duplicate prospect error
Pardot does not allow duplicate email addresses on insert. If you attempt to insert a prospect that already exists, the API returns a duplicate error. Use Upsert sync mode (which calls do/upsertLatestByEmail) to update existing prospects instead of failing on duplicates.