Day-1 nudge email to stalled sign-ups, dry run by default (GET) — cronstalledsignupnudgeget
const url = 'https://example.com/api/cron/stalled-signup-nudge';const options = {method: 'GET'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request GET \ --url https://example.com/api/cron/stalled-signup-nudgeHO-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.
Parameters
Section titled “ Parameters ”Query Parameters
Section titled “Query Parameters ”0 runs live; anything else, or absent, is a dry run.
Responses
Section titled “ Responses ”Nudge run counts
object
False on any error.
True unless the caller sent dry_run=0.
Dry run only — users a live tick would claim now; null on a live run or a failed preview.
Users claimed by this run.
Nudges accepted by Mailgun.
Claimed users deliberately not emailed (E2E identities, or no longer eligible at send time).
Definite pre-delivery failures; retried after the lease until the attempt ceiling.
Sends whose delivery is unknown (timeout/abort); terminal, never retried.
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.
Failures of any kind (preview, claim, send, or outcome bookkeeping).
Missing or invalid CRON_SECRET