{
  "slug": "onboarding-incomplete-reminder-email",
  "title": "Onboarding incomplete reminder email: template and code",
  "url": "https://www.courier.com/recipes/onboarding-incomplete-reminder-email",
  "markdown": "https://www.courier.com/recipes/onboarding-incomplete-reminder-email.md",
  "stage": "Onboarding",
  "purpose": "Point each stuck user at their next unfinished setup step, not a generic nudge.",
  "summary": "An onboarding incomplete reminder gets users who stalled during setup to finish, by naming the exact step they're on. It emails them on day 1 and day 3 after signup, with an Inbox note on day 1, reading their next step from their profile. Finishing setup stops the reminders.",
  "channels": [
    "email",
    "inbox"
  ],
  "shape": "journey",
  "shows": [
    "Reading setup progress from the profile, with no endpoint",
    "Copy built from the step your app writes",
    "Canceling the run when setup is finished"
  ],
  "data": [
    {
      "name": "profile.first_name",
      "type": "string",
      "example": "Dana",
      "note": "From the profile. Write it when the user signs up. The emails say \"there\" when it's missing"
    },
    {
      "name": "profile.next_step",
      "type": "string",
      "example": "connect your first data source",
      "note": "Your app writes it as setup progresses. The reminders name it, and say \"finish setting up\" when it's missing"
    }
  ],
  "steps": [
    {
      "step": "1",
      "when": "1 day after signup",
      "channels": "Email, Inbox",
      "templates": [
        "templates/setup-step-email.json",
        "templates/setup-step-inbox.json"
      ]
    },
    {
      "step": "2",
      "when": "3 days after signup",
      "channels": "Email",
      "templates": [
        "templates/setup-last-email.json"
      ]
    }
  ],
  "files": {
    "journey": "journey.json",
    "templates": [
      "templates/setup-step-email.json",
      "templates/setup-step-inbox.json",
      "templates/setup-last-email.json"
    ],
    "setup": [
      "setup.ts"
    ],
    "start": [
      "start.ts",
      "start.py"
    ],
    "stop": [
      "stop.ts",
      "stop.py"
    ]
  },
  "docs": [
    "https://www.courier.com/docs/guides/build-an-onboarding-sequence",
    "https://www.courier.com/docs/journeys/nodes/delay",
    "https://www.courier.com/docs/journeys/nodes/send",
    "https://www.courier.com/docs/journeys/nodes/cancel",
    "https://www.courier.com/docs/journeys/invoke"
  ],
  "related_recipes": [
    "https://www.courier.com/recipes/welcome-email-sequence",
    "https://www.courier.com/recipes/feature-adoption-email-sequence",
    "https://www.courier.com/recipes/stalled-trial-slack-alert"
  ],
  "agent_prompt": "Add onboarding reminders to this app, sent through Courier: on day 1 and day 3 after signup, email anyone who hasn't finished setup, naming their next unfinished step. Follow the steps at https://www.courier.com/recipes/onboarding-incomplete-reminder-email.md and use the Courier skill for SDK details.\n\n1. Create the journey and its templates in my Courier workspace by replacing Acme and the setup link in the templates with our own, then running setup.ts from that page with COURIER_API_KEY from our environment. Save the journey ID it prints as COURIER_SETUP_REMINDERS_JOURNEY_ID.\n2. Find where this codebase creates a new user and call startSetupReminders from start.ts there. Pass only the user ID, and make sure first_name is written to their Courier profile at signup.\n3. Find where a user completes each onboarding step and call recordNextStep from start.ts with their next unfinished step from our real onboarding checklist.\n4. Find where a user finishes setup or deletes their account and call stopSetupReminders from stop.ts, which cancels the journey with the token setup-<user_id>.\n5. Match this codebase's language, file layout, and error handling. Never hardcode the API key.\n6. When you're done, start one run for a test user and show me the run's steps.",
  "status": {
    "state": "passing",
    "last_tested": "2026-10-19"
  }
}
