Mailchimp webhook
Collect audience subscribes, unsubscribes, profile changes and cleaned addresses from Mailchimp Marketing.
Research Preview. This connector is rolling out account by account. Ask your Intempt contact to enable it for your workspace.
The Mailchimp webhook collects audience state: people subscribing and unsubscribing, changing their email or profile, and being cleaned off a list after a hard bounce.
Mailchimp's webhook is small on purpose. It covers consent and identity, not engagement. Opens, clicks, ecommerce and journeys don't arrive by webhook at all; they come from the historical load and scheduled reads of the Marketing API. Read the two sections below so you know which is which before you build a journey on it.
This page covers Mailchimp Marketing only. Mailchimp Transactional (Mandrill) is a separate product with its own webhook vocabulary and isn't part of this connector.
Payload format
Mailchimp posts application/x-www-form-urlencoded, not JSON. Fields arrive as type, fired_at and a data[...] array, so data[email], data[list_id] and data[merges][FNAME]. Intempt decodes this for you. It matters only if you inspect a delivery in Mailchimp's webhook log and wonder where the JSON went.
Available events
Mailchimp publishes six webhook types as generally available and four as BETA. The six are the ones to build on.
| Webhook type | Description | Intempt events |
|---|---|---|
subscribe | A contact joined the audience | user_created, subscribed_consent, email_consent_changed |
unsubscribe | A contact left the audience. data[action] is unsub or delete; data[reason] is manual or abuse | unsubscribed_consent, email_consent_changed, user_deleted on delete, profile_suppressed |
profile | Merge fields or interests changed | user_updated |
upemail | Email address changed. Carries both data[old_email] and data[new_email] | user_email_changed, user_merged when the new address already exists |
cleaned | Address removed after a hard bounce (hard) or abuse report (abuse) | email_hard_bounced, profile_suppressed |
campaign | A campaign finished sending, or was cancelled | campaign_sent |
sms_subscribe (BETA) | SMS opt-in | sms_subscribed, sms_consent_changed |
sms_unsubscribe (BETA) | SMS opt-out | sms_unsubscribed, sms_consent_changed, profile_suppressed |
upsms (BETA) | SMS number changed | user_phone_changed |
sms_campaign (BETA) | SMS campaign sent | Not mapped |
Each event is normalised onto a named stream, so you build segments and journey triggers on the event name rather than on the payload shape.
Two things about this table that change what a journey can do:
campaignis campaign metadata, not a recipient event. It carries the campaign id, status, subject and audience. There's no person on it, so it can't trigger a per-contact journey. Use it to reconcile send volume and cadence.- The BETA SMS types have no published payload. Mailchimp documents the type names and nothing else. Intempt reads the envelope (
type,fired_at) and assumes the GAdata[...]shape. Treat SMS events as unverified until Mailchimp publishes the schema.
What arrives by API, not webhook
Everything below is read from the Marketing API on the historical load and on a schedule. It shows up on the profile, but with the sync interval's latency, and it can't trigger a journey the moment it happens.
Sends, deliveries, opens, clicks, soft bounces, spam reports and campaign-attributed unsubscribes (Reports API). Segment and tag membership. Journey entry and exit. Orders, carts, products and connected-site page views (Ecommerce API). Landing page and form submissions. Marketing permissions.
Cart abandonment and email delivery are derived by Intempt from those reads, not reported by Mailchimp.
Identity
The identity key is data[email]. On upemail Intempt moves the profile from data[old_email] to data[new_email], and merges if a profile already exists at the new address. Phone arrives only on the BETA upsms type.
Endpoint
The collector path for Mailchimp events is:
https://<your collector host>/webhooks/events/mailchimpMailchimp doesn't let you add request headers, so the source token travels in the endpoint URL Intempt gives you. Paste it exactly. A payload that cannot be attributed to a known source is rejected rather than stored against a default.
Historical load
Connecting Mailchimp runs a one-time historical load before the webhook takes over. It covers: Audience members and their merge fields, campaign reports (sends, opens, clicks, bounces), segments, tags, journeys and ecommerce.
The connector reports connected only once that load finishes, so a complete profile is never mistaken for a partial one. Records that arrive in the overlap between the load and the first webhook event are de-duplicated on the member's email address and the webhook's fired_at, because Mailchimp webhooks carry no event id.
Backfilled records do not trigger journeys, workflows or experiments.
Setup
Mailchimp webhooks are configured per audience. Webhooks need a Standard or Premium plan; on a lower tier the connector runs on the API reads alone. Create the source in Intempt first.
Configure Mailchimp
-
Create a Mailchimp source on the Integrations page and copy the endpoint URL.
-
In Mailchimp, open Audience, then Manage Audience, then Settings, then Webhooks.
-
Click Create New Webhook and paste the Intempt endpoint as the callback URL.
-
Under What type of updates should we send? tick Subscribes, Unsubscribes, Profile updates, Cleaned address, Email changed and Campaign sending.
-
Under Only send updates when a change is made by tick all three: a subscriber, an account admin, via the API. Leaving one unticked drops those changes silently.
-
Save. Subscribe a test address and confirm a
subscribeevent appears in the Intempt event stream.
Repeat for each audience you want collected. One webhook covers one audience.
Salesforce Change Data Capture
Collect lead, contact, account, opportunity and case changes from Salesforce. Salesforce publishes no webhook, so this source subscribes to Change Data Capture over the Pub/Sub API.
WooCommerce webhook
Collect orders, customers, products and coupons from your WooCommerce store.
