Appointments Reference Public

Checkout & Payments

End-user documentation for the ERPat Appointments module (spa / salon / clinic booking).

Guide version: r1 Module version: 1.0.0 Updated: 2026-07-22 Estimated time: 16 min 1 views
Daily Operations

Checkout & Payments

The Checkout screen is where a finished visit turns into money and follow-up. Open it from an appointment to bill the customer for the services performed and any products sold, take an in-store payment or hand out an online pay link, and — behind the scenes — award loyalty points and trigger a review request. It reuses ERPat's core invoicing entirely, so the invoice you create here is a normal consumer invoice you can also view, print, and manage in the Invoices module.

Front desk Manager Admin
ℹ️
Where this lives Checkout opens as a modal from the Checkout button on an appointment detail card (route appointment_checkout/modal_form). The button only appears for users who hold the Appointment Checkout permission — everyone else never sees it. The customer never operates this screen; they only receive the pay link, the review email, and (via the ledger) their loyalty points.

Overview

Checkout answers the last two front-desk questions of a visit: “What do we charge, and have we been paid?” It splits into a billing half (invoice + payment) and a retention half (loyalty + reviews):

  • Bill the visit. The appointment's billable lines — the service performed plus any retail products sold — are turned into a real invoice. Back-bar supplies consumed during the service are a cost, never billed, and never appear here.
  • Cover with packages first. Before invoicing, you can apply a package/membership session the customer already owns to a service line, so that service drops off the bill.
  • Take payment. Record an in-store payment (cash, card, GCash…) or generate an online pay link the customer opens to pay themselves.
  • Reward & follow up. Loyalty points accrue automatically the moment the visit is marked Completed, and an hourly job emails a review request after a configured delay.
????
Two rules to remember You must attach a customer to the appointment before you can invoice, and package coverage can only be changed before the invoice exists. Everything else is flexible; these two are not.

