shouldivibecodeit

Should I vibe codeAudienceful?

Newsletter publishing, audience CRM, segmentation, forms, and automations

An automation is a program that emails strangers while you sleep. Build the kill switch before the send button.

?

Their verdict, the Essentials price and the build-time estimate come from their entry, MIT-licensed. Checked 2026-08-04.

Can you build it?asked by canivibecodeit.com ↗KINDAweekend project · multi-day
?

Our verdict, the regret score and everything below it. Editorial and unsponsored — nobody can pay to be moved.

Should you ship it?asked by usABSOLUTELY NOTthe thing you break isn’t code.

The honest answer

why the verdict is what it is

Everything the other bulk-email entries say about sender reputation applies here and is not the interesting part. Audienceful's actual shape is two products welded together, and both halves are worse than a broadcast tool. The automation half means email leaves your infrastructure with nobody at the keyboard: a journey is a state machine, and the state machine an agent generates has no idempotency key, no per-contact send ledger and no global rate ceiling, so a retried webhook or a tag that flips twice does not produce a bug report, it produces forty messages to a real person overnight. The CRM half means you are not storing addresses, you are storing a behavioural profile — every open, every click, arbitrary custom fields, notes your colleague typed about someone — and when that person exercises their right of access, the honest answer is a two-year dossier they never knew existed. A broadcast tool fails once, loudly, on Tuesday at 10am. An automation platform fails continuously, quietly, at 4am, and keeps going until you find the off switch you never built.

What actually breaks

not "if". the specific failures.

  • The automation loop, which is this product's signature failure: a journey whose entry condition is a tag, an action that sets a tag, and no per-contact per-step send record, so the same person re-enters and receives step three until someone notices
  • Retries, because the queue delivers at-least-once and the send step is not idempotent, so a redeploy in the middle of a run mails the first eight hundred people twice
  • The absence of a global send ceiling, which is the one control that turns a runaway journey from an incident into a paused job
  • Consent you cannot evidence per address, which is the burden Article 7 puts on you and not on the subscriber, and which an imported CSV carries none of
  • The subject access request, because a newsletter-CRM holds open and click history, arbitrary custom fields and free-text notes — and Article 15 means handing over all of it, including the note
  • Erasure, which has to reach the events table, the segment caches, the queued journey steps and the analytics rollups, not just the contacts row
  • The unsubscribe endpoint, which must work without a login, be honoured within ten business days, and which returns a 500 in silence the first time you rotate a signing key
  • Segments, which are queries — an off-by-one in a filter is not a wrong page of results, it is the wrong four thousand people receiving a message written for a different audience
  • The public signup form with no double opt-in, which lets one script subscribe ten thousand strangers and makes your confirmation mail the spam
  • Your sending domain, which also carries the password resets and the receipts, and which does not come back on a timescale you control
and then, at 3am

The welcome journey had five steps and had been running fine since March. Then you added a re-engagement automation whose entry condition was the tag `inactive`, and whose final step removed it — except a nightly job elsewhere recomputed activity and set the tag back for anyone with no opens in thirty days. The two systems started handing the tag back and forth, and because each journey run recorded its progress in memory rather than as a per-contact per-step row, every pass looked like a first pass. It ran for six hours. Eleven hundred people got the same four emails somewhere between nine and forty times each, all between 1am and 7am, and the first evidence you have is a phone that will not stop buzzing and a reply that just says "stop". By the time you find the loop, the complaint rate has already crossed a threshold at one large provider and attached itself to your domain, and the unsubscribes you are frantically processing by hand are the polite half of the response.

Is that you?

the verdict is a default, not a law

ship it if
  • The recipients are you and a handful of colleagues who asked, from an address they already recognise
  • It is transactional — a receipt, a reset, a notification triggered by the recipient's own action — on a domain that sends nothing else
  • A provider owns deliverability, suppression, bounce handling and the unsubscribe endpoint, and your code only composes and schedules
  • There are no automations at all: a human presses send, reads the recipient count, and is awake when it goes out
