Double opt-in means a subscriber confirms intent twice: first by submitting an email address, then by clicking a link in a confirmation message before they receive campaigns. At DarDev, every public marketing list and the news.dardev.net subscribe form use this pattern through Listmonk, with confirmation and campaign mail sent from send.dardev.net—not the corporate @dardev.net inbox domain.
We dogfood this on our own Unified Mailer stack (Twenty CRM, Listmonk, Stalwart MTA). If a flow cannot prove consent, it does not get a Listmonk list membership. Cold outreach imports stay in CRM until someone explicitly opts in—a rule we document separately in our CRM-driven product lists guide.
Public vs private lists in Listmonk
Listmonk distinguishes list types by how subscribers join. Public lists require double opt-in: the person submits a form, Listmonk creates a pending subscriber, and only after they click the confirmation link does status change to confirmed. Private lists skip the public confirmation step because membership is assigned by trusted systems—our sync worker adds contacts when CRM tags like product:hesabi:news appear after a product signup checkbox or sales handoff.
- Public + double opt-in: product marketing lists, EscaHire waitlist, DarDev Company News
- Private + CRM/sync: per-product news lists (DarDevLab News, Hesabi News)
- Internal: staff announcements—manual import only
How news.dardev.net subscribe works
The static news site exposes POST /api/news/subscribe, proxied to our sync worker on dardev-vps. The handler validates the email, rejects honeypot submissions (hidden _website field), and calls Listmonk POST /api/public/subscription with the DarDev Company News list UUID. Listmonk queues a confirmation email through Stalwart SMTP. The API responds with a friendly message: check your inbox and confirm—because until that click, the address is not campaign-eligible.
The same Company News list is also reachable at mail.dardev.net/subscribe/dardev-news.html for visitors who land on the Listmonk-hosted form hub instead of an article footer. Both paths hit the same Listmonk list and the same double opt-in behavior.
Marketing subscribe hub
Product marketing interest forms live at mail.dardev.net/subscribe/—DarDevLab, Hesabi, EscaHire waitlist, Workspace, DarDevCDE, DarDevOps, and Observability each have a dedicated HTML form. All are public Listmonk lists with double opt-in. A prospect who wants Hesabi promos uses the Hesabi marketing form; a paying customer who only wants release notes gets product:hesabi:news in Twenty CRM instead, which syncs to the private Hesabi News list without a second marketing opt-in unless they also want promos.
That split keeps cold CRM imports out of Listmonk until explicit opt-in. See inside-unified-mailer-stack and self-hosted-email-vs-saas for architecture context.
Consent and GDPR-aligned practice
We are operators, not lawyers. For EU and UK readers, double opt-in is widely used to demonstrate that an address owner actively confirmed subscription—useful evidence under GDPR and ePrivacy when challenged. For Tunisian B2B outreach, explicit opt-in also protects SMTP reputation: mailbox providers treat unsolicited bulk mail harshly regardless of jurisdiction.
We log subscription source, include unsubscribe links in templates, sync Listmonk unsubscribes to CRM notes, and keep product signup separate from marketing opt-in unless a checkbox or form says otherwise.
Operator checklist
- Verify SMTP before promoting forms
Listmonk confirmation mail must exit through Stalwart on send.dardev.net. If subscribe returns a mail delivery error, fix SMTP before linking forms in production footers.
- Wire NEWS_LIST_UUID
Run wire-news-forms.sh so news.dardev.net and sync-worker share the Company News list UUID. Health endpoint subscribe: true confirms configuration.
- Classify each new list
Public for prospect-facing opt-in; private for CRM-driven news; internal for staff only. Misclassified lists are a compliance and deliverability incident waiting to happen.
- Test the full loop
Submit a test address, receive confirmation, click through, confirm Listmonk shows confirmed status, then send a test campaign from noreply@send.dardev.net.
- Monitor bounces and pending counts
High pending-without-confirm rates often mean confirmation mail in spam or broken DNS on the sending subdomain.
Common mistakes
- Importing CRM CSVs directly into Listmonk marketing lists
- Using @dardev.net From addresses in campaigns or confirmations
- Treating product signup as marketing consent without a checkbox
- Single opt-in on public forms to inflate subscriber counts
- Ignoring Listmonk unsubscribes when updating CRM segments

What happens after confirmation
Once confirmed, the subscriber receives Company News or product marketing campaigns according to list membership. The sync worker may later attach CRM tags if the same email appears in Twenty—merge logic adds list IDs from tags without stripping other consented lists. Unsubscribe in Listmonk triggers a CRM note so sales and support see the preference change.
Contact form submissions create CRM records only—they do not add Listmonk membership. Newsletter opt-in always goes through the subscribe flow.
What is double opt-in in our stack?
Subscriber submits email on a public form or news.dardev.net API → Listmonk sends confirmation from send.dardev.net → click confirms → status becomes eligible for campaigns. Pending addresses do not receive bulk mail.
Does the news site subscribe API skip confirmation?
No. It calls the same Listmonk public subscription endpoint as mail.dardev.net forms. Users always get a confirmation email when SMTP is healthy.
When can we add someone without double opt-in?
Private news lists only, when CRM tags reflect an explicit product-updates choice (signup checkbox, contract, or documented sales consent)—not cold import. Marketing lists always use public double opt-in forms.
Why send.dardev.net instead of @dardev.net?
Root domain mail is inbound on Zoho. Outbound marketing and confirmations use a dedicated subdomain with aligned SPF/DKIM/DMARC and PTR to mta.dardev.net—standard split-DNS practice for deliverability.
Subscribe works but no confirmation email arrives?
Usually SMTP or DNS on send.dardev.net. Check Listmonk SMTP settings, Stalwart queue logs on dardev-vps, and spam folder. sync-worker health must show subscribe: true with NEWS_LIST_UUID configured.



