All explainers
Plan · Booking and rescheduling from the portal · 28 Oct 2026

Patients confirm, move, cancel and book on their own.

Every visit email opens that one visit, without an email or a code: confirm, move or cancel, with no limits unless the clinic sets them. Signed in, the portal does the same and books new visits through the region’s patient widget. The desk sees who changed what. Curitt only, on Amiro’s own calendar.

What the patient can do
Confirm→Reschedule→Cancel→Book a new visit

All four are prototyped (28 Oct): admin-preview (the visit link, patient widgets, settings, emails) and patient-preview (the portal). Every visit-link state, one click each: admin-preview /v (Demo). Plan: Amiro.Next/features/patient-self-serve-visits/plan.md.

01 · Today

Production confirms. The emails promise more.

1

action live for patients in production: Confirm. Cancel has an endpoint and no button; Move and Book exist nowhere on the patient side.

2

steps the email link asks for before anything opens: an email, then a code. Then it lands on messages, not on the visit.

0

patients using it yet, so we keep the emails’ promise and make it true instead of taking it back.

ActionProduction backendProduction portalPrototype, 28 Oct
ConfirmBuiltBuiltLink and portal
MoveStaff only, BOOKED onlyNoneLink and portal
CancelBuilt
refused while a payment is unrefunded
No buttonLink and portal
Book a new visitPublic widget onlyNonePortal, through the patient widget
Amiro · Booking and rescheduling from the portal · 28 Oct 20261 / 8
02 · Decisions

One visit, one link, no limits unless the clinic sets them.

1. The visit linkEvery visit email carries a link to this visit and nothing else, no sign-in. Whoever holds the email can confirm, move or cancel it, and sees nothing more. It dies when the visit starts; a move keeps it.
2. No limits by defaultUntil the visit starts, as often as they like. A visit type can set Online changes stop (hours before) and Reschedules per visit. Past the window: Message the clinic, never a phone number. No fees.
3. A move keeps the visitSame type, clinic and provider; forms, payments and the lead’s booking stay. Only the time changes. A moved visit counts as confirmed.
4. The expected step leadsOne big button for what the patient came to do: Confirm from the confirm request, Reschedule from “Change or cancel”. The other is one small tap away. Cancelling is two steps in a sheet; the reason is optional.
5. Patient widgetsA booking widget is public or for patients. One default per region, used by the portal’s Book a visit and the link’s Book a new visit. No details or consent asked; the patient’s clinic is preselected; only the region’s clinics.
6. Messages say what is possibleConfirmation, both reminders and the rescheduled email carry the link; the cancellation carries Book a new visit. The portal’s notices say the same. Curitt only; requireLocallyManaged keeps external engines out.
Amiro · Booking and rescheduling from the portal · 28 Oct 20262 / 8
04 · In the portal

The same rules, signed in.

patient-preview: a visit that needs confirming; Change or cancel opened; Pick a new time; too close to change: Message the clinic.
  • The visit’s own step leads (Confirm, Directions, the call); a small Change or cancel opens Reschedule with a small Cancel visit.
  • Reschedule scrolls the picker into view; the new time is confirmed in a sheet. Cancel is the same two-step sheet as the link.
  • The clinic’s notice lands in the chat with View visit; the list re-sorts by date. Past the window, Message the clinic opens the chat with the message started.
Amiro · Booking and rescheduling from the portal · 28 Oct 20264 / 8
05 · Book a visit

The region’s patient widget, inside the portal.

The Book a visit pill; step 1 with Your visit and the patient’s clinic; Pick a clinic from the pencil; add-ons with the total pinned; date, time and coupon.
  • A focused flow. The portal’s header and tabs step aside; ✕ on the Book a visit line goes back to Visits.
  • Your visit shows the patient’s own clinic from the first step, with a pencil to change it; from step 2 it folds to the total and stays on top.
  • The widget’s steps: service, add-ons (nothing ticked) with the total and Continue pinned, then date and time to the visit type’s horizon (five days for Curitt), coupon above Confirm booking.
  • The booking lands confirmed on the patient — no lead — and the clinic’s booking notice lands in the chat.
Amiro · Booking and rescheduling from the portal · 28 Oct 20265 / 8
06 · Clinic side

Patient widgets, limits and messages in Settings; the change on the calendar.

Settings, Booking widgets, Patients — Netherlands: Region, and the preview with Your visit.
Settings, Notifications, Booking cancelled: Book a new visit.
The calendar drawer: Moved by the patient, from Thu 29 Oct, 13:30.
Amiro · Booking and rescheduling from the portal · 28 Oct 20266 / 8
07 · Production

Artur builds it end to end: the backend, then both front-ends.

01 · This weekRules and briefYerzhan. SCH-D rules; SCH-Q-026 closed; SCH-R-043/044 revised.
02 · BackendThe contractArtur. Visit-type limits, the visit token and its API, the patient move, patient widgets, the three link tags.
03 · Patient sidepatient-frontendArtur. /v/:token outside sign-in; Reschedule, Cancel and Book a visit signed in.
04 · Staff sideadmin-frontendArtur. Booking widgets for patients, the visit-type limits, the drawer line and activity.
PieceWhat it is
Visit typechangeWindowHoursPatient, maxPatientMoves, both optional; absent means no limit.
TokenRandom, stored hashed on the appointment; minted at booking, kept on a move, dead at the visit’s start.
Public APIGET /public/visit/v1/{token} · GET …/slots?date= (its own slot out) · POST …/confirm · …/move · …/cancel. Rate-limited; window and move guards; the portal switch and requireLocallyManaged.
Signed-in APIPOST /patient/calendar/v1/appointments/{id}/move with the same guards; cancelMine as it is.
Patient widgetsaudience, regionId, isRegionDefault (one per region, not deletable); a booking endpoint that books as the signed-in patient, no personal data or consent, no lead.
Messages{{visit_link}}, {{change_link}}, {{book_link}}; RESCHEDULED / CANCELLATION from both patient paths, actor patient.
Amiro · Booking and rescheduling from the portal · 28 Oct 20267 / 8
08 · Risks

What to settle before Curitt switches it on.

  • The first reminder and a window. If a clinic sets 24 h, the 24 h reminder lands as it closes; its link line should drop once the window has closed.
  • A forwarded email can change the visit. That is the trade for no sign-in; the page shows only the visit, and the link dies at its start.
  • Demo times. The prototypes’ times ignore the provider’s schedule; production uses the slot engine.
  • Paid visits. A cancel while a payment is not refunded is refused (409); the page should then say the clinic will contact the patient. Not prototyped.
  • SMS and WhatsApp templates are not aligned: SMS is not sent; WhatsApp reminders are Carla’s. Align when either is on for a portal clinic.
  • The discount in Your visit’s total: the portal shows it after the coupon, the admin widget before. Settle on one.
Amiro · Booking and rescheduling from the portal · 28 Oct 20268 / 8