don’t ship it if
  • Any message can be sent without a person in the room, and you have not built a pause-everything switch you can hit from your phone
  • There is no per-contact, per-step send ledger that makes a second delivery of the same step impossible
  • The list came from anywhere other than a form where the person typed their own address and then confirmed it
  • You cannot produce, for one named subscriber, everything you hold about them and everything you have sent them
  • Marketing and transactional mail leave from the same domain
  • Suppression is checked when a segment is built rather than at the moment each message is handed to the provider

If you build it anyway

the checklist, then the prompt that enforces it

  1. Do not own the send. Use a provider whose product is suppression, bounce processing, feedback loops and the unsubscribe endpoint, and keep your code to composing and scheduling.
  2. Build the kill switch first: one flag, checked immediately before every single delivery, that stops all sending everywhere. Test it under load before you write a single automation.
  3. Give every send an idempotency key of contact plus campaign plus step, written to the database before delivery and enforced by a unique constraint. This is the difference between a loop being a bug and a loop being an incident.
  4. Put a hard global ceiling on messages per hour with an automatic pause on breach. A runaway journey that stops itself at five hundred is recoverable; one that runs for six hours is not.
  5. Never let an automation's action set state that any automation's entry condition reads. If you must, add a per-contact lifetime cap per journey and refuse to send past it.
  6. Store consent as data rather than as membership: timestamp, source URL, IP and the exact wording shown. Double opt-in on every path, including import.
  7. Design the CRM half around erasure from day one. One documented function that deletes a person everywhere — contacts, events, queued steps, segment caches, analytics — and a test that asserts nothing survives.
  8. Check suppression per address at the instant of send, not when the segment was computed. Segments go stale in the minutes between build and delivery.
  9. Separate subdomains and DKIM keys for marketing and transactional mail, so burning one does not take the other with it.
  10. Send to yourself, then ten, then a hundred, with a manual gate between stages. There is no undo and the blast radius is measured in thousands.
the guardrail prompt
I am building a newsletter tool with a contact CRM, segments, public signup forms and
automated journeys. Automations are the dangerous part: they send mail with nobody
watching. Refuse the fun half until the safety half exists.

1. First tell me what I am taking on: CAN-SPAM applies per message, GDPR Art. 7 puts
   the burden of proving consent on me, Art. 15 lets a subscriber demand everything I
   hold, and sending reputation attaches to my domain permanently.
2. Build the global kill switch before anything sends: one flag, read immediately
   before every delivery, halting everything. Test that it stops an in-flight run.
3. Then the send ledger — a unique row per contact per campaign per step, written
   before delivery and enforced by a constraint. No path sends without one. This is
   what makes a retry, a redeploy or an automation loop harmless.
4. Then a hard rate ceiling per hour and per journey, pausing automatically on breach.
5. Then the unsubscribe path — signed, non-guessable, works without a login,
   idempotent, survives a key rotation — plus suppression enforced per address at
   the moment of send, never when a segment is built.
6. Then consent records: timestamp, source URL, IP, exact wording shown, double
   opt-in on every path. Refuse to build an import that marks addresses consented;
   imports land pending until the person clicks.
7. Only now, automations. Every journey gets a per-contact lifetime step cap, and no
   journey's action may write state that any journey's entry condition reads. Say
   out loud why when I ask for it anyway.
8. For the CRM half, write one erasure function covering contacts, events, queued
   steps, segment caches and analytics, with a test asserting nothing survives.
   Build it before the profile page.
9. Use an established sending provider; its suppression list and feedback loops are
   the product. SPF, DKIM and DMARC on a marketing subdomain, separate from my
   transactional mail.
10. Stage every broadcast — me, ten, a hundred, the rest — with confirmation between
    stages. Then write "Obligations I have taken on" in the README and tell me
    honestly that paying for this is the right call.
paste this before you build — not after something breaks31 lines · 2187 chars

