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.
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.
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 type | On the bill? | What it is |
|---|---|---|
| Service line | Yes (unless package-covered) | The primary booked treatment. Carries the service price; excluded only when a package session covers it. |
| Retail sale | Yes | A product sold to the customer to take home. Carries a retail price and appears on the invoice. |
| Back-bar use | Never | Supplies consumed during the service (shampoo, dye, foils). Priced 0 to the customer; tracked as cost/stock only. |
| Covered by package | No | A service line paid for with a prepaid package session — the customer already paid, so it drops off the bill. |
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
| Section | What 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:
| Element | Meaning |
|---|---|
| Invoice summary | A table showing Invoice #, Invoice total, Amount paid, and Balance due (what's still owed). |
| Payments history | A table of every payment recorded (date + amount) — appears once at least one payment exists. |
| Record Payment form | A Payment method dropdown + Amount field + a money-icon button. Shown only while balance due is greater than 0. |
| Generate online pay link | A link-icon button that reveals a read-only URL box the customer can use to pay online. |
| Fully-paid banner | A green “This invoice is fully paid.” success alert once balance due reaches 0; the payment form and pay-link are then hidden. |
| View invoice | A link that opens the underlying core invoice in the Invoices module in a new browser tab. |
Screen legend
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.
-
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).
-
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.
-
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.
-
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.
-
Create the invoice
Click Create Invoice. The modal reloads into the payment view showing the Invoice #, Invoice total, Amount paid and Balance due.
-
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.”
-
Confirm it's settled
When the balance reaches 0, the green “This invoice is fully paid.” banner appears and the payment form disappears. Done.
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.
Cover a service with a package before invoicing (SOP)
Actor: Front desk / manager. Do this on an appointment that has not been invoiced yet.
-
Open Checkout on an un-invoiced appointment
The Package coverage section only appears while the appointment has a customer and no invoice.
-
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.
-
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.
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).
-
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.
-
Generate the link
Click Generate online pay link (link icon). A read-only URL box appears — of the form pay_invoice/index/{code}.
-
Copy & send it
Copy the URL and send it to the customer by SMS or email.
-
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.
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).
-
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.
-
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.
-
Points post automatically
The system adds an “earn” row to the customer's loyalty ledger equal to
floor(total × rate). No clicking required. -
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).
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:
| Panel / list | What it shows |
|---|---|
| Visits | Count of the customer's Completed appointments only. |
| Total spend | Lifetime currency value across completed visits only. |
| Loyalty points | Current running balance from the points ledger. |
| Active packages | Any packages the customer still has, with expiry dates. |
| Visit history | Table of Date / Service / Provider / Status / Amount (status shown as a colored label). |
| Reviews | The customer's past reviews: gold star rating, service name, and comment. |
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
-
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).
-
Visit is completed
Only Completed appointments are reviewable — completion is what starts the clock.
-
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.
-
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.
What the customer sees
The public review page (branded with your logo and business name) responds differently depending on the appointment's state:
| State | What appears |
|---|---|
| Ready to review | A clickable 5-star widget (stars turn amber on hover/select), an optional comment box, and a teal Submit Review button. |
| No rating picked | Inline error “Please select a star rating.” — the form blocks submit until at least one star is chosen (server enforces 1–5). |
| Submitted | Green check + “Thanks for your feedback!” |
| Already reviewed | “You've already reviewed this visit. Thank you!” — there is exactly one review per appointment, enforced. |
| Not completed | A “not available” message when the appointment isn't Completed. |
Tips & gotchas
The edge cases that trip people up at the register. Expand any that apply.
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.
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
Where you complete a visit, record items, and find the Checkout button.
Selling packages and the entitlements you spend as coverage at checkout.
The loyalty rate, review-request toggle, and delay live here.
Revenue, commission, and the star ratings your reviews feed.
The full booking-to-payment SOPs that build on this screen.
Billable line, balance due, entitlement, pay link, loyalty points, review.