Docs
Checkout and payments
How clients buy, and how to connect Stripe, PayPal, crypto and manual payments.
ClientOS sells each service from its own page. A buyer opens /services/your-service, picks a package, ticks any extras, chooses how to pay and is sent to the payment provider's secure page. When the provider confirms the money moved, ClientOS creates the client's account, the order and a paid receipt in one go.
This guide walks through the buyer's journey, how to connect each payment gateway, how manual crypto payments work, and the tax, fee and signup settings around checkout.
Where it lives#
| What | Menu path | Route |
|---|---|---|
| A service page (the checkout) | Your portal domain | /services/your-service |
| After payment | Your portal domain | /services/your-service/paid |
| Connect gateways | Settings → Integrations | /settings/integrations |
| Tax, fee, manual payment, dunning | Settings → Payments | /settings/payments |
| Manual payments waiting for you | Work → Invoices → Payments to confirm | /payments/manual |
| Signup rules | Settings → Clients | /settings/clients |
The buyer's journey#
- Choose. On the service page the buyer picks a package (or several, if you allow it), a quantity if the service has one, and any extras under Add extras. If the service can be taken monthly, they choose One-time or Monthly under How often.
- Enter their details. A signed-out buyer types their name and email under Your details, and a company name if you require one. If the email already has an account, the page says the order will go into it. A signed-in client's details are filled in already.
- Add a coupon. If the Coupons module is on, Have a coupon? opens a Coupon code field. The discount is checked as they type.
- Pick how to pay. Under Pay with, every gateway you have switched on is listed, plus manual payment if you offer it. A client with account credit can tick Use account credit.
- Pay. The button reads Place order, Subscribe for a monthly choice, Place order with credit when credit covers it, or Order for free for a free total. The buyer is sent to the provider's hosted payment page.
- Confirmation. The provider sends the buyer back to
/services/your-service/paid, which checks the payment and shows Order placed or Payment received. If the payment failed, the page says The payment didn't go through and offers Try again. - Sign in. A new buyer gets a 6-digit sign-in code by email, types it on the same page and lands in the portal, where Fill in your requirements is waiting at
/orders/ORDER-NUMBER/requirements.
The order summary on the page shows the packages, extras, any Volume discount and coupon, tax and processing fee, the Total and what is Due today. For a monthly choice it adds a "Then $X / month" line and says how later cycles are paid.
While you are signed in as staff, the service page won't let you buy. Sign out, or open the page in a private window, to test a purchase.
What gets created on payment#
Nothing is created until the provider confirms the payment server to server. That keeps the order correct even if the buyer closes the tab after paying. On confirmation, ClientOS creates, in one step:
- the client's account and company, if they are new
- the order, numbered like
ORD-482917, with its lines - the brief (the service's requirements questions)
- a receipt: an invoice for exactly what was charged, already marked paid
- the payment record
Your team is notified of the new order, and the client gets a confirmation. A monthly choice also starts a subscription.
Free and quoted services#
- Free total. When the order costs nothing, no payment page opens. The order is created straight away, with no receipt. A signed-out buyer passes a Cloudflare Turnstile check first, if Turnstile is connected.
- Quote on request. The page shows Ask for a quote instead of checkout. The request becomes a support ticket, so it needs the Helpdesk module.
- Questions. With Helpdesk on, priced services also show Need help choosing? with an Ask a question button, which opens a ticket without losing the buyer's selection.
Abandoned checkouts#
If a buyer reaches the provider's page and leaves without paying, the checkout expires after about a day. ClientOS can send one reminder email per address per week. It is off by default. Turn on Abandoned checkout in Settings → Emails.
Connect a payment gateway#
All gateways are connected in Settings → Integrations. Credentials are encrypted before they are stored and are never shown again; the screen keeps the last four characters so you can tell keys apart.
- Go to Settings → Integrations and find the gateway.
- Click Connect.
- Paste the values the dialog asks for. Each field says where to find it in the provider's dashboard, and Open links straight there.
- Click Connect. ClientOS checks the credentials with the provider, works out whether they are test or live, and registers the webhook where the provider allows it.
- Read the check results and click Done.
| Gateway | What buyers can pay with | You paste | Recurring charges |
|---|---|---|---|
| Stripe | Cards, Apple Pay, Google Pay | Secret key | Yes, card kept on file |
| PayPal | PayPal balance, and cards without an account | Client ID, Secret key | No, invoiced each cycle |
| NOWPayments | Crypto: BTC, ETH, USDT and 300+ others | API key, IPN secret (recommended) | One-off only |
| CoinGate | Crypto: BTC, ETH, USDT, Lightning and 70+ others | API token | One-off only |
| BTCPay Server | Bitcoin and Lightning, to your own wallet | Server address, Store ID, API key | One-off only |
Where to find each credential#
- Stripe: Stripe dashboard → Developers → API keys → Secret key. Keys starting
sk_test_orsk_live_work, and so do restricted keys (rk_test_,rk_live_). - PayPal: PayPal developer dashboard → Apps & Credentials → your app → Client ID and Secret key.
- NOWPayments: NOWPayments dashboard → Settings → Payments → API keys. The IPN secret is on the same screen under Instant Payment Notifications. Without it, ClientOS can't verify callbacks, so nothing will ever be marked paid.
- CoinGate: CoinGate dashboard → Account → API → Apps → Create app. The token is shown once. A sandbox token comes from sandbox.coingate.com.
- BTCPay Server: the address you open your server at, the Store ID from your store's Settings → General, and an API key generated for that store with permission to view and create invoices and modify webhooks.
Test and live detection#
You don't choose a mode. ClientOS detects it:
- Stripe reads it from the key prefix: paste a test key and you get test mode.
- PayPal, NOWPayments and CoinGate offer your credentials to the live API first and then the sandbox. Whichever accepts them is the mode.
- BTCPay Server reads whether your store's wallet is on mainnet or testnet.
The gateway card shows Live or Test. When you paste a live key, the dialog warns that checkout will take real money once it is connected and switched on.
Connect Stripe with test keys first, buy one of your own services end to end, then click Replace keys and paste the live key.
Webhooks#
Gateways tell ClientOS about payments through callbacks.
| Gateway | How the callback is set up |
|---|---|
| Stripe, PayPal, BTCPay Server | Registered automatically when you connect, and removed when you disconnect. |
| NOWPayments, CoinGate | Nothing to register. The callback address travels with each payment. |
Callbacks arrive at https://api.your-domain.com/v1/payments/webhooks/PROVIDER. You never need to copy this by hand for a gateway that registers automatically.
Manage a connected gateway#
Click Manage on a connected gateway to see:
- Offer Stripe at checkout (or the gateway you opened): switch the gateway off without throwing away the keys. Checkout stops offering it within half a minute.
- Checks: the results of the last connect or re-check, with when they ran. Click Re-check to run them again.
- Callbacks: where callbacks arrive and the most recent ones received, with a mark for each whose signature was valid or rejected.
- Replace keys: paste new credentials, for example to go from test to live.
- Disconnect: deletes the stored key and removes the webhook at the provider.
A card that says Needs attention has a failed check. Open Manage to see which.
Connecting a gateway needs both the Integrations and Payments settings permissions. With only Integrations, gateway cards show Needs payment access.
Manual crypto payments#
Manual payment lets buyers pay your own crypto wallets directly and send you the transaction ID (TXID). Nothing is ordered or paid until someone on your team checks the wallet and confirms.
Turn it on#
- Go to Settings → Payments and find Manual payment.
- Set Name at checkout: what buyers pick beside your other methods.
- Write Instructions: shown above the wallets on the payment page.
- Under Wallets, add each wallet with its coin (for example USDT), network (for example TRC20) and address.
- Switch the panel On and save.
Manual payment is offered at service checkout and on an invoice's Pay now. It adds no processing fee; tax applies as usual.
What the buyer does#
- Chooses manual payment and places the order.
- Lands on a payment page at
/pay/manual/CHECKOUT-IDshowing the amount, your instructions and each wallet with a copy button. - Sends the payment, picks the wallet they used and pastes the TXID.
- Waits on a page that refreshes itself. Once you confirm, it links to their order or invoice.
If no TXID arrives within 72 hours, the checkout expires.
Confirm or reject a payment#
- Go to Work → Invoices → Payments to confirm. You are also notified when a TXID arrives.
- Use the tabs: To confirm, Waiting for payment, Confirmed and Rejected.
- Copy the TXID and check it on a block explorer against the wallet and amount.
- Click Confirm payment. The order is placed (or the invoice paid) exactly as if a card had paid, with the TXID as the payment reference.
- If nothing arrived, click Reject payment and say Why. The buyer is emailed your reason and a link to pay again.
Confirming and rejecting need the Record a payment permission.
Tax and processing fee#
Both are in Settings → Payments, each with its own on/off switch.
Tax#
| Field | What it does |
|---|---|
| Name on the bill | What the tax line is called: VAT, GST, Sales tax. |
| Rate | Applied to the price after any discount. |
| Your prices | Exclude tax (tax is added on top) or Include tax (your prices already contain it). |
| Tax registration | Your VAT or GST number, if you have one. |
Tax applies at checkout and on new invoices. Subscription cycles use the rate on the day each invoice is raised.
Processing fee#
When on, a fee is added to the buyer's total at checkout, at the rate of the gateway they pay with. Set Name on the bill (for example "Card fee") and a percent plus fixed amount for each gateway. The panel shows a worked example. When off, you absorb what each gateway charges.
The processing fee applies to the checkout only, never to subscription renewal invoices.
Currency#
Your workspace has one currency, set during setup. You can change it in Settings → Company until the first invoice, payment or checkout. After that it is locked, because changing it would restate prices clients have already seen. Settings → Payments shows the currency read-only.
ClientOS supports 21 currencies: USD, EUR, GBP, CAD, AUD, NZD, CHF, SEK, NOK, DKK, PLN, INR, BDT, PKR, SGD, HKD, AED, ZAR, NGN, BRL and MXN.
Signup settings#
A buyer gets an account automatically when they pay. Whether strangers can also create an account without buying is set in Settings → Clients → Signing up.
| Setting | What it does |
|---|---|
| Enable the signup page | Anyone can create an account at /signup and reach the portal. Off, accounts exist only when you add them or somebody buys. |
| Block free email providers | Rejects gmail.com, outlook.com and similar. Filters noise, but also turns away sole traders without a company domain. |
| Require a company name | Adds a company field to signup and to the checkout's details. |
Turnstile#
Cloudflare Turnstile protects your public forms from bots. Connect it in Settings → Integrations → Cloudflare Turnstile with your Site key and Secret key. Once connected, it checks:
- the signup page
- quote requests and questions from service pages
- public forms
- free orders by signed-out buyers
Disconnecting deletes the stored secret and these pages stop asking for the check.
What the client sees#
- The service page with packages, extras, summary and the payment methods you have on.
- The provider's own payment page, then the confirmation page.
- A sign-in code by email if they are new, then their portal with the requirements form waiting.
- Their paid receipt under Invoices.
Permissions#
| Permission | Lets someone |
|---|---|
| Integrations (settings) | Open Settings → Integrations, connect Resend and Turnstile. |
| Payments (settings) | Connect gateways, and edit tax, fee, manual payment and dunning. |
| Record a payment | Confirm or reject manual payments. |
| Client settings | Change the signup rules. |
Tips#
- Test with Stripe test keys before going live, and check that a test order appears under Orders with a paid receipt.
- If orders stop appearing after payments, open the gateway's Manage dialog and look at Callbacks. A run of rejected callbacks usually means a key or secret changed without reconnecting.
- Crypto gateways settle irreversibly. Refunds are sent by hand from the provider's dashboard and then recorded in ClientOS.
- Keep the processing fee off unless your market expects it. It adds friction at the moment of purchase.