That one keeps you out of trouble. For the prompt that actually builds it, canivibecodeit.com has one.

their build prompt ↗

Or don’t build it

the boring option, and the way back out

just pay for it

Immediately, and the monthly figure is not the comparison. CAN-SPAM is priced per message, a subject access request has a one-month clock on it, and the sending reputation of your primary domain cannot be purchased back at any price. What the subscription buys is a company whose whole business is staying on the right side of five inbox providers, plus an automation engine that has already had its loop bugs found by someone else's subscribers. Start on the free tier at 1,000 contacts and spend your weekend on the newsletter instead of the sender.

$29/mo is cheaper than your weekend.

your exit plan, if you already built it

Three things are the asset and none of them is the editor: the contact list, the per-address consent record, and the suppression list. Keep all three exportable from the first commit, because if you have to move to a real provider mid-incident, the consent record is what lets you import without warming a reputation from zero and the suppression list is what stops you re-mailing everyone who already complained. Add a fourth for the CRM half: the per-contact event history, which is both the thing you will want in the new tool and the thing you are obliged to be able to hand to a subscriber who asks. And before you switch anything off, drain or cancel every queued journey step — an automation platform that is shut down badly keeps sending from the queue after the UI has gone.

prior art · someone already did this
listmonk

High-performance self-hosted newsletter and mailing-list manager, and the best answer if you insist — it solves the software, and leaves deliverability and consent entirely to you.

Mautic

Open-source marketing automation platform with campaign journeys and contact scoring, which is the closest match to the automation half and a fair illustration of how much surface that half has.

Questions

Every email entry here says ABSOLUTELY NOT. What's different about this one?

The automation engine and the CRM. A broadcast tool has one failure event: you press send and the wrong thing goes out once. A journey builder has a continuous one — it keeps sending after you have gone to bed, and the specific bug it generates is a loop, not a typo. The CRM half adds the other thing: you are holding behavioural profiles, so a subscriber can compel you to produce everything you know about them, and that is a different obligation from keeping a list.

What single control stops the worst version?

A unique row per contact per campaign per step, written to the database before the message is handed to the provider. It costs a table and an index, and it turns every retry, redeploy, webhook duplicate and automation loop into a no-op. Pair it with a global hourly ceiling that pauses on breach, and the six-hour incident becomes a five-minute one.

My list is 400 people who all signed up on my own site. Is this still ABSOLUTELY NOT?

At that size, with proven double opt-in and no automations, you are close to the SHIP IT case at the top of this page — that is genuinely a provider API and a template. The verdict is for the shape this product sells: journeys running unattended, segments over custom fields, a public form, and a contact record that has accumulated two years of behaviour. Add automations to your 400 people and the list size stops being the protective factor.

Does the CRM data really matter if it's just opens and clicks?

It is personal data, it is behavioural, and almost nobody building this writes a retention policy for it. The practical problem arrives as a deletion request: you delete the contact row, and the event history, the queued journey steps, the segment cache and the analytics rollups all still hold them. Write one erasure function that covers every store, and a test that proves it, before you build the profile page.

sources
  • CAN-SPAM Act: A Compliance Guide for Business (FTC)
  • GDPR Art. 7 — conditions for consent (EU)
  • GDPR Art. 5 — principles relating to processing of personal data
did you build it?

Every week, someone ships something they shouldn’t have.

New verdicts, the worst thing that landed in the trap, and the occasional incident report. No other email, ever.

also on the regret index
LoopsABSOLUTELY NOT

Lifecycle email means automated messages you did not personally read going to real customers.

ButtondownYOUR FUNERAL

Small list, same law. The compliance floor does not scale down with your subscriber count.

MailchimpABSOLUTELY NOT

Sending bulk email is 5% code and 95% not getting your domain blacklisted forever.

last reviewed 2026-08-04 · verdict is editorial and unsponsored · shared entry data from canivibecodeit under MIT · not legal advice