Use case

Know exactly who joined your waitlist, and when

Log every waitlist signup with actor, email, source, referrer and timestamp. Hand the list to sales when you open the doors, or replay it when a beta invite bounces.

The problem

A waitlist table in your database tells you a name and an email. It does not tell you where the user came from, what campaign brought them in, whether they signed up twice, or when they were invited. When launch day comes you have no story to tell, and no way to prioritize your beta cohort.

The Recalled way

Emit a `waitlist.joined` event on every signup. Store the source, the referrer, the campaign id and the UTM parameters in metadata. When you open the beta, filter by `waitlist.joined` on the dashboard, export the list as CSV, and send the first invites to your earliest, warmest signups. Every invite you send is another event you can log, `waitlist.invited`, `waitlist.accepted`, `waitlist.bounced`, so the whole funnel lives in one place.

Your signup handler
await recalled.events.create({
  action: "waitlist.joined",
  actor: { id: user.id, email: user.email },
  organization: "marketing",
  metadata: { source: "landing", referrer: req.headers.referer },
});

Why teams run their waitlist on Recalled

  • Rich actor metadata

    Store email, referrer, UTM tags, user agent and IP on every signup event. Nothing to query join.

  • CSV export in one click

    Filter `waitlist.joined` by date range, export to CSV, hand it to sales or marketing. No SQL.

  • Tamper-proof ordering

    Every event is hash-chained. The order of signups is cryptographically provable, useful when you promise 'first N get it free'.

  • Retention you control

    Paying customers can set a retention rule per action prefix. Keep `waitlist.*` forever, expire noisier events after 30 days.

Related use cases

Your next audit log is 2 minutes away

Stop hacking on your own logs table. Drop in Recalled, send your first event, move on.