Lifecycle email that stops when the customer converts.

Drip Keeper is an open-source alternative to Customer.io and Loops for small SaaS teams. Your app posts events (signed_up, created_project, upgraded); sequences send the onboarding, trial and win-back emails; a goal event ends the rest; every email carries an unsubscribe link. Try your sequences first: the page runs the same engine as the server, in your browser, and uploads nothing.

1. Preview what one person would receive, and when

WhenWhatDetail

2. Run it yourself

git clone https://github.com/Duncan-Haywood/oss-monorepo && cd oss-monorepo/ventures/drip-keeper
ADMIN_KEY=$(openssl rand -hex 16) SEQUENCES_FILE=examples/sequences.json \
BASE_URL=https://mail.example.com PRODUCT_NAME=Acme node server.mjs      # DRY_RUN=true until you change it

curl -X POST $BASE_URL/v1/events -H "Authorization: Bearer $ADMIN_KEY" \
  -d '{"email":"ada@example.com","name":"Ada","event":"signed_up"}'

Dry run records events and shows what would send at POST /v1/admin/tick without sending anything. Add RESEND_API_KEY, MAIL_FROM, POSTAL_ADDRESS and set DRY_RUN=false to go live. One-click Render deploy and Docker are in the README.

Questions

Why not use Customer.io, Loops, Userlist or Mailchimp automations?

Hosted tools are polished and the right call if you want a visual editor and a team inbox. They price by contact count, and your customer list and event stream live on their platform. Drip Keeper is MIT, keeps contacts and sequences in one JSON file you control, and sends through your own Resend account. If a hosted tool already works for you, keep it.

What does it do when someone upgrades halfway through a sequence?

Your app posts an upgraded event. Any sequence that lists upgraded in exitOn stops for that person immediately, and the stats show which email they had last received, so you can see which email precedes conversions.

Can it send a duplicate or flood someone after an outage?

It marks a message sent and saves before calling the email provider, so a crash can lose one email but never send it twice. After downtime it sends at most one message per person per pass and keeps at least an hour between messages, so a long outage cannot dump a whole sequence into an inbox.

Does it handle unsubscribes and bounces?

Every email carries a signed unsubscribe link and List-Unsubscribe headers with one-click support. A GET shows a confirm page so mail scanners cannot unsubscribe people by prefetching. Point a Resend webhook at the server and spam complaints and permanent bounces stop all mail to that address automatically (signature-verified); an admin endpoint covers everything else.

Do I need to worry about email law?

You are the sender, so yes: consent rules, a physical postal address in marketing email (CAN-SPAM), and honouring unsubscribes. Drip Keeper adds the unsubscribe link and your postal address to every message and warns on start if the address is missing, but compliance is yours.