> ## Documentation Index
> Fetch the complete documentation index at: https://docs.riservahq.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Let guests manage their own reservations

Guests can see, cancel or move their own reservation on a page on your
storefront, if your policy allows it. Every change they make lands in your
admin immediately, with the guest named as the person who made it.

The manage page is on from the moment you install. It lives at
`/apps/bookings/manage` on your store and is shown inside your theme, so it
picks up your fonts and colours. There is nothing to add to your theme.

## The manage page at a glance

* **Getting in**: the **Manage your reservation** link in Riserva's emails,
  or the reservation code plus the email it was booked with.
* **What guests can do**: change the date or time within the same
  experience, or cancel. Each only when your policy allows it right now.
* **What guests can't do**: change the party size or the experience.
* **What controls it**: the experience's custom rules if it has them,
  otherwise your shop policy.

***

## How a guest gets to their reservation

**From an email, with nothing to type.** The **Manage your reservation** link
in Riserva's emails opens the guest's own reservation directly. The link
carries a sealed code, not the guest's email address. It works until two
weeks after the visit.

**By hand.** Anyone who opens the page without a link sees **Manage your
reservation**: "Enter the reservation code and the email address it was
booked with. Both are in your confirmation email." It has two fields,
**Reservation code** and **Email address**, and a **Find my reservation**
button. Both must match.

A reservation with no email address on file can't be found this way at all.
Staff manage it.

<AccordionGroup>
  <Accordion title={"If the guest sees \"That link has expired\""}>
    The email link has run out; it works until two weeks after the visit. The
    page says:

    > That link has expired. Enter your reservation code and email instead.
  </Accordion>

  <Accordion title={"If the guest sees \"We couldn't find a reservation with that code and email\""}>
    The code and the email must both match. A wrong code and a wrong email get the
    same answer:

    > We couldn't find a reservation with that code and email.

    That way the page never reveals whether a code exists.
  </Accordion>

  <Accordion title={"If the guest sees \"Too many attempts\""}>
    After 15 tries in 10 minutes, the page pauses: "Too many attempts — please
    wait a minute and try again."
  </Accordion>
</AccordionGroup>

***

## What the guest sees on their reservation

The guest sees a page titled **Your reservation**. It shows:

* The experience's photo, the reservation code and the experience name.
* The date and time, for example "Sat, Aug 15 · 6:00 PM".
* **Where** (venue and location) and **Party** ("4 guests").
* **Paid**, but only when money was actually paid.

Then comes one sentence of your refund terms, written from your policy. For
example: "Full refund until 2 days before your visit, then 50% until 1 day
before your visit; no refund after that." Or: "All sales final — no
refunds." On a free reservation (nothing was paid), the sentence is left out,
because there is no money to talk about.

### The actions on the reservation page

The page then shows the actions your policy allows right now:

* **Change date or time**: the main button.
* **Cancel this reservation — refund 100% (\$85.00)**: a quieter link at the
  bottom. It names the percentage and amount the guest would get back today.

The cancel link changes with the money:

* When the guest paid but your policy refunds nothing today, it reads just
  **Cancel this reservation**, with "No refund applies under the
  cancellation policy." under it.
* On a free reservation, it is just the link.

<AccordionGroup>
  <Accordion title={"What the guest reads when a change isn't allowed"}>
    When something isn't allowed, the page says so in one line instead of showing
    the button:

    | Situation | What the guest reads |
    | - | - |
    | Can't move it and can't cancel it online | "Online changes are closed for this reservation. Please contact the winery." |
    | Can cancel, but can no longer move it | "The time can no longer be changed online. Please contact the winery to move it." |
    | Can move it, but can't cancel online | "Cancellation is handled by the winery — please get in touch." |
  </Accordion>

  <Accordion title={"What the guest reads when the reservation isn't Pending payment or Confirmed"}>
    Only reservations that are **Pending payment** or **Confirmed** can be changed
    online. For anything else, the page shows a single line instead:

    | Status | What the guest reads |
    | - | - |
    | Cancelled | "This reservation has been cancelled." |
    | Checked in, seated or completed | "This visit has already happened — thank you for coming." |
    | No-show | "This reservation was marked as a no-show." |
  </Accordion>
</AccordionGroup>

***

## How a guest cancels

The cancel link opens a **Cancel reservation** page. It restates the money
before anything happens:

> Under the cancellation policy you'll be refunded **100% (\$85.00)**.

The percentage comes from your refund schedule. It is the step that matches
how much notice the guest is giving.

* When the guest paid but nothing is refundable, it reads "No refund applies
  under the cancellation policy." It never says "0% (\$0.00)".
