🔗 Non-Profit Integration

Data for Good Calgary — HubSpot to Mautic Migration

Data for Good Calgary

Challenge

A volunteer-run non-profit was paying for a commercial marketing platform while using only a fraction of it. The subscription covered a full CRM suite, but the chapter's actual usage was a couple of public web forms, an occasional newsletter, and consent tracking — the relationship-management side of the product sat entirely unused. For an organization running on donated time and a minimal budget, the recurring cost was hard to justify against what it delivered.

Solution

Inventoried the live account through its API to establish what was genuinely in use rather than what had been bought, then migrated the marketing-automation function to self-hosted Mautic — the open-source equivalent that covers public forms and CASL-compliant double opt-in without a paid tier. Contacts, custom fields, forms and email templates were migrated with their consent state and lifecycle classification intact, the forms were rebuilt in the chapter's brand, and outbound mail was routed through OCI Email Delivery.

Results

  • Recurring subscription cost eliminated
  • Contacts and consent state migrated without loss
  • Branded public forms embedded in the chapter website
  • CASL compliance preserved end to end
Mautic HubSpot WordPress CASL OCI Email Delivery Migration

The brief started as “replace HubSpot” and the first useful thing to do was set it aside. Before choosing a replacement, we pulled an inventory of the live account through its API to find out what the chapter actually used.

The answer was narrow. A small number of public web forms, an occasional newsletter, basic segmentation, and CASL double opt-in. No deals, no tickets, no sales pipeline — the relationship-management half of the platform was empty, because that work already lived in the chapter’s Oracle volunteer platform. What they were paying a subscription for was, in practice, a mailing tool.

That reframed the decision. An open-source CRM was considered and rejected on a specific point: its free tier cannot do public web forms or native double opt-in, which are precisely the two features in use. Mautic covers both, so it won.

Auditing before migrating

The inventory did more than justify the tool choice. It also surfaced a sync between the chapter’s Oracle platform and the marketing platform that had stopped running some time earlier — meaning the contact list everyone trusted was quietly out of date.

That was fixed and reconciled before the migration snapshot was taken. Migrating first would have carried the gap into the new system and made it permanent. Auditing the source before moving it is not optional; a migration faithfully reproduces whatever problems it finds.

Migration

Mautic runs in Docker Compose on OCI compute behind the chapter’s existing load balancer, with a Let’s Encrypt certificate and automated renewal.

MigratedApproach
ContactsMoved with source tagging so origin stays traceable
Custom fieldsMapped to proper field types rather than dumped as text
Public formsRebuilt in the chapter’s brand with consent and captcha
Email templatesImported unpublished, so nothing could send accidentally
Consent stateDo-not-contact status and lifecycle stage carried across

Contacts were classified on the way in using the source platform’s own lifecycle data — volunteers, subscribers, and a third group with no recorded legal basis for contact. That last group was explicitly marked do-not-contact until they opt in through a form. It is the cautious reading of CASL, and the right default when the evidence of consent is missing.

Every migration script is idempotent and re-runnable, which is what made it safe to iterate against live data instead of attempting a single irreversible cutover.

Brand and integration

The forms embed into the chapter’s WordPress site at calgary.dataforgood.ca, styled to match the site rather than looking like a bolted-on third-party widget — chapter palette, typography and wordmark inside the form wrapper.

One class of bug is worth recording, because it is invisible to the people who report it. Forms embedded on the HTTPS site silently failed to load because the platform’s configured base URL was HTTP, so the browser blocked the form script as mixed content. The form rendered as nothing at all, with no error a non-technical user could act on or describe.

Submissions now auto-tag by type, notify the team through branded emails, and land in segments that drive campaigns. Outbound mail goes through OCI Email Delivery with DKIM.

Live at dfgcrm.dataforgood.ca. Part of a three-piece engagement with the volunteer platform and the cloud infrastructure.

Ready to Build Something Similar?

Let's discuss how we can bring the same expertise to your organization.

Start a Conversation