Intempt Docs
GuidesCustomer Data PlatformWebhooks

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 typeDescriptionIntempt events
subscribeA contact joined the audienceuser_created, subscribed_consent, email_consent_changed
unsubscribeA contact left the audience. data[action] is unsub or delete; data[reason] is manual or abuseunsubscribed_consent, email_consent_changed, user_deleted on delete, profile_suppressed
profileMerge fields or interests changeduser_updated
upemailEmail address changed. Carries both data[old_email] and data[new_email]user_email_changed, user_merged when the new address already exists
cleanedAddress removed after a hard bounce (hard) or abuse report (abuse)email_hard_bounced, profile_suppressed
campaignA campaign finished sending, or was cancelledcampaign_sent
sms_subscribe (BETA)SMS opt-insms_subscribed, sms_consent_changed
sms_unsubscribe (BETA)SMS opt-outsms_unsubscribed, sms_consent_changed, profile_suppressed
upsms (BETA)SMS number changeduser_phone_changed
sms_campaign (BETA)SMS campaign sentNot 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:

  • campaign is 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 GA data[...] 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/mailchimp

Mailchimp 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

  1. Create a Mailchimp source on the Integrations page and copy the endpoint URL.

  2. In Mailchimp, open Audience, then Manage Audience, then Settings, then Webhooks.

  3. Click Create New Webhook and paste the Intempt endpoint as the callback URL.

  4. Under What type of updates should we send? tick Subscribes, Unsubscribes, Profile updates, Cleaned address, Email changed and Campaign sending.

  5. 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.

  6. Save. Subscribe a test address and confirm a subscribe event appears in the Intempt event stream.

Repeat for each audience you want collected. One webhook covers one audience.

On this page