Marketo
Adobe Marketo Engage is a B2B marketing automation platform for lead nurturing, scoring, account-based marketing, and revenue attribution.
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
Complete these steps in Marketo before configuring Signal.
Access your Marketo instance
Log in to Marketo at your instance URL (e.g. https://app-ab12.marketo.com). The first segment (ab12 in this example) is your Munchkin ID prefix.
Find your Munchkin ID (Account ID)
Navigate to Admin > Munchkin. Your Munchkin Account ID is shown at the top (format: 123-ABC-456). Copy it — this also determines your REST API base URL: https://{munchkin_id}.mktorest.com.
Create a Custom Service for REST API
Navigate to Admin > LaunchPoint > New Service. Configure:
- Service: Custom.
- Display name: e.g. “Datafly Signal”.
- Description: optional.
- API Only User: create a new one (e.g.
datafly_signal@your-org). Assign the API Access role and any required object permissions. - Save.
Copy the Client ID and Client Secret
After saving, click View Details on the new service. Copy:
- Client ID (UUID-like)
- Client Secret (UUID-like)
Marketo uses these for OAuth 2.0 client-credentials flow. Signal handles token acquisition and refresh automatically.
Configuration
| Field | Type | Required | Description |
|---|---|---|---|
munchkin_id | string | Yes | Your Marketo Munchkin Account ID (e.g. 123-ABC-456). Determines the REST endpoint. |
client_id | string | Yes | OAuth Client ID from the Custom LaunchPoint service. |
client_secret | secret | Yes | OAuth Client Secret. |
Signal Setup
Quick Setup
- Navigate to Integrations in the sidebar.
- Open the Integration Library tab.
- Find Marketo under the Marketing Automation category.
- Click Install, and fill in the required fields with the credentials gathered above.
- Click Install Integration.
API Setup
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",
"variant": "default",
"config": {
"munchkin_id": "123-ABC-456",
"client_id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"client_secret": "xxxxxxxxxxxxxxxxxxxx"
},
"delivery_mode": "server_side"
}'Event Mapping
| Datafly Event | Marketo Concept | Notes |
|---|---|---|
page | Custom activity | Sent via Marketo’s Custom Activities API. |
Product Viewed | Custom activity | Forwarded with product context. |
Order Completed | Custom activity with revenue | Mapped to a custom activity carrying revenue, currency, order_id. |
identify | Lead update | Email and traits update the Marketo lead via POST /rest/v1/leads.json. |
Custom activity types must be pre-defined in Marketo’s Admin > Marketo Custom Activities. Signal includes the activityTypeId numeric identifier on each call.
Identity
| Field | Source | Notes |
|---|---|---|
email | traits.email | Marketo’s primary lead key (lookupField: email). |
leadId | (assigned by Marketo) | Internal Marketo ID; resolved from the email match. |
firstName | traits.first_name | Maps to Marketo’s First Name lead field. |
lastName | traits.last_name | Maps to Marketo’s Last Name lead field. |
company | traits.company | Maps to the Company lead field. |
Call datafly.identify() with B2B-relevant traits:
datafly.identify("user-123", {
email: "jane@acme.com",
first_name: "Jane",
last_name: "Doe",
company: "Acme Co"
});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.
Verify it’s working
- Trigger a test event from your website.
- In Marketo, navigate to Database > Search Leads and look up the test lead by email.
- Open the lead’s Activity Log to verify Signal-delivered custom activities appear.
- In Signal, check Live Events to confirm delivery with a
200response status.
Troubleshooting
| Symptom | Possible Cause | Resolution |
|---|---|---|
401 Unauthorized / token errors | Invalid client credentials or insufficient API permissions | Verify Client ID and Secret in Admin > LaunchPoint > your service. Ensure the API user has the API Access role. |
1003 Empty access token parameter | Wrong Munchkin ID format | Munchkin ID is 123-ABC-456 — not the URL prefix. Check Admin > Munchkin. |
| Custom activity error 1006 | Activity type not registered | Pre-create the custom activity type in Admin > Marketo Custom Activities and use its numeric ID. |
| Lead not created | Missing email | Marketo’s default lookup field is email; ensure every identify event carries one. |
| API call limit reached | Daily quota exceeded | Marketo enforces a daily API call quota per subscription. Reduce event volume or batch identifies. |
Visit Marketo REST API documentation for full reference and Custom Activity details.
See also
- Pardot — Salesforce B2B marketing alternative
- HubSpot — CRM alternative
- Salesforce CDP — enterprise CDP