Marketo Loader
The Marketo loader pulls marketing automation data from your Marketo instance into your data warehouse. It uses Marketo’s REST API with the OAuth 2.0 client credentials grant and supports incremental sync via the updatedAt timestamp for lead records and activity dates for event data.
Prerequisites
- A Marketo instance (any edition with API access)
- A Marketo API-only user with a custom role that has API access permissions
- A Marketo custom service (LaunchPoint integration) for OAuth credentials
- A connected Warehouse (target warehouse) with write permissions on the target schema
Authentication
The Marketo loader uses OAuth 2.0 Client Credentials for authentication.
Setting Up API Access in Marketo
Step 1: Create an API-only user role
- In Marketo, go to Admin > Users & Roles > Roles
- Click New Role
- Name the role (e.g., “SignalSmith API”)
- Under Access API, enable:
- Read-Only Lead
- Read-Only Activity
- Read-Only Assets
- Read-Only Campaign
Step 2: Create an API-only user
- Go to Admin > Users & Roles > Users
- Click Invite New User
- Enter an email and name (e.g., “signalsmith-api@yourcompany.com”)
- Check API Only
- Assign the API role created in Step 1
Step 3: Create a LaunchPoint custom service
- Go to Admin > LaunchPoint
- Click New > New Service
- Enter a display name (e.g., “SignalSmith Loader”)
- Set Service to “Custom”
- Select the API-only user created in Step 2
- Click Create
- Note the Client ID and Client Secret
Step 4: Find your REST API endpoint
- Go to Admin > Web Services
- Under REST API, note the Endpoint URL (e.g.,
https://123-ABC-456.mktorest.com/rest) - Note the Identity URL (e.g.,
https://123-ABC-456.mktorest.com/identity)
Step 5: Configure in SignalSmith
| Field | Description | Example |
|---|---|---|
| Endpoint URL | Marketo REST API base URL | https://123-ABC-456.mktorest.com |
| Client ID | From the LaunchPoint custom service | abc123def456... |
| Client Secret | From the LaunchPoint custom service | xyz789ghi012... |
SignalSmith obtains and refreshes access tokens automatically using the client credentials grant.
Available Objects
| Object | API Name | Description | Default Sync Mode |
|---|---|---|---|
| Leads | leads | Lead/contact records with all standard and custom fields | Incremental |
| Lists | lists | Static lists and their metadata | Full Refresh |
| List Memberships | list_memberships | Junction table linking leads to static lists | Full Refresh |
| Programs | programs | Marketing programs (email, event, engagement, default) | Full Refresh |
| Program Members | program_members | Leads enrolled in programs with their status | Incremental |
| Activities | activities | Lead activity events (email opens, clicks, form fills, web visits) | Incremental |
| Activity Types | activity_types | Definitions of all activity types available in your instance | Full Refresh |
| Campaigns | campaigns | Smart campaigns and their metadata | Full Refresh |
| Custom Objects | custom_objects | Custom objects defined in your Marketo instance | Incremental |
| Channels | channels | Program channel definitions | Full Refresh |
| Tags | tags | Program tag definitions | Full Refresh |
Activities
Marketo activities represent discrete events — email opens, link clicks, form submissions, web page visits, score changes, and more. Activities are high-volume and extracted with a date-range cursor. Each activity type has a unique numeric ID; the activity_types reference table provides human-readable names.
Common activity types:
| Activity Type ID | Name | Description |
|---|---|---|
| 1 | Visit Web Page | Lead visited a tracked page |
| 2 | Fill Out Form | Lead submitted a Marketo form |
| 6 | Send Email | Email was sent to the lead |
| 7 | Email Delivered | Email was delivered |
| 8 | Email Bounced | Email bounced |
| 9 | Unsubscribe Email | Lead unsubscribed |
| 10 | Open Email | Lead opened an email |
| 11 | Click Email | Lead clicked a link in an email |
| 46 | Interesting Moment | Custom interesting moment logged |
Custom Objects
Marketo custom objects are discovered automatically and extracted like standard objects. They are identified by their API name and appear in the object list during setup.
Configuration
| Setting | Description | Default |
|---|---|---|
| Endpoint URL | Marketo REST API base URL | — (required) |
| Client ID | OAuth client ID from LaunchPoint | — (required) |
| Client Secret | OAuth client secret from LaunchPoint | — (required) |
| Objects | List of objects to sync | — (you choose during setup) |
| Sync Mode | Full Refresh or Incremental (per object) | Incremental |
| Cursor Field | Field used for incremental sync | updatedAt (leads), activityDate (activities) |
| Primary Key | Field(s) that uniquely identify a record | id |
| Target Schema | Warehouse schema for Marketo tables | — (required) |
| Table Prefix | Optional prefix for table names | mkto_ |
| Schedule | Sync frequency | Hourly |
Scheduling Notes
- Daily API quota: Marketo enforces a daily API call quota (typically 50,000 calls per day, varies by contract). Each loader run consumes calls proportional to the data volume. Monitor your usage in Marketo’s Admin panel.
- Bulk Extract API: For leads and activities with large volumes, SignalSmith uses Marketo’s Bulk Extract API. This creates export jobs that run asynchronously in Marketo and return data in CSV format, which is significantly more efficient than paging through the REST API.
- Activity date range: Activities are extracted using a date range filter. The incremental cursor tracks the most recent activity date extracted. SignalSmith applies a lookback window (default: 2 days) to capture late-arriving activities.
- Lead field limits: Marketo’s API returns a maximum of 300 fields per lead record. If your instance has more than 300 fields, select only the fields you need during object configuration.
- Concurrent API calls: Marketo limits concurrent API calls (typically 10). SignalSmith manages concurrency automatically, but if other integrations also use the API, contention may slow extraction.
Schema Mapping
Marketo field types are mapped to warehouse-compatible types:
| Marketo Type | Warehouse Type | Notes |
|---|---|---|
string | VARCHAR | |
integer | BIGINT | |
float | DOUBLE | |
boolean | BOOLEAN | |
date | DATE | |
datetime | TIMESTAMP | UTC normalized from ISO 8601 |
email | VARCHAR | |
url | VARCHAR | |
phone | VARCHAR | |
currency | DOUBLE | |
text | TEXT / VARCHAR | Long text area fields |
reference | VARCHAR | Lead or custom object references |
Troubleshooting
| Issue | Solution |
|---|---|
| ”601 Access token invalid” | The token has expired. SignalSmith should auto-refresh. If persistent, verify the client ID and secret are correct |
| ”602 Access token expired” | Same as above — token refresh should be automatic |
| ”606 Max rate limit exceeded” | You’ve hit the concurrent API call limit. Reduce sync frequency or coordinate with other Marketo integrations |
| ”607 Daily quota reached” | You’ve exhausted the daily API quota. Wait for the quota to reset (resets at midnight CST) or request a quota increase from Marketo |
| Missing custom fields on leads | Custom fields must be created in Marketo before they appear in the schema. Re-run schema discovery after adding fields |
| Activities table is very large | Activities are high-volume. Consider syncing only specific activity types or reducing the lookback window |
| Bulk extract jobs queuing | Marketo limits concurrent export jobs (typically 2). SignalSmith queues and waits, which may increase run duration |
| ”610 Requested resource not found” | The requested object may not exist or the API user lacks permission. Verify the object name and role permissions |
Next Steps
- Create a model to transform your raw Marketo data
- Join Marketo leads with CRM data for a complete lead-to-customer view
- Build audiences based on marketing engagement