Integrations
Import from Mautic
CampaignOS can import a Mautic 5 instance into a workspace: Settings → Integrations → Import from Mautic. Enter the Mautic URL and a user with API access (basic authentication must be enabled in Mautic → Configuration → API Settings). Credentials are used for the request only and are never stored.
Preview reads from Mautic and shows what would be created, updated or skipped, with per-item warnings. Import applies the same plan.
What is imported
| Mautic | CampaignOS | Notes |
|---|---|---|
| Segments | Segments | Segments without filters become static segments; filtered segments become dynamic with a best-effort rule mapping (language → locale, points → score, date_added → created date, tags, custom fields → attributes). Do-not-contact filters are dropped because consent is enforced automatically. |
| Emails | Email templates | Translations are grouped into one template per parent email (parent language = default locale). Tokens are rewritten: {contactfield=firstname} → {{contact.firstName}}, {unsubscribe_url} → {{unsubscribeUrl}}, webview links are removed. |
| Campaigns | Automation campaigns (draft) | Segment sources become a Segment Entry trigger; interval delays become Wait steps; send email, tag, segment, points, field, DNC, owner, stage, webhook and jump actions are mapped; field/segment/tag/points conditions and email open/click, form submit and page hit decisions are mapped. Unsupported events are skipped with a warning. With Only remove tags after an email if the contact opened that email (on by default), a tag change that removes tags after an email gets an “Opened …?” condition: contacts who opened get the tag changes, the rest skip them and continue. |
| Forms | Forms | Fields are mapped to text, email, tel, number, select, checkbox and textarea. Form actions are not imported. |
| Contacts | Contacts | Migrated separately, see below. |
Re-running the import is safe: entities are matched by name and unchanged items are skipped. Templates and segments are updated in place. Campaign workflows are replaced only while the campaign is still a draft and has not been edited in CampaignOS since the last import (enable Overwrite campaigns edited in CampaignOS to force it). After a Preview you can pick which campaigns to import.
Migrate contacts from Mautic
Settings → Integrations → Migrate contacts copies every Mautic contact into the workspace in short, resumable steps, then adds contacts to the matching static segments.
- Contacts are matched by email, so running the migration again updates instead of duplicating. Contacts without an email address are skipped.
- Copied: first and last name, phone,
external_id(as the contact’s external ID), language (as locale), points (as score), tags, every other contact field (as attributes, plusmauticId), the original created date, and email consent (a Mautic email do-not-contact becomes an opted-out email consent with the reason). - Automation paused (recommended, on by default): new contacts are created with automation paused, so they never enter or continue a campaign, not even when they join a segment, trigger an event, or a campaign is activated with existing members. Resume them from the Contacts page (per reason, per selection or per contact), from a segment’s Members tab, or with the Resume automation button in the migration panel.
- Progress is saved in the browser; you can pause, close the page and resume. For very large instances run it from a terminal instead:
WORKSPACE_ID=... MAUTIC_URL=https://mautic.example.com MAUTIC_USERNAME=... MAUTIC_PASSWORD=... \
pnpm mautic:migrate-contacts # resumes from .mautic-migration-<workspaceId>.json
# --restart to start from the first contact, --no-pause to leave automation activeA migration of about 145,000 contacts takes roughly 13 minutes.
POST /api/workspaces/{workspaceId}/integrations/mautic/contacts
Runs one step (up to about 40 seconds) and returns the next cursor. Call it again with cursor until done is true.
{
"baseUrl": "https://mautic.example.com",
"username": "api-user",
"password": "secret",
"cursor": { "phase": "contacts", "contactsOffset": 0, "segmentIndex": 0, "segmentOffset": 0 },
"pauseAutomation": true
}Pausing automation for contacts
POST /api/workspaces/{workspaceId}/contacts/automation (ADMIN) pauses or resumes automation in bulk:
{ "action": "resume", "reason": "mautic-migration" }
{ "action": "resume", "segmentId": "..." }
{ "action": "pause", "contactIds": ["..."] }GET on the same path returns { "paused": 1480, "byReason": [{ "reason": "mautic-migration", "count": 1480 }] }. A single contact can be changed with PATCH /contacts/{contactId} and { "automationPaused": false }, and the contacts list accepts ?automationPaused=true|false.
API
Both endpoints require the ADMIN role.
POST /api/workspaces/{workspaceId}/integrations/mautic/preview
POST /api/workspaces/{workspaceId}/integrations/mautic/import
{
"baseUrl": "https://mautic.example.com",
"username": "api-user",
"password": "secret",
"include": { "segments": true, "templates": true, "campaigns": true, "forms": true, "contacts": false },
"campaignIds": [13, 14],
"gateTagRemovalOnOpen": true,
"overwriteModified": false
}Response:
{
"mode": "preview",
"segments": [{ "mauticId": 3, "name": "SIGN_UP", "action": "create", "warnings": [] }],
"templates": [{ "mauticId": 1, "name": "1st email", "action": "create", "locales": ["pt", "de", "en"], "warnings": [] }],
"campaigns": [{ "mauticId": 4, "name": "Welcome Flow", "action": "create", "nodeCount": 10, "warnings": [] }],
"forms": [],
"warnings": ["Imported campaigns are created as drafts; review and activate them manually"],
"errors": []
}