* On a free reservation, the page says nothing about refunds at all.

### The cancellation reason

Next, the page asks **Why are you cancelling? (helps the winery plan)**, with
your cancellation reasons as choices. The guest must pick one.

* You set the list under **Settings → Policies → Cancellation reasons**.
* Clear the list and the question isn't asked.
* An optional box follows: "Anything else you'd like the winery to know?"
* The reason and the note land on the reservation's timeline.

The page ends with two buttons: **Cancel reservation** and **Keep
reservation**.

### What happens after the guest cancels

The guest sees **Reservation cancelled**: "Your reservation has been
cancelled." Riserva sends the **Reservation cancelled** email too.

The refund is a real Shopify refund against the original order. See
[Cancellations and refunds](/daily-operations/cancellations-and-refunds).

The page adds one line about the money. On a free reservation there is no
money line at all.

| What the guest reads | What it means |
| - | - |
| "Your refund of \$85.00 is on its way to your original payment method." | The refund went through. |
| "Your refund of \$85.00 will be processed by the winery." | Riserva couldn't send it on the spot. It waits on the reservation's Payment card for you. |
| "Under the cancellation policy, no refund is due for this reservation." | The guest paid, and the policy refunds nothing. |

***

## How a guest moves to a different day or time

**Change date or time** appears only when all of these are true:

* Your policy allows guest reschedules.
* The optional **reschedule cutoff** hasn't passed.
* The visit hasn't started.
* For policies that refund, the guest could still cancel for a refund right
  now.

<AccordionGroup>
  <Accordion title={"Why moving depends on the refund deadline"}>
    Without that last condition, a guest past the refund deadline could move the
    reservation to a distant date, cancel it from there, and get their money back.
    Tying the right to reschedule to the *original* time closes that door.

    Policies that never refund (all sales final) have nothing to launder. There,
    rescheduling runs until your cutoff, or right up to the visit if you didn't
    set one.
  </Accordion>
</AccordionGroup>

### The Change date or time page

The page shows "Currently Sat, Aug 15 · 6:00 PM · party of 4" and "Pick a day
with open times, then a time. Your party size stays the same."

1. The guest picks a day on the month calendar.
2. The guest picks one of that day's times.
3. The guest presses **Move my reservation**.

On the calendar, days with an open time are outlined and clickable. The
reservation's current day is underlined, and everything else is greyed out.
The arrows move between months. Picking a day lists its times as buttons.

* A day with nothing open says "No times are open that day for a party of 4."
* **Back to your reservation** leaves without changing anything.

<AccordionGroup>
  <Accordion title={"How the calendar treats members and whole-venue reservations"}>
    The calendar treats a guest who booked as a member as a member. A
    members-only reservation therefore shows its open days.

    It does not count the guest's own reservation against the times. A
    whole-venue reservation can therefore move to a nearby time.
  </Accordion>
</AccordionGroup>

### What the guest can and can't change

* **Can:** the date and the time, within the same experience.
* **Can't:** the party size, or the experience.

Your online cutoff and members-only rules still apply here, exactly as when
the reservation was first made. The reservation keeps its code, its guest
details and its order. Nothing is cancelled and rebooked behind the scenes.

### What happens after the guest moves

On success, the guest is back on their reservation with "Your reservation has
been moved. A confirmation is on its way." Riserva sends the **Reservation
rescheduled** email.

<AccordionGroup>
  <Accordion title={"If the time was taken while the guest was moving"}>
    The same page says why instead, for example "That time just sold out." or
    "Online reservations have closed for that time." Nothing changed.
  </Accordion>
</AccordionGroup>

***

## What staff can do that guests can't

Staff working in the admin override three limits that bind guests:

* They can move a reservation past the cutoff.
* They can move it into a members-only experience.
* They can move it to a **different experience** entirely, with the money
  difference worked out for them.

Staff can also change the party size. See
[Edit a reservation](/daily-operations/edit-a-reservation).

***

## Controlling all of this

One set of rules governs everything above: the experience's custom rules if
it has them, otherwise your shop policy. Those rules set:

* whether guests may cancel,
* whether they may reschedule,
* the optional cutoffs,
* and the refund schedule.

See [Set your cancellation policy](/getting-started/cancellation-policies).

***

**What things mean on this screen:** [What things mean: What your guests see](/reference/guest-surfaces)

## Related

* [Cancellation policies](/getting-started/cancellation-policies)
* [Cancellations and refunds](/daily-operations/cancellations-and-refunds)
* [Customer emails](/guest-experience/customer-emails)


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.