{
  "slug": "team-invite-reminder-email",
  "title": "Team invite email with reminder: template and code",
  "url": "https://www.courier.com/recipes/team-invite-reminder-email",
  "markdown": "https://www.courier.com/recipes/team-invite-reminder-email.md",
  "stage": "Onboarding",
  "purpose": "Invite a teammate, remind them if they don't join, and tell the inviter if they still haven't.",
  "summary": "A team invite reminder makes sure invited teammates actually join. It sends the invite email when someone adds a teammate, reminds the invitee after 3 days, and leaves an Inbox note for the person who sent the invite after 7 days if it's still pending. Accepting or revoking the invite stops the rest.",
  "channels": [
    "email",
    "inbox"
  ],
  "shape": "journey",
  "shows": [
    "Two people in one journey",
    "Sending to an email address from your data",
    "Cancel when the invite is accepted"
  ],
  "data": [
    {
      "name": "invite_id",
      "type": "string",
      "example": "inv_7Kq2",
      "note": "Builds the cancellation token and the accept link"
    },
    {
      "name": "invitee_email",
      "type": "email",
      "example": "sam@example.com",
      "note": "Where the invite and reminder go"
    },
    {
      "name": "team_name",
      "type": "string",
      "example": "Growth"
    },
    {
      "name": "profile.first_name",
      "type": "string",
      "example": "Dana",
      "note": "From the inviter's profile. \"A teammate\" is the fallback when it's missing"
    }
  ],
  "steps": [
    {
      "step": "1",
      "when": "Right after the invite is sent",
      "channels": "Email",
      "templates": [
        "templates/invite-email.json"
      ]
    },
    {
      "step": "2",
      "when": "3 days after the invite",
      "channels": "Email",
      "templates": [
        "templates/invite-reminder-email.json"
      ]
    },
    {
      "step": "3",
      "when": "7 days after the invite",
      "channels": "Inbox",
      "templates": [
        "templates/inviter-inbox.json"
      ]
    }
  ],
  "files": {
    "journey": "journey.json",
    "templates": [
      "templates/invite-email.json",
      "templates/invite-reminder-email.json",
      "templates/inviter-inbox.json"
    ],
    "setup": [
      "setup.ts"
    ],
    "start": [
      "start.ts",
      "start.py"
    ],
    "stop": [
      "stop.ts",
      "stop.py"
    ]
  },
  "docs": [
    "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/onboarding-incomplete-reminder-email",
    "https://www.courier.com/recipes/comment-notification-batching"
  ],
  "agent_prompt": "Add team invite emails with a reminder to this app, sent through Courier: the invite right away, a reminder to the invitee after 3 days, and an in-app note to the inviter after 7 days if they still haven't joined. Follow the steps at https://www.courier.com/recipes/team-invite-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 settings link in the template files 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_INVITE_JOURNEY_ID.\n2. Find where this codebase creates a team invite and start the journey there, as the inviter. Pass the fields in the Data fields table from our own data, and replace the accept-link base URL in the templates with ours. Make sure the inviter's first_name is written to their Courier profile at signup.\n3. Find where an invite is accepted or revoked and cancel the journey with the token invite-<invite_id>.\n4. Match this codebase's language, file layout, and error handling. Never hardcode the API key.\n5. 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"
  }
}
