Platform ·DarDev Team · 5 min read

CRM-driven product lists without spamming cold leads

Syncing CRM segments to email lists is powerful and risky. How DarDev maps Twenty CRM tags to Listmonk only after explicit opt-in—not on import.

CRM and email list sync workflow diagram concept

Importing a CRM CSV into your email tool and hitting Send is how startups lose domain reputation and create compliance debt. DarDev runs Twenty CRM and Listmonk with an explicit rule: cold outreach prospects live in CRM only until they opt in to a product list.

This guide documents the pattern behind our sync worker on dardev-vps—not a product you install verbatim, but architecture you can replicate with consent gates that lawyers and customers understand.

Two buckets: CRM prospects vs marketing lists

  • CRM (Twenty): research, segmentation, sales follow-up, consent fields, API imports
  • Listmonk: product newsletters and opted-in updates only
  • Never auto-subscribe CRM imports to Listmonk on create
  • Webhook or worker promotes contact when opt-in condition becomes true

PRODUCT_LIST_MAP pattern

We map CRM attributes to Listmonk list IDs via environment configuration: Hesabi interest, DarDevLab cohort tags, EscaHire waitlist (waitlist—not GA campaigns). One contact can belong to multiple lists after separate consents; removing consent should remove or suppress list membership.

The sync worker listens for Twenty webhooks (contact updated, tag changed) and applies idempotent updates—duplicate events must not double-subscribe or thrash list membership.

Opt-in sources we honor

  1. Double opt-in subscribe forms on news.dardev.net
  2. Explicit consentEmail or productInterest fields set in CRM after sales call
  3. In-app Hesabi signup marketing checkbox where legally valid
  4. Not: purchased list, scraped emails, or import default true

Operational checks before campaigns

Operators hit /api/news/health and Listmonk stats; verify bounce rate baseline; spot-check random contacts for consent provenance. Cold OECT or Startup Tunisia imports stay in CRM views for manual outreach—not Listmonk blasts.

CRM to Listmonk sync with opt-in gate
CRM is relationship truth; Listmonk is consented audience delivery.

Failure modes

  • Webhook secret rotation without worker update—silent sync stop
  • Tag typo maps 500 contacts to wrong product list
  • Manual Listmonk import bypassing CRM consent audit
  • Reusing cold segment for launch announcement under deadline pressure

Document rollback: disable campaign, export affected subscribers, reconcile CRM consent fields, postmortem with sales and ops.

DarDev Services can implement similar stacks for clients—scope includes consent model design, not just connector code.

Webhook and idempotency design

Twenty emits duplicate contact.updated events during bulk imports. The worker stores last-processed state per contact and list pair—replays update Listmonk idempotently instead of sending duplicate subscribe API calls that trigger double confirmation emails.

Health endpoint returns sync lag metrics: oldest unprocessed webhook timestamp. Campaign operators check this before scheduling ten-thousand-recipient sends.

List hygiene and unsubscribes

Unsubscribe in Listmonk must propagate back to CRM consent fields—or you re-import the contact next week and violate expectations. We prefer CRM as write path for consent changes that marketing must respect.

Bounce handling stays in Listmonk with Stalwart logs cross-checked. High hard-bounce rates on a product list trigger CRM review of import source before next campaign.

Segmentation without spam

CRM views filter OECT accountants, Startup Tunisia founders, and DarDev Services prospects for sales sequences—human email or LinkedIn, not Listmonk bulk. Product lists remain narrow: Hesabi updates, Lab cohort announcements, EscaHire waitlist notes.

Tag naming conventions live in operator docs—Hesabi-Interest vs Hesabi-Customer vs cold-import prevents PRODUCT_LIST_MAP misroutes that subscribe wrong audiences.

See inside-unified-mailer-stack for full stack topology and DNS on send.dardev.net.

Audit trail for compliance questions

When a prospect asks how they got on a Hesabi newsletter, operators trace CRM consent timestamp, form source URL, and Listmonk subscription record. Without that chain, GDPR-style requests become guesswork.

Export playbooks define CSV fields for legal review—never email full CRM dumps to personal inboxes.

Testing sync changes uses staging Twenty workspace and disposable Listmonk lists before touching production Hesabi or Lab audiences.

Cold outreach and product marketing share infrastructure but not permission models—architecture enforces the distinction operators might skip under pressure.

Quarterly reviews reconcile PRODUCT_LIST_MAP entries with actual product launches—stale list IDs cause silent drops when EscaHire or Lab cohort names change.

Consent-first CRM-to-mailer design scales better than apologizing after a bulk send to imported prospects.

Train sales to set consent fields during CRM entry—not after campaign deadline when someone proposes just this once import to Listmonk.

Dashboard widgets in Twenty show outreach segments; they never replace Listmonk unsubscribe links and bounce reports in pre-send checklist.

Implementers cloning this pattern should copy consent rules before copying Docker Compose—legal and reputation risk dominates integration effort.

Read deployed-realities-explained next for the full dardev-vps reference stack including Stalwart and sync worker health checks.

New operators shadow one campaign end-to-end—CRM tag change, webhook log line, Listmonk subscriber count—before solo send authority.

Document every PRODUCT_LIST_MAP change in git commit messages so future you knows why a list ID exists.

Never bulk-delete Listmonk lists without CRM audit—orphaned contacts re-import with stale consent assumptions on the next CSV upload.

Sync worker logs belong in your central retention policy alongside CRM audit exports.

Can we email CRM imports for one announcement?

Only with prior valid consent for that channel. Launch urgency is not a legal or reputation strategy.

Twenty native email enough?

Twenty holds CRM data; Listmonk handles campaign volume, templates, and deliverability tooling we need.

GDPR and Tunisia?

Consult counsel for your market; architecturally, prove consent provenance per contact.

EscaHire waitlist emails?

Waitlist updates only to people who joined waitlist—no cold recruitment blasts.

Open source components?

Twenty and Listmonk are open source; sync logic is custom DarDev code.

Get company news

Releases and announcements — confirm from your inbox.

Subscribe to updates