Marketo
Creates or updates Adobe Marketo Engage people (leads) server-side through the REST Sync Leads API, keyed by email, so smart campaigns and nurture can act on them.
Why route Marketo through Datafly Signal
- Profiles are updated from the server, not the browser. Events reach Marketo even when a tracker blocker or a failed page unload would have dropped a client-side call, so the profile reflects what actually happened.
- Delivery is batched, rate-limited, and retried. Signal buffers to Kafka, respects the Marketo rate limit, and retries on 429 or transient failure rather than dropping the event.
- Token lifecycle is handled for you. Signal obtains and refreshes the OAuth credentials Marketo requires, so nothing expires quietly in the middle of a campaign.
- One consent decision governs every destination. Marketo is gated by the same consent state as the rest of your stack, so a withdrawal applies everywhere at once.
Prerequisites
Create a LaunchPoint custom service
Admin > LaunchPoint > New Service (Custom), with an API-only user whose role has Read-Write Person. Copy the Client ID and Client Secret from View Details.
Find your REST base URL
Admin > Integration > Web Services shows the REST API endpoint, for example https://123-ABC-456.mktorest.com/rest; enter it without /rest.
Configuration
| Field | Type | Required | Description |
|---|---|---|---|
rest_base_url | string | Yes | Your Marketo REST endpoint host, with scheme and no trailing slash, from Admin > Integration > Web Services (the REST API Endpoint without /rest). The lead sync and the OAuth token URL are both built from it. |
client_id | string | Yes | Client ID of a Marketo LaunchPoint custom service (Admin > LaunchPoint) whose API-only user has the Read-Write Person permission. |
client_secret | secret | Yes | Client secret of the same LaunchPoint service, used for the OAuth client credentials token request. |
munchkin_id | string | No | Your Munchkin account ID (Admin > Munchkin). Not used by the lead sync; kept for reference. |
Signal Setup
- Navigate to Integrations in the sidebar and open the Integration Library tab.
- Find Marketo, 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/marketo/install \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "Marketo",
"config": {
"rest_base_url": "https://123-ABC-456.mktorest.com",
"client_id": "YOUR_CLIENT_ID",
"client_secret": "YOUR_CLIENT_SECRET"
},
"delivery_mode": "server_side"
}'API endpoint
POST {rest_base_url}/rest/v1/leads.json
Token: {rest_base_url}/identity/oauth/token (client_credentials; bearer header)Example body:
{"action": "createOrUpdate", "lookupField": "email",
"input": [{"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 Marketo person (Sync Leads, lookupField email) on sign-up, lead, demo request, trial start and subscription start, so Marketo smart campaigns and nurture can pick the person up. The email is sent in plain text: it is the Marketo lookup key. Only email, company and website are written; add further standard or custom fields by their REST API names (Admin > Field Management).
| Signal event | Sent to the vendor as |
|---|---|
sign_up | createOrUpdate |
generate_lead | createOrUpdate |
demo_requested | createOrUpdate |
trial_started | createOrUpdate |
subscription_started | createOrUpdate |
identify | createOrUpdate |
Identity and personal data
The person is looked up by email (trimmed, lowercased). The email is sent in plain text: it is Marketo’s lookup key. Company and website come from the identity traits. Add further standard or custom fields by their REST API name (Admin > Field Management).
Consent
Marketo events should be sent under the marketing consent category. Marketo has its own opt-in lead fields (unsubscribed, marketingSuspended) — Signal forwards CMP consent state so workflows can update these fields when needed.
Known limitations
- Custom activities are not sent: Marketo’s Add Custom Activities API needs the numeric Marketo lead ID, which Signal does not hold.
Troubleshooting
| Symptom | Cause and fix |
|---|---|
Record skipped in a 200 response | Marketo reports per-record failures in the body, for example an unknown field name. |
601 / 602 token errors | Invalid or expired token; Signal refreshes it. Persistent errors mean wrong credentials. |
See also
- Pardot — Salesforce B2B marketing alternative
- HubSpot — CRM alternative
- Salesforce CDP — enterprise CDP