Try a test payment against our Stripe test account
Not a screenshot and not a description. Below is a finalised Stripe test invoice this server read back before you arrived, the Ontario HST line on it, the approved quote it reconciles to, and a button that creates a fresh Checkout Session in test mode while you watch.
4242 4242 4242 4242
Stripe’s published test card — any future expiry, any CVC, any postal code. It is the only card that will work here, because this account has no live key.
Every object on this page is Stripe test data, in Canadian dollars. No live key exists on this deployment and no real money can move through it.
A finalised Stripe test invoice
This document was read back out of Stripe by this server when the page was generated, against approved quote #9. Nothing was created to produce it — the read is a GET, and the invoice below existed before you arrived. Every figure is Stripe’s, in test mode, in Canadian dollars.
- Invoice number
- P49QOGVA-0009
- Stripe object id
- in_1U1CYgPiVC0ozAWKkZqDpX8k
| Line | Amount |
|---|---|
| Billing sandbox — atrium bank (qty 6) | $3,646.72 CAD |
| HST (13%)Tax line | $474.07 CAD |
| Subtotal | $3,646.72 CAD |
| HST | $474.07 CAD |
| Total | $4,120.79 CAD |
- Amount due
- $4,120.79 CAD
- Finalised
- Aug 5, 2026, 5:41 p.m.
Read from Stripe at Oct 6, 2026, 7:45 a.m. — this section is regenerated on a schedule; a finalised invoice is a document, not a status, so it does not change once written.
Deposit and progress payments, against that invoice
Commercial trade work is not paid in one movement, so the platform carries a milestone schedule and prints it on the proposal the customer signs. Applied to the invoice above, it comes to this. Read the boundary before the numbers: these three amounts are computed by the quoting engine, not issued as three Stripe invoices. One approved quote becomes one finalised invoice today, and a page claiming otherwise would be inventing objects you could go and fail to find.
- Deposit on execution (30%)
- $1,236.24 CAD
- Progress draw (50%)
- $2,060.40 CAD
- Completion & sign-off (20%)
- $824.15 CAD
Due on signature. Releases material procurement and reserves the crew window.
Invoiced at substantial completion of the installed scope, net 30.
Released on inspection sign-off and closure of the deficiency list, net 30.
Shares are read from the same constant the proposal renders, which a build-time assertion holds to exactly 100% — a schedule summing to 95% silently forgives 5% of a contract. Rounding remainder falls on the final milestone so the three amounts add back to the invoice total to the cent.
Create a Checkout Session, now, from your browser
The invoice above proves a document exists. This proves the flow still runs. Pressing the button posts to this site’s own route, which approves a quote in our sandbox tenant and asks Stripe for a hosted payment page against it — then prints the object that came back, including the session id, the total, and the expiry.
Billing sandbox — Stripe test mode
Try a test payment: create a real Stripe Checkout Session
Pressing that button approves a quote in our sandbox tenant, which is the event that makes the Stripe adapter find or create a customer, write invoice items, and finalise an invoice. It then asks the API for a hosted payment page against the same quote. Nothing runs until you press it, because all of that leaves objects behind in a real Stripe account.
Stripe mode
Test mode. Every object this button creates carries a cs_test_ or in_ id in our Stripe test account, and the mode printed after a run is read off the object itself rather than off a sentence here.
Test card
4242 4242 4242 4242
Stripe’s published test card. Any future expiry, any CVC, any postal code. No money moves — the charge exists only in our test account.
Nothing has been created yet. The panel fills in with the session id, the amount, the expiry, the payment link, and the finalised invoice — its number, its line items, its HST line and its total — once you run it.
How Stripe test mode maps to our tiers — and what it does not
- What Stripe bills here
- One approved quote, for one of your customers, as one invoice. The adapter runs on quote approval and writes a Customer, an invoice item per approved line, an explicit tax line, and a finalised invoice. Optionally a Checkout Session against the same quote, only when somebody asks for one.
- What Stripe does not bill here
- Your Novel Systems subscription. Starter Operator, Growth Contractor and Enterprise Fleet, the implementation fee, and seat and vehicle overage at $45 and $25 per month are contracted and invoiced directly — there is no Stripe Product, Price or Subscription behind any of them, and no recurring-billing model in the schema. A tier is not a price object in this account and this page will not imply it is.
- How the amounts are set
- Each line is sent as an explicit integer amount in cents, taken from the approved quote. Stripe is never handed a unit price and a quantity to multiply, because a recomputed line lands a cent away from the document the customer signed.
- How HST is handled
- Ontario HST at 13% is posted as its own invoice line rather than folded into the total, and the same is done on the Checkout Session. The line's description comes from a single constant that the read-back path also matches on, so the rate cannot move on one side only. Stripe Tax is not enabled on this account: it computes zero until a Canadian registration is configured, and a silent zero on a Canadian invoice is worse than a line you can see.
- How test mode is configured
- The backend holds one Stripe secret key as a server-side environment variable and nothing else declares a mode. Whether an object is test data is read off the object — the cs_test_ prefix on a session, the livemode flag on an invoice — so the badges above cannot be stale, and a hosted payment or invoice link is withheld unless the artifact itself reports test mode.
Plan prices, included allowances and the overage rates quoted above are published on the pricing page, which is the same module this section reads them from.
Reconciled to a work order
The invoice is not a standalone Stripe object. It is written against an approved quote in our sandbox tenant — the exhibit names that quote number — and the paid and payment-reference columns live on the quote row rather than in a status enum, so a quote can be approved and unpaid, or paid against a deposit with a balance outstanding, without any switch in the codebase quietly acquiring a case nobody handled.
The two endpoints underneath are
Read the API referencePOST /api/v1/quotes/{id}/checkout-sessionandGET /api/v1/quotes/{id}/invoice, both published in the API reference alongside the webhook events that close the loop.What is not built
Said here rather than discovered later: subscriptions, payouts and refunds. No code calls those APIs, there is no recurring-billing model in the schema, and nothing on this page should be read as implying otherwise.
Your browser never sees a Stripe key and is never asked for one. The credential is held server-side by this site’s own route; the button sends no body and cannot ask for a different amount or a different quote.
The Stripe connector in the catalogue