Appearance
POS card processing
Point of Sale offers three card tenders. They look similar at the register but mean different things for your books, so it's worth knowing which to reach for.
The three card tenders
- Card reader: a card-present charge sent to a compatible reader registered with your connected Stripe or Square account. Sauna CRM waits for the provider to confirm capture before completing the sale. A customer is optional for product-only walk-in sales.
- External card: a record-only tender. You run the customer's card on a standalone card terminal, then mark the sale paid here. Sauna CRM does not move any money for this tender; it only records that a card paid. Use it whenever the card is swiped, tapped, or dipped on hardware the app doesn't control.
- Card on file: an in-app charge. Sauna CRM charges a card the customer already has saved, through your connected Stripe or Square account, for the order total. The payment is captured immediately and carries the real gateway reference, so the money actually moves and the sale can be refunded straight back to the card from Sauna CRM.
Keeping the three separate keeps revenue reporting honest: External card rows are sales settled on outside hardware, while Card reader and Card on file rows carry gateway-backed charges captured by the app.
Charging on a connected reader
- Choose Card reader.
- Select an available Stripe or Square reader. Offline, busy, and attention-needed readers remain visible but can't be selected.
- Select Charge {total} and ask the customer to tap, insert, or swipe.
- Keep the waiting screen open. Sauna CRM completes the sale only after it retrieves and verifies the provider payment amount, currency, location, and captured status.
The pending checkout survives a page reload. Canceling waits for the provider to prove that no payment completed, which protects against a card finishing at the same moment the cashier cancels.
If the connection drops after you select Charge, Sauna CRM keeps the exact checkout request and resends that same request rather than starting a new charge. Do not start the same sale again. Select Retry recovery instead. Each unresolved sale is tracked on its own, so another POS tab cannot overwrite it. If the tab that started it is gone, another tab can pick it up from Terminal checkout recovery available and resolve it there. You can leave an unresolved sale to take unrelated cash, External card, or Card on file payments, but Card reader stays unavailable until you resume and resolve the saved checkout.
Square can briefly report a checkout as timed out while the Terminal is still completing the payment. Sauna CRM keeps that order pending, continues checking Square in the background, and labels it Payment outcome unresolved. It does not restore the cart or inventory while a late charge remains possible. If Square still cannot provide a final answer after 30 days, the order is flagged for manual reconciliation in Recent Orders.
Connected-reader checkout requires a compatible internet-connected Stripe smart reader or Square Terminal. Offline payments, tips, surcharges, partial authorization, and split gift-card/reader tenders are not supported in this flow. Memberships also cannot use a connected reader yet because Sauna CRM does not activate an entitlement before an asynchronous reader payment settles; use Card on file or External card instead.
Square connections created before reader support was added must be reconnected once in Payment settings by an admin with brands:update. The payments:read permission used for Point of Sale does not allow provider configuration. Reconnecting grants the device permission the reader list needs, and it also sets up the events Sauna CRM uses to finish checkouts even when the POS page is closed, so there is no webhook to configure by hand.
The Sale Location remains Sauna CRM's reporting and inventory location. Stripe or Square owns a separate hardware location for the reader. Sauna CRM records which provider account and location a sale started against and checks them again before charging. If either one has changed, the sale is refused before any money moves. After the charge has been sent, a changed provider account (and, on Square, a changed location) stops the order for manual reconciliation rather than completing it against the new account.
Recovery and safety checks
- A dropped connection, a timeout, or a retry never charges the customer twice. Sauna CRM resends the original request rather than opening a second payment.
- Every completed order is checked back against the provider for amount, currency, account, and Square location before it is marked paid.
- If the connected Stripe account, Square merchant, or Square location changes during a payment, the sale is refused or the order stops for manual reconciliation, never completed against the new account.
- Reader hardware must already be paired with Stripe or Square before it appears in the reader list.
Stripe smart readers use Stripe's Terminal service and require an internet connection. Square devices must already be paired for the Terminal API. Reader checkout does not support provider offline mode.
Whether your account charges real cards or runs against the providers' test systems is set by Sauna CRM, not from Payment settings. If you want a test run before you take live card-present payments, ask Sauna CRM support to arrange it.
Charging a card on file
- Attach a customer to the cart, a saved card belongs to a customer, so this tender is unavailable for an anonymous sale.
- Choose Card on file as the payment method.
- Pick one of the customer's saved cards from the list. Each shows the brand, last four digits, and expiry.
- Select Charge {total}. The button shows Charging card… while the gateway processes it, and a Sale Complete screen confirms once the funds are captured.
The tender is only available when the customer has at least one saved card and your brand has a Stripe or Square connection. If in-app charging isn't set up, or the customer has no card on file, the panel says so and you can fall back to Card reader or External card.
If the card is declined
A declined charge is reported inline and nothing is captured, no sale is recorded. The cart is left intact so you can pick a different saved card and try again, or switch to another tender. Each attempt is a fresh charge, so a decline never risks a double charge.
Requirements
- Permission:
payments:create(the same permission needed to ring any sale). - Provider: a connected Stripe or Square account set as the brand's payment provider. PayPal does not support in-app card-on-file charging.
- Saved card: the customer must already have a card stored with the provider (for example from a prior online checkout or membership signup).
Refunds
- External card sales refund like cash or gift-card sales: full or partial refunds are recorded in Sauna CRM, and you return the money on the terminal separately.
- Card reader sales issue a full refund through the captured Stripe/Square reference before Sauna CRM reverses the local order. Partial refunds are not available yet. Stripe Interac and Square payments marked as requiring card presence need a separate in-person reader refund and are not yet supported in Sauna CRM; the order remains unchanged and tells you why instead of recording a refund that did not move money. Pending online refunds retain their provider reference and can be retried after settlement. A full refund issued from Stripe's or Square's own dashboard is picked up and recorded against the order here. A partial one is not: Sauna CRM leaves the order, inventory, gift card balances, and entitlements untouched and flags the order in Recent Orders so you can settle it by hand. A refund that had already been applied to the order and then fails at the provider raises the same flag, because money was returned in Sauna CRM's records but not by the provider. A refund that fails without ever having been applied clears the flag instead: nothing was changed, so there is nothing to settle.
- Card on file sales refund at the gateway. Refunding the sale (or voiding it) reverses the charge on Stripe/Square and returns the money to the customer's card. Only full refunds and voids are supported for this tender today, partial refunds of an in-app charge are not yet available, so refund the whole sale or void it.
Related
- Payments: connect Stripe or Square.
- Disputes & refunds: refund and dispute workflows.
- Point of Sale: the full register walkthrough.