What is (and isn't) billable

Only two kinds of line reach the invoice. Record retail sales and back-bar use through Manage Items before you complete the appointment, so completion captures stock and the checkout invoice includes everything.

Line typeOn the bill?What it is
Service lineYes (unless package-covered)The primary booked treatment. Carries the service price; excluded only when a package session covers it.
Retail saleYesA product sold to the customer to take home. Carries a retail price and appears on the invoice.
Back-bar useNeverSupplies consumed during the service (shampoo, dye, foils). Priced 0 to the customer; tracked as cost/stock only.
Covered by packageNoA service line paid for with a prepaid package session — the customer already paid, so it drops off the bill.
????
Do things in the right order The clean sequence is: add items → apply package coverage → Create Invoice → take payment. Coverage and back-bar stock both lock at completion/invoicing, so front-load them.

The checkout screen

The Checkout modal is the point-of-sale hub for a single appointment. Its layout changes depending on whether an invoice has been created yet — it's a “before invoice” (preview & cover) view and an “after invoice” (pay) view.

Before the invoice exists

SectionWhat you see & do
Package coverage Only shown when the appointment has a customer and service lines and no invoice yet. One row per service, showing either a blue Covered by package badge with a red × to remove, an Apply package… dropdown of the customer's usable sessions, or a plain when no coverage is available.
Billable Items A preview table — Item / Qty / Price columns plus a Total row — showing exactly what the invoice will contain.
No-customer warning If the appointment has no customer, a warning reads “Attach a customer to this appointment before invoicing.” and you cannot create an invoice.
Create Invoice The blue file-icon button that raises the invoice from the billable lines.

After the invoice exists

Once you click Create Invoice, the modal reloads into the payment view. The package-coverage section disappears (coverage is now locked) and you get the money side:

ElementMeaning
Invoice summaryA table showing Invoice #, Invoice total, Amount paid, and Balance due (what's still owed).
Payments historyA table of every payment recorded (date + amount) — appears once at least one payment exists.
Record Payment formA Payment method dropdown + Amount field + a money-icon button. Shown only while balance due is greater than 0.
Generate online pay linkA link-icon button that reveals a read-only URL box the customer can use to pay online.
Fully-paid bannerA green “This invoice is fully paid.” success alert once balance due reaches 0; the payment form and pay-link are then hidden.
View invoiceA link that opens the underlying core invoice in the Invoices module in a new browser tab.

Screen legend

Covered by package Covered by packageBlue badge with a red ×. This service is paid by a package session and will not be billed. Click the × to release it — only before invoicing.
Apply package… dropdownThe customer owns matching sessions; pick one to cover this line. Options show the remaining count, e.g. “Glow Facial x5 (3 remaining)”.
— (em dash)No package coverage is available for this service line — it will simply be billed normally.
Fully paid This invoice is fully paid.Green check-circle alert. Balance due is 0; nothing more to collect. The pay form and pay-link vanish.
Balance dueThe outstanding amount still owed. Every recorded payment is silently clamped to this — you can never over-collect.
⚠️
In-store payments don't hit Accounts Payments recorded here post against the invoice only — they do not post to the Finance Accounts ledger. If you rely on the Accounts module, reconcile these payments manually. This is a known limitation.

Create invoice & record payment (SOP)

Actor: Front desk (with the Appointment Checkout permission). This is the standard in-store checkout for a walk-out customer paying at the desk.

  1. Open the appointment

    From the calendar or list, open the appointment card. It should already have a customer attached and its service & any retail lines recorded (add them via Manage Items if not).

  2. Click Checkout

    Click the green Checkout button (credit-card icon) to open the Checkout modal. If you don't see it, you lack the Appointment Checkout permission — ask a manager.

  3. Apply any package coverage (optional)

    In Package coverage, use the Apply package… dropdown on a service row to cover it with a session the customer owns. The row switches to a Covered by package badge and drops off the bill. See below and the Packages page for details.

  4. Review the Billable Items and Total

    Check the preview table lists everything the customer should pay for, and that covered/back-bar lines are excluded. The Total row is what the invoice will be.

  5. Create the invoice

    Click Create Invoice. The modal reloads into the payment view showing the Invoice #, Invoice total, Amount paid and Balance due.

  6. Record the payment

    In Record Payment, pick the Payment method (Cash, Card, GCash…), confirm the Amount — it defaults to the full balance — and click Record Payment. You'll see “Payment recorded.”

  7. Confirm it's settled

    When the balance reaches 0, the green “This invoice is fully paid.” banner appears and the payment form disappears. Done.

????
Full payment is two clicks Because Amount pre-fills with the full balance, a straight full payment is just: pick the method → click Record Payment.

Partial & split payments

You don't have to collect the whole balance at once. Record each payment separately — the balance stays open until it reaches 0, and only then does the green “fully paid” banner appear. This handles split tenders (e.g. part cash, part card) and pay-later scenarios.

ℹ️
You can't over-collect The Amount is silently clamped down to the outstanding balance. If you type more than is owed, the extra is simply dropped — the invoice never shows an overpayment.

Cover a service with a package before invoicing (SOP)

Actor: Front desk / manager. Do this on an appointment that has not been invoiced yet.

  1. Open Checkout on an un-invoiced appointment

    The Package coverage section only appears while the appointment has a customer and no invoice.

  2. Find the service row & apply a session

    Open the Apply package… dropdown for the service and pick an available entitlement (it shows the remaining count). The session is claimed immediately.

  3. Confirm the badge, then invoice the rest

    The row now shows the blue Covered by package badge and drops off the billable list. Click Create Invoice for whatever remains billable.

????
Coverage locks at invoicing To undo, click the red × on the covered row — this releases the session back to the customer. Both applying and removing coverage only work before Create Invoice. Once the invoice exists, coverage is frozen. If two staff race for the last session, only one wins; the loser sees “That package session is no longer available.”

Online pay links

When a customer wants to pay later, remotely, or by card online, generate an online pay link instead of taking payment at the desk. It's a one-time verification URL that lets them pay the invoice without logging in.

Send an online pay link (SOP)

Actor: Front desk (then the customer).

  1. Create the invoice first

    The pay link is generated from an existing invoice with a balance. Run steps 1–5 of the checkout SOP to create the invoice, then stop before recording payment.

  2. Generate the link

    Click Generate online pay link (link icon). A read-only URL box appears — of the form pay_invoice/index/{code}.

  3. Copy & send it

    Copy the URL and send it to the customer by SMS or email.

  4. Customer pays

    The customer opens the link, is taken through verification to the core Pay Invoice page, and pays via Stripe or PayPal. The payment posts back to the same invoice.

⚠️
The link needs two settings turned on to actually work The link generates fine regardless, but the customer can only complete payment if the business has online payments configured (Stripe/PayPal) and guest invoice payment (“pay invoice without login”) enabled. Without both, the link is a dead end — the customer reaches the page but can't pay. Verify these before relying on pay links.
????
Desk or remote — your choice You can mix methods on one invoice: take a partial cash payment at the desk with Record Payment, then send a pay link for the remaining balance. The balance is shared across both.

Loyalty points

Loyalty points are the automatic reward half of checkout. There is no manual “award points” button and no redemption screen in this module — points accrue by themselves and are read as a running balance.

How points are earned

Points are granted once the moment an appointment is moved to Completed (from the appointment card, not the Checkout screen). The amount is:

points earned = floor( appointment total × loyalty rate )

The loyalty rate is the per-tenant “Loyalty points per 1.00 spent” setting a manager configures on the Appointment Settings page. A rate of 0 turns the feature off entirely.

Understand loyalty points (SOP)

Actor: Manager (sets it up), Front desk (marks Completed), System (awards).

  1. Manager sets the rate

    On Appointment Settings, set Loyalty points per 1.00 spent to a non-zero value. A modest rate such as 0.01 gives 1 point per 100 spent.

  2. Front desk completes the visit

    Mark the appointment Completed on its card. This is the trigger — the same one that captures commission and decrements back-bar stock.

  3. Points post automatically

    The system adds an “earn” row to the customer's loyalty ledger equal to floor(total × rate). No clicking required.

  4. Check the balance

    Open Customer History from any of that customer's appointments; the Loyalty points stat panel shows the running balance (the sum of the ledger).

ℹ️
Points can round to zero Because the formula floors the result, a small total or a low rate can award 0 points — points are only granted when the rate is > 0 and the computed points are > 0. That's expected, not a bug.
⚠️
Awarded once; not auto-reversed A one-time latch guarantees points are granted exactly once — re-completing an already-completed appointment will not re-award them, and cancelling or un-completing does not claw back already-awarded points. If you need to correct a balance there's no redemption/adjustment UI here — adjust manually.

Loyalty & spend on Customer History

The Customer History modal (opened from an appointment card that has a customer attached) is the CRM snapshot where all of this comes together. It shows three teal stat panels plus supporting lists:

18
Visits (completed)
₱24,500
Total spend
245
Loyalty points
Panel / listWhat it shows
VisitsCount of the customer's Completed appointments only.
Total spendLifetime currency value across completed visits only.
Loyalty pointsCurrent running balance from the points ledger.
Active packagesAny packages the customer still has, with expiry dates.
Visit historyTable of Date / Service / Provider / Status / Amount (status shown as a colored label).
ReviewsThe customer's past reviews: gold star rating, service name, and comment.
????
Check history before you check out Open Customer History before invoicing to spot active packages the customer could use to cover a service, and to confirm their loyalty balance — a quick way to upsell or apply the right coverage.

Post-visit review requests

Reviews are collected from the customer, not entered by staff. After a completed visit an automated email invites the customer to rate the visit 1–5 stars on a public, no-login page. This feeds per-staff and per-service average ratings you'll see on Reports.

How the review request works

  1. Manager enables reviews

    On Appointment Settings, tick Enable review requests and set the Review request delay (hours) (default 24; a negative value falls back to 24).

  2. Visit is completed

    Only Completed appointments are reviewable — completion is what starts the clock.

  3. Hourly job emails the link

    After the delay passes, an hourly background job emails the customer the “How was your visit to [business]?” message with a Leave a Review button. It's sent once per appointment and latched so the customer is never emailed twice — even if the send fails.

  4. Customer leaves the review

    On the public review page they click a star rating, optionally add a comment, and submit. They see “Thanks for your feedback!” and the review immediately appears in their Customer History and feeds the rating averages.

ℹ️
Share the review link manually too The review page lives at /appointments/review/{company-slug}/{uuid}. Front desk can copy and hand this link to a customer directly instead of waiting for the automated email.

What the customer sees

The public review page (branded with your logo and business name) responds differently depending on the appointment's state:

StateWhat appears
Ready to reviewA clickable 5-star widget (stars turn amber on hover/select), an optional comment box, and a teal Submit Review button.
No rating pickedInline error “Please select a star rating.” — the form blocks submit until at least one star is chosen (server enforces 1–5).
SubmittedGreen check + “Thanks for your feedback!”
Already reviewed“You've already reviewed this visit. Thank you!” — there is exactly one review per appointment, enforced.
Not completedA “not available” message when the appointment isn't Completed.
⚠️
Both switches must be on Review-request emails need the Appointments module enabled and Enable review requests turned on. If either is off, the hourly job does nothing. Reviews can only be left for Completed visits, and only once each.

Tips & gotchas

The edge cases that trip people up at the register. Expand any that apply.

“Attach a customer to this appointment before invoicing.” — what now?

Invoicing needs a real customer on the appointment. Close Checkout, open Edit on the appointment, attach an existing customer (or type a name + valid email to create one), save, then reopen Checkout. A walk-in with only a name/phone stays account-less and can't be invoiced through this flow.

“There are no billable items on this appointment.”

Every line is either back-bar consumption (never billed) or already covered by a package — so there's nothing to charge. If that's wrong, add a retail line or remove package coverage via the red × before invoicing. If the visit truly had no billable charge (e.g. entirely package-covered), there's simply no invoice to create.

I created the invoice but need to change the package coverage.

You can't. Coverage — applying or removing — is only possible before Create Invoice. Once the invoice exists the coverage controls are gone and the covered service was already excluded. Handle the correction in the core Invoices module, or (if nothing is paid) manage it there.

Can I record a payment on a cancelled or already-settled invoice?

No. The Record Payment form only shows while the invoice is not cancelled and the balance due is greater than 0. A cancelled invoice isn't payable here, and once fully paid the form is replaced by the green “fully paid” banner.

I typed more than the balance — where did the extra go?

Nowhere. Payments are silently clamped to the balance due, so you can never over-collect. The extra amount is dropped and the invoice shows exactly the balance as paid.

The pay link opens but the customer can't pay.

The link only lets a customer pay when the business has online payments (Stripe/PayPal) configured and guest invoice payment (“pay without login”) enabled. If either is off, the page loads but there's no way to complete payment. Turn both on, or take the payment at the desk instead.

These payments aren't showing in my Accounts / Finance ledger.

Correct — in-store payments recorded here post against the invoice only and do not post to the Finance Accounts ledger (account transactions). This is a known limitation; reconcile manually if you use the Accounts module.

The customer got 0 loyalty points.

Points = floor(total × rate), awarded only when the rate is > 0 and the result is > 0. A low rate or a small total rounds to zero. Also confirm the appointment was actually marked Completed (the award trigger) and that a customer is attached.

I cancelled a completed visit — will loyalty and stock reverse?

No. Loyalty points and already-committed back-bar stock from a prior completion are intentionally not clawed back — a completed-then-cancelled visit is treated as settled. Adjust manually if needed. (Note: cancelling does release package sessions, but only if no invoice was created yet.)

The review email never arrived.

Check three things: the Appointments module is enabled, Enable review requests is on in Settings, and the configured delay has actually elapsed since completion. The email is best-effort and sent once per appointment — if it already latched as sent it won't resend. You can always share the review link manually.

The “not reviewable” message shows blank.

A known display quirk: the not-available message on the public review page can render blank/fallback for appointments that aren't Completed. The behaviour is correct (non-completed visits can't be reviewed) even if the wording is missing.

Where did the appointment go after I completed it?

The appointments list hides Completed, Cancelled, and No Show by default. Tick those status filters on the calendar list to see it again for a re-checkout or to View invoice.


Related pages

Was this guide helpful?

Report a content problem