Connect Mailchimp to Fondoo
Mailchimp in Fondoo: what your AI agent can do with it, what to set up first, the permissions it needs and its limits.
In Mailchimp open Profile → Extras → API keys and create a key for Fondoo (the key ends in a data center such as -us21, which selects the API host); Mailchimp API keys carry the full permissions of the user who created them, so create it from a dedicated user with the Manager or Admin role and revoke it when you disconnect. Pass the audience (list) ID with each call; find it under Audience → Settings → Audience name and defaults. Fondoo only subscribes people who completed Fondoo's double opt-in and never re-subscribes anyone Mailchimp holds as unsubscribed, cleaned or archived. Free plans cannot send API-created campaigns to more than the plan allows; Mailchimp may refuse a send until the audience has the required address and permission reminder.
Official documentation: https://mailchimp.com/developer/marketing/api/
Use add_connection_key without fields for a signed, one-use secure paste page. Then call test_connection and inspect confirmed versus unknown permissions. Direct tool credentials carry a chat-log warning. list_connections never returns credentials.
Auth: api_key (Authorization: Bearer <key>; the key's -usNN suffix selects the host https://usNN.api.mailchimp.com/3.0). Category: email. Required provider scopes: none; Mailchimp API keys carry the permissions of the user that created them.
Capabilities are discoverable with list_connector_manifests; invoke them through connector_action. Writes retain shared Fondoo scopes, approvals, dry runs, audit, events and metering. Use rotate_connection_key before expiry and delete_connection to remove stored credentials; revoke upstream credentials separately.
What Fondoo does with Mailchimp
Fondoo operations sync_subscribers_to_provider, sync_subscribers_from_provider, create_provider_campaign and send_provider_campaign (REST POST /v1/ops/<name> and MCP call_tool) drive these normalized capabilities. Consent rules: only people who completed Fondoo's double opt-in are pushed as subscribed; Fondoo opt-outs are pushed as unsubscribed; anyone Mailchimp holds as unsubscribed, cleaned or archived is never re-subscribed and is adopted as an opt-out in Fondoo; imported members get a recorded consent attestation and still receive Fondoo's own confirmation email. send_provider_campaign is destructive, so agents need owner approval.
audiences.list(read):GET /lists(first 100) withmemberCountfromstats.member_count.subscribers.list(read):GET /lists/{listId}/memberswithcount/offset; the cursor is the next offset.listIdis required. Status mapping:subscribed,pending,unsubscribed,cleaned;archivedandtransactional→other(never imported).subscribers.upsert_batch(write): per member,PUT /lists/{listId}/members/{md5(email)}withstatus_if_new:"subscribed"and nostatus, so an existing member keeps whatever status Mailchimp holds. If the response saysunsubscribed/cleaned/archivedthe outcome isskipped_provider_unsubscribed; tags are then added withPOST .../tags. Unsubscribes read the member first (404 →unchanged, never created) andPATCHstatus:"unsubscribed". The PUT does not say whether the member existed, so a successful subscribe reportsupdated(with tags) orunchanged, nevercreated. Up to 100 members and 220 requests per execute; 401/403/429 abort the batch, other failures are per-membererrorrows.campaigns.create_draft(write):POST /campaigns(type:"regular",recipients.list_id, subject, preview text, title, sender) thenPUT /campaigns/{id}/contentwith the HTML. IffromName/replyToare missing the audience'scampaign_defaultssupply them. Nothing is sent.campaigns.send(destructive): requires the campaign statussave(draft) andGET /campaigns/{id}/send-checklistis_ready:true, thenPOST /campaigns/{id}/actions/send, or.../actions/schedulewithschedule_timewhenscheduleAtis given. Mailchimp only accepts schedule times on the quarter hour (:00, :15, :30, :45), which Fondoo validates up front.
Vendor-native capabilities: members.get (by email), members.set_tags (add/remove), tags.list (tag-search), campaigns.list, campaigns.get.
Not implemented: member delete/archive (permanent delete cannot be undone), merge-field and interest-group writes, segments, automations, e-commerce, transactional (Mandrill).
API endpoints used
- Ping:
GET /ping: https://mailchimp.com/developer/marketing/api/root/ping/ - Lists:
GET /lists,GET /lists/{id}: https://mailchimp.com/developer/marketing/api/lists/ - Members:
GET /lists/{id}/members,PUT /lists/{id}/members/{hash}: https://mailchimp.com/developer/marketing/api/list-members/add-or-update-list-member/ ;PATCH: https://mailchimp.com/developer/marketing/api/list-members/update-list-member/ - Member tags:
POST /lists/{id}/members/{hash}/tags: https://mailchimp.com/developer/marketing/api/list-member-tags/add-or-remove-member-tags/ ;GET /lists/{id}/tag-search: https://mailchimp.com/developer/marketing/api/list-tags/search-for-tags-on-a-list-by-name/ - Campaigns:
POST /campaigns,PUT /campaigns/{id}/content,GET /campaigns/{id}/send-checklist,POST /campaigns/{id}/actions/send|schedule: https://mailchimp.com/developer/marketing/api/campaigns/ , https://mailchimp.com/developer/marketing/api/campaign-content/ , https://mailchimp.com/developer/marketing/api/campaigns/send-campaign/ , https://mailchimp.com/developer/marketing/api/campaigns/schedule-campaign/ - Limits and data centers: https://mailchimp.com/developer/marketing/docs/fundamentals/
Limits and uncertainties
- Rate limit: Mailchimp documents 10 simultaneous connections per user; Fondoo issues requests sequentially and budgets 10 executes per minute. 429 surfaces as
rate_limited. - Verified from the Add-or-update-member page:
status_if_newis required for new addresses andstatusis optional. Not documented there and therefore uncertain: that omittingstatusleaves an existing unsubscribed/cleaned member untouched (this is the documented upsert semantic, but it is not stated explicitly); the responsestatuscheck is a second line of defence either way. Mailchimp also refuses to re-subscribe members in a compliance state through the API, which would surface as a per-membererror. - Uncertain: exact
send-checklistandscheduleresponse shapes beyondis_readyand the 204 on success; the schedule endpoint is documented to require quarter-hour times, and free plans cannot schedule. - Uncertain: whether
fields=filtering onGET /lists/{id}/membersalways returnstotal_items(used for the next-page decision; without it Fondoo pages until a short page). - Merge tags: campaign HTML uses
*|UNSUB|*, Mailchimp's unsubscribe merge tag. Mailchimp rejects sending a campaign without its required footer content for the audience.
