Skip to content

Day-1 nudge email to stalled sign-ups, dry run by default (GET) — cronstalledsignupnudgeget

GET
/cron/stalled-signup-nudge
curl --request GET \
--url https://example.com/api/cron/stalled-signup-nudge

HO-18477. Emails ONE reminder to each user who confirmed their address 24-72h ago and has no workspace membership, no successful MCP call, no OAuth grant, no invite, is not a superadmin or an E2E identity, and has not unsubscribed. Exactly-once per user (pending -> sending -> sent | failed | unknown; a delivery-unknown send is never retried). Each email carries List-Unsubscribe and List-Unsubscribe-Post headers pointing at /email/unsubscribe/{token}. DRY RUN BY DEFAULT: without an explicit dry_run=0 (query, or JSON body dry_run 0 / “0” / false) the route only counts the cohort (would_claim) and claims and sends nothing. The pg_cron job stalled-signup-nudge (scheduled inactive) passes dry_run=0. Protected by CRON_SECRET via the x-cron-secret header.

dry_run
string

0 runs live; anything else, or absent, is a dry run.

Nudge run counts

Media type application/json
object
ok
required

False on any error.

boolean
dry_run
required

True unless the caller sent dry_run=0.

boolean
would_claim
required

Dry run only — users a live tick would claim now; null on a live run or a failed preview.

integer | null
claimed
required

Users claimed by this run.

integer
sent
required

Nudges accepted by Mailgun.

integer
skipped
required

Claimed users deliberately not emailed (E2E identities, or no longer eligible at send time).

integer
failed
required

Definite pre-delivery failures; retried after the lease until the attempt ceiling.

integer
unknown
required

Sends whose delivery is unknown (timeout/abort); terminal, never retried.

integer
deferred
required

Claimed users not attempted this run (the circuit breaker after a failed or unknown send, or the 90s send deadline); left pending and re-claimed after the lease.

integer
errors
required

Failures of any kind (preview, claim, send, or outcome bookkeeping).

integer

Missing or invalid CRON_SECRET