{
  "slug": "appointment-reminder-sms",
  "title": "Appointment reminder SMS: template and code",
  "url": "https://www.courier.com/recipes/appointment-reminder-sms",
  "markdown": "https://www.courier.com/recipes/appointment-reminder-sms.md",
  "stage": "Engagement",
  "purpose": "Cut no-shows with reminders timed to each appointment, and restart them when an appointment moves.",
  "summary": "An appointment reminder SMS cuts no-shows by texting customers before their appointment. A day before, it sends a text and an email with the time, place, and a reschedule link, and an hour before it sends one more text. Customers without a phone number get the email only, and rescheduling cancels the old reminders.",
  "channels": [
    "email",
    "sms"
  ],
  "shape": "journey",
  "shows": [
    "Reminders timed from each appointment",
    "An SMS only for users with a phone number",
    "Cancel and restart when an appointment moves"
  ],
  "data": [
    {
      "name": "appointment_id",
      "type": "string",
      "example": "appt_4Fq9",
      "note": "Builds the cancellation token and the reschedule link"
    },
    {
      "name": "appointment_at",
      "type": "ISO 8601 datetime",
      "example": "2026-10-22T18:30:00Z",
      "note": "When the appointment starts. The templates show it as a date and a time in the customer's timezone"
    },
    {
      "name": "location",
      "type": "string",
      "example": "Acme Studio, 123 Main St"
    },
    {
      "name": "remind_24h_at",
      "type": "ISO 8601 datetime",
      "example": "2026-10-21T18:30:00Z",
      "note": "When the email and SMS go, 24 hours before. The journey waits until then"
    },
    {
      "name": "remind_1h_at",
      "type": "ISO 8601 datetime",
      "example": "2026-10-22T17:30:00Z",
      "note": "When the second SMS goes, 1 hour before. The journey waits until then"
    },
    {
      "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.timezone",
      "type": "IANA timezone",
      "example": "America/Los_Angeles",
      "note": "From the profile. Dates and times show in this timezone, and in New York time when it's missing"
    }
  ],
  "steps": [
    {
      "step": "1",
      "when": "24 hours before the appointment",
      "channels": "Email, SMS",
      "templates": [
        "templates/reminder-24h-email.json",
        "templates/reminder-24h-sms.json"
      ]
    },
    {
      "step": "2",
      "when": "1 hour before",
      "channels": "SMS",
      "templates": [
        "templates/reminder-1h-sms.json"
      ]
    }
  ],
  "files": {
    "journey": "journey.json",
    "templates": [
      "templates/reminder-24h-email.json",
      "templates/reminder-24h-sms.json",
      "templates/reminder-1h-sms.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",
    "https://www.courier.com/docs/guides/send-your-first-sms"
  ],
  "related_recipes": [
    "https://www.courier.com/recipes/otp-sms-email-fallback",
    "https://www.courier.com/recipes/app-download-link-sms",
    "https://www.courier.com/recipes/payment-receipt-email"
  ],
  "agent_prompt": "Add appointment reminders to this app, sent through Courier: an email and SMS 24 hours before an appointment and a second SMS an hour before, with the SMS only for customers who have a phone number. Follow the steps at https://www.courier.com/recipes/appointment-reminder-sms.md and use the Courier skill for SDK details.\n\n1. Create the journey and its templates in my Courier workspace by replacing Acme Studio and the reschedule 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_APPOINTMENT_JOURNEY_ID.\n2. Find where this codebase books an appointment and start the journey there. Pass the fields in the Data fields table from our own data, with all times as ISO 8601 timestamps. Make sure first_name, phone_number, and timezone are written to the customer's Courier profile when the customer is created.\n3. Find where an appointment is rescheduled or canceled and cancel the journey with the token appt-<appointment_id>. For a reschedule, start a new run with the new time right after.\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 customer with remind_24h_at and remind_1h_at a minute apart, and show me the run's steps.",
  "status": {
    "state": "passing",
    "last_tested": "2026-10-19"
  }
}
