Skip to content
PennyPost Docs

Emails you already send

Keep your own onboarding emails. PennyPost waits a day after yours and only emails people who are still stuck.

Most apps already send their own onboarding emails: a welcome, a day-1 nudge, a "your results are ready". Keep them. PennyPost doesn't replace your sequence. It adds an email for the people who stalled, and it keeps out of the way of yours.

What PennyPost does about your emails

  • No two emails on the same day. When PennyPost knows your app emailed someone, a moment email to that person waits until 24 hours after yours.
  • Ours goes after yours. If one of your emails covers a moment, like a day-1 email to people who never started, that moment still runs. Its email goes a day after yours, and only to people who are still stuck by then. The moment's card on Moments names your email.
  • Sign-in links don't count. Magic links, login codes, password resets, email confirmations and receipts never hold an email back. Many apps send a sign-in link on every visit, and those aren't nudges.
  • The usual limits apply: at most one PennyPost email a day and 3 in a person's first 14 days. See Sending rules.

PennyPost learns about your emails in one of these ways. You can use more than one.

If you send with Resend

Nothing to do. When you connect Resend, PennyPost adds a delivery webhook to your Resend account. Resend reports every email the account delivers, and PennyPost's own emails carry a tag, so any email without that tag is one of yours. Each one starts the 24-hour wait for that person.

If you send with Loops

Takes about 2 minutes, on Connections → Loops:

  1. Copy the address PennyPost shows.
  2. In Loops, open Settings → Webhooks, paste it, and turn on Workflow email sent, Campaign email sent and Transactional email sent. Save.
  3. Loops shows a signing secret under the address (it starts with whsec_). Paste it into PennyPost and click Save.
  4. Back in Loops, send a test event. PennyPost's Loops page says when it came through, and later shows the newest email it saw.

Loops allows one webhook address per account. If yours already has one for something else, this can't go in yet.

From your own code

If your app sends email from its own server, or through a provider not listed here, tell PennyPost each time it sends a lifecycle email with the email_sent event:

curl -X POST https://usepennypost.com/api/v1/events \
  -H "Authorization: Bearer $PENNYPOST_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"app": "your-app", "email": "jane@example.com", "event": "email_sent", "createContact": true,
       "properties": {"name": "Day-1 nudge", "subject": "Your first video is one click away"}}'

Send it after the email goes, with a short timeout, so PennyPost can never hold up your own email. The prompt for Claude Code or Cursor on Snippet and events adds this for you.

Which moments your emails cover

The same prompt also has your coding agent list every email your app sends in a person's first two weeks: its name, subject, what triggers it and which day. It shows you the list and sends it only once you say OK. PennyPost matches each email to a moment only when the trigger is clear, like "no first check after 24 hours". A welcome or a general tips email covers no moment. The endpoint is on the API page.