Home / Focused PRD

PRD 05 — Cancellation & Refund

Status: Business review closed on 2026-09-02. Implementation intentionally deferred.

Goal

Make cancellation and refund straightforward for the client (one channel, manual handling) and auditable for the Admin (clear status, evidence, and decision history). No public cancellation/refund form is added; the website only displays the policy in Terms and Conditions.

Client side

Admin side: status

A booking has a cancellation_status field that is independent of booking.state. The status represents where the booking sits in the cancellation/refund workflow, not the operational state of the session.

Status Meaning
none The booking has not been discussed for cancellation/refund. This is the default for any confirmed booking.
requested A cancellation or refund request has been received from the client (for example via WhatsApp), but Admin has not yet decided.
approved Admin has approved the cancellation; the booking is closed and the slot/capacity is released or rolled back per the cancellation matrix.
rejected Admin has rejected the cancellation/refund request; the booking continues as confirmed.
refund_pending A refund has been approved and the client has been notified; the refund itself has not yet been transferred.
refund_completed The refund transfer is complete and the evidence is attached.
refund_failed The refund transfer was attempted but did not succeed; the booking remains approved and the slot/capacity is closed until the refund is retried successfully.

The status is none by default and only changes when an Admin takes an action or records a client request. Status changes are append-only at the audit level; the current status is the latest in the audit chain.

Admin evidence

Two evidence types are required for the Admin-side procedure:

  1. Cancellation evidence - Required: a screenshot of the WhatsApp conversation that contains the client’s request. - Stored as cancellation_evidence on the booking or its cancellation record, with file URL or attachment reference, the Admin actor, and the timestamp. - Captures the channel (Admin WhatsApp), the date, the request, and any reply sent by the Admin. - Acceptable file types: PNG, JPG, or PDF. The Admin workspace validates that at least one file is uploaded before the request can move to approved or rejected.

  2. Refund evidence - Required: proof of the refund transfer (bank/QRIS confirmation screenshot, transaction reference, or e-wallet receipt). - Stored as refund_evidence on the RefundAction record, with file URL, the Admin actor, the timestamp of the transfer, and the external transfer reference. - Captures the manual channel used (bank, e-wallet, or QRIS refund), the transfer amount, the recipient, and the confirmation. - Acceptable file types: PNG, JPG, or PDF. The Admin workspace validates that at least one file is uploaded before the refund can be marked refund_completed.

Evidence files are stored with the rest of the operational records; the specific storage backend is part of PRD 07 and is not defined here. A placeholder storage URL is acceptable during development, as long as the URL points to a real, accessible file when the audit requires it.

Admin workflow

  1. Capture the request (required to leave none) - Admin receives the cancellation/refund request on WhatsApp. - Admin records the request in the workspace: client booking reference, request summary, and the date of the request. - Admin uploads the WhatsApp screenshot. - The cancellation_status becomes requested.

  2. Decide (required to leave requested) - Admin reviews the case against the public policy in Terms and Conditions. - Admin selects approve or reject, with a short reason in free text. - On approve:

    • The booking state transitions per the cancellation matrix (booking, appointment, or package). The slot and capacity are released.
    • The status becomes approved immediately.
    • On reject:
    • The booking state remains confirmed. No slot or capacity is released.
    • The status becomes rejected and a reason is recorded.
  3. Refund (separate from approve, when applicable) - After approved, Admin decides whether the refund amount is full_refund or no_refund. The default for a cancellation by the client with no fault is full_refund, but the Admin can choose no_refund if the policy or the case supports it. - On full_refund decision, the status becomes refund_pending and the RefundAction is recorded. - When the manual refund transfer is done, Admin uploads the refund evidence and the status becomes refund_completed. - If the transfer fails, the status becomes refund_failed and Admin retries. The booking state is not re-opened during retry; only the RefundAction is updated.

Required Admin fields

For each cancellation/refund action, the workspace records:

Acceptance checks

Still open for this PRD

References

Status

Business review closed. Implementation intentionally deferred.

The remaining items are implementation, retention, and operational template follow-ups; they do not reopen the business decision.

Change log