Marketing automation: Mailchimp, HubSpot, ActiveCampaign and Brevo
Sync CRM Contacts with your Mailchimp, HubSpot, ActiveCampaign or Brevo list/audience and receive subscriptions and unsubscribes back (BYO model, so the account is yours).
The Marketing automation integration uses YOUR Mailchimp, HubSpot, ActiveCampaign or Brevo account (BYO model: you bring your own account). CRM Contacts are added/updated in your list/audience (sync by email, idempotent), and subscribe/unsubscribe events come back to the CRM updating the Contact's marketing status. There is no cost, margin or intermediation on our side: the data goes straight to your account and comes back from it.
The integration starts inert: nothing happens until you fill in the credentials and activate. All secrets (API keys, tokens, client secret) are stored encrypted in the CRM and are never displayed back. Each platform has its own card in Settings β Integrations; the webhook URL is unique (/api/inbound/marketing/β¦) and the CRM knows which platform it is by the URL token.
Prerequisites
- A Mailchimp, HubSpot or ActiveCampaign account with administrator access to generate API keys/tokens and create webhooks.
- Mailchimp: the server prefix (e.g., us21), the Audience ID and an API key (Account β Extras β API keys).
- HubSpot: a private app (Settings β Integrations β Private Apps) with the scopes crm.objects.contacts.read/write. ActiveCampaign: the API URL and the API key (Settings β Developer).
- Brevo (formerly Sendinblue): an API key (SMTP & API β API Keys) and, if you want to add contacts to a list, the numeric list ID (Contacts β Lists).
- In Sellio, administrator access to save the credentials and activate the integration in Settings β Integrations.
What is synced
- Outbound (CRM β provider): each Contact with an email is sent as a member/contact of your list/audience. The upsert is idempotent by email, so resending does not duplicate (Mailchimp uses the MD5 hash of the email; HubSpot upserts by idProperty=email; ActiveCampaign uses /contact/sync; Brevo uses POST /v3/contacts with updateEnabled). First name, last name and phone go along. On Brevo you also choose which attribute each Sellio field maps to (field mapping).
- In Brevo, you can also send each contact to the LIST that matches their customer group instead of sending everyone to the same list: tell us which contact field holds the group and write one rule per line, in the format group = list. Any group without a rule goes to the default list, so nobody is left out because of a missing setting.
- Inbound (provider β CRM): when someone subscribes or unsubscribes, the webhook updates the corresponding Contact in the CRM (marketing_status and email_opt_in fields on the record), matching by email. If the email does not exist in the CRM, the event is ignored (nothing is created).
- Real time: as soon as you create or edit a Contact in the CRM, it is synced automatically to every active marketing connector (Mailchimp, ActiveCampaign, HubSpot and Brevo), without waiting for the batch. It is best-effort and only runs when at least one connector is active.
- The "Sync contacts" button on the card sends the CRM Contacts in bulk (best-effort, up to 200 at a time), handy for the first load or for reprocessing your contacts.
Mailchimp
- Open Settings β Integrations and find the "Marketing (Mailchimp)" card.
- Fill in the server prefix (e.g., us21, the part after the dash in your API key and in the dashboard address), the Audience ID (Audience β Settings β Audience ID) and the API key (Account β Extras β API keys). Click "Save credentials".
- Copy the "Webhook URL".
- In Mailchimp β Audience β Settings β Webhooks, create a webhook pointing to that URL and check the subscribe and unsubscribe events. Mailchimp does not sign webhooks: security is the unpredictable URL token, so treat it as secret.
- Return to the CRM and click "Activate". Use "Sync contacts" for the first bulk send.
HubSpot
- In the CRM, find the "Marketing (HubSpot)" card.
- Create a private app in Settings β Integrations β Private Apps with the scopes crm.objects.contacts.read and .write; paste the Access token into the "Private app token" field. Optionally, enter the Client secret of a HubSpot app to verify the webhook signature. Click "Save credentials".
- Copy the "Webhook URL".
- Configure a workflow webhook (or app webhook) in HubSpot that POSTs (JSON) to that URL including the contact email and the marketing status. If you entered the Client secret, HubSpot signs each call (X-HubSpot-Signature); otherwise, the URL token is the guard.
- Return to the CRM and click "Activate".
ActiveCampaign
- In the CRM, find the "Marketing (ActiveCampaign)" card.
- Fill in the API URL and the API key (both in Settings β Developer β API Access). Click "Save credentials".
- Copy the "Webhook URL".
- In ActiveCampaign β Settings β Manage Webhooks, create a webhook pointing to that URL and check the subscribe and unsubscribe events. ActiveCampaign does not sign webhooks: security is the unpredictable URL token, so treat it as secret.
- Return to the CRM and click "Activate".
Brevo (formerly Sendinblue)
- In the CRM, find the "Marketing (Brevo)" card.
- In Brevo, generate an API key in SMTP & API β API Keys (or via the account gear β SMTP & API). Copy the key.
- Back in Sellio, paste the key into the "API key" field. If you want to add contacts to a list, enter the numeric list ID (the number shows in the list URL under Contacts β Lists); leave it blank to only create/update the contact.
- Under "Field mapping", link each Sellio Contact field to the matching Brevo attribute (uppercase). Defaults are FIRSTNAME, LASTNAME, SMS (phone) and COMPANY (company). Leave blank to use the default. Create any custom attributes first in Contacts β Settings β Contact attributes, otherwise Brevo ignores an attribute that does not exist. Click "Save credentials".
- Copy the "Webhook URL".
- In Brevo β Settings β Webhooks, create a Marketing webhook pointing to that URL and check the unsubscribe event. Brevo does not sign webhooks: security is the unpredictable URL token, so treat it as secret.
- Return to the CRM and click "Activate". Use "Sync contacts" for the first bulk send.
Treat the webhook URLs and the credentials as secret. Where Mailchimp/ActiveCampaign do not sign the calls, security lies in the unpredictable URL token (the same model as website forms); on HubSpot, enter the Client secret to require the signature. If you try to activate without the necessary credentials, the integration stays inert, and nothing is synced until everything is in place.
How to test
- Outbound: click "Sync contacts" on the card and check in your provider's list/audience that the Contacts with an email appeared (without duplicating).
- Inbound: subscribe/unsubscribe a test email that already exists as a Contact in the CRM and confirm that the Contact's marketing_status and email_opt_in fields were updated.
- Resend the same contact and the same event and confirm the final state is the same (idempotency).
Troubleshooting
- Mailchimp 401/server error: the server prefix (e.g., us21) must match your account's; also check the Audience ID and the API key.
- HubSpot 401: the Private app token is wrong or missing the scopes crm.objects.contacts.read/write. Recreate the private app with the scopes and re-paste the token.
- ActiveCampaign 401: check the API URL and the API key (Settings β Developer β API Access), both from the same account.
- Brevo 401/403: the API key is wrong or was revoked. Generate a new one in SMTP & API β API Keys and re-paste. If an attribute does not show up on the Brevo contact, create it first in Contacts β Settings β Contact attributes (Brevo ignores attributes that do not exist). If the contact does not join the list, check the numeric list ID.
- Inbound does not update the Contact: if the event email does not exist in the CRM, nothing is created (by design). Register the Contact first. Confirm the webhook points to the "Webhook URL" and checks subscribe/unsubscribe.
- HubSpot: invalid signature: if you entered the Client secret, the X-HubSpot-Signature header must match. Otherwise, remove the secret and rely on the URL token.