Products
One account for every way money comes in.
Checkout, subscriptions, invoices, links and in-person payments share one balance, one dashboard and one payout. Every payout lands already broken down and matched.
Live in a day · No setup or monthly fees · Token Gesture OÜ, Estonia
// turn on products without changing accounts const account = await payments.products.enable({ checkout: true, subscriptions: true, invoices: true, });
Turn on the products you need. Keep the same account underneath.
Online checkout, recurring billing, invoice collection and in-person payments all write to the same ledger, so finance does not need a new export for every way customers pay.
Checkout, billing and invoice collection work as one system.
Each product can run on its own, but the useful part is the shared operating layer: customers pay through the right surface, while finance sees the same customer, invoice, fee and payout trail.
Hosted when you want speed. Embedded when you want control.
Cards, wallets and regional bank methods sit behind one checkout session. The hosted page keeps card data away from your app, and the API keeps the customer journey in your product.
Plans, trials and recovery rules that share the same ledger.
Monthly, yearly, usage and seat-based plans can move through trials, coupons, upgrades, pauses and cancellations without losing the invoice and payout history.
Send the payment moment wherever the customer already is.
Add a pay button to an invoice, send a deposit link by email or text, or turn a quote into an instalment plan. Reminders stop when the payment lands.
- Pay links for invoices, deposits and part payments.
- QR, email and text links for quick collection.
- Accounting references preserved through settlement.
- Automatic receipt, reminder and paid-state updates.
One deposit in the bank. Every line already matched.
Other providers send one lump sum and leave finance to work out what it covers. Token Gesture sends the breakdown with it: each sale, fee, refund and dispute mapped back to the right customer and invoice.
The surrounding products are included from day one.
You can start with checkout and later switch on in-person collection, disputes, plugins or reporting without opening a second account or moving settlement elsewhere.
Tap to pay on your phone
Take contactless payments without a terminal, then settle them with the same online balance.
Disputes and fraud
Use alerts, scoring and response drafts so preventable losses are handled before they become admin work.
Multi-currency
Price, authorise and settle supported volume across AUD, NZD, USD, EUR and JPY.
Split payments
Support marketplace and partner flows with clear payout ownership and audit history.
API and plugins
Use the API directly, or connect the systems your team already runs for invoices and reporting.
Reports and tax
Export payment, fee, refund and payout records with the tax and reference data finance needs.
Every product works on its own. With executives, it runs itself.
AI executives can sit over the payment account and watch the operating work: failed payment recovery, quote-to-deposit follow-up, refund checks and changed bank-detail review.
| Executive | Watches | Acts on | Outcome |
|---|---|---|---|
| CFO | Payout files | Fees, refunds and failed payments | Matched books |
| CCO | Quotes and deposits | Signed quotes and unpaid links | Faster collection |
| CRO | Refunds and bank changes | Risk checks and review notes | Cleaner approvals |
| Support | Customer payment state | Receipts, refunds and subscriptions | Fewer escalations |
Turn on what you need today. Add the rest later.
Every product comes with the same account. There is no new contract and nothing extra to pay just to switch another payment surface on.
Pricing
Pricing for every industry, not just the hard ones.
Most businesses start on Getting Started. Subscriptions, prepayment and international volume move to Elevated. Specialist is for categories that need human underwriting. Scale is for volume on any tier.
- Retail and e-commerce
- Trades and home services
- Cafes, clinics and professional services
- SaaS and memberships
- Travel, events and ticketing
- Courses, coaching and marketplaces
- Supplements and dating
- Skill gaming and sweepstakes
- Adult, crypto, debt and credit
- Enterprise retail
- Platforms and PSPs
- National franchises
Getting Started
New and mainstream businesses. Retail, trades, cafes, clinics, professional services and non-profits start here.
- No reserve held
- Next-day settlement
- Hosted checkout and payment links
- Cards, wallets and bank payments
- No setup fee and no monthly minimum
Elevated
Recurring billing, prepayment, international volume or delivery before settlement. Subscriptions, travel, events and courses.
- Reserve 0-5%, set at review
- Settlement in 2 business days
- Smart retries and card updater
- Dispute alerts included
- International cards included
Specialist
Categories other providers turn away, a prior termination, or dispute rates above scheme comfort levels.
- 10% rolling reserve, released at 180 days
- Weekly settlement, T+7
- Three acquirers, with cascading
- Pre-dispute alerts and drafted responses
- Reviewed for a lower tier each quarter
Scale
High volume on any tier. Interchange-plus pricing and settlement terms your finance team can plan around.
- Interchange detail on every statement
- Same-day settlement available
- Reserve negotiated, 0% achievable
- All five settlement currencies
- Dedicated account lead
What a month actually costs
Per-transaction fees, refunds and rail charges are where a quote stops matching its headline rate. The estimate keeps the moving parts visible.
The cleanest fee is the one finance can explain.
The public pricing model is deliberately simple: no setup fee, no monthly fee, no hidden minimum and a refund rule that gives the percentage fee back. Final pricing still depends on rail, region, method mix, industry and underwriting.
| Item | Getting Started | Elevated | Specialist | Scale |
|---|---|---|---|---|
| Setup, monthly and annual fees | None | None | None | None |
| Rolling reserve | None | 0-5% | 10% for 180 days | Negotiated |
| Settlement | Next day | 2 business days | Weekly, T+7 | Same day available |
| Dispute fee | EUR 15 | EUR 15 | EUR 25 | EUR 10 |
| Refunds | Fee returned | Fee returned | Fee returned | Fee returned |
| International cards | +1.2% | Included | Included | At interchange |
| Currency conversion | 1% | 1% | 1.5% | 0.4% |
| Bank payments | 0.5%, capped | 0.5%, capped | 0.8%, capped | Negotiated |
Published prices are indicative only. The rail, country, payment method, industry, chargeback profile and underwriting file determine the final signed schedule.
The rest of the schedule stays visible.
These are the line items a finance team needs before it signs. The final numbers land in the agreement, but the public model is clear about what can appear.
| Item | Fee | When it applies |
|---|---|---|
| Account setup | EUR 0 | Never. |
| Monthly minimum | EUR 0 | No floor, no idle account fee. |
| Chargeback | Rail dependent | Per dispute received, win or lose. |
| Pre-chargeback alert | Rail dependent | Per alert actioned when enabled. |
| Refund | EUR 0.25 | The per-transaction fee is retained; the percentage fee is returned. |
| Retrieval request | Rail dependent | An issuer asks for documentation on a transaction. |
| Cross-border assessment | 0.8% | Card issued outside your settlement region. |
| Currency conversion | 1.4% | Only when the sale currency differs from your settlement currency. |
| Payout | EUR 0 | Any standard schedule, any supported currency. |
Not sure which rail fits?
The AI intake routes the first call as commercial, technical or underwriting-readiness, then our team handles the real decision.
Developers
A typed client, a signed webhook, and honest documentation about both.
The service API is the surface your backend calls on a customer's behalf, authenticated with an X-API-Key header. It authenticates the service, not a person, so it belongs on a server and never in a browser bundle.
// npm install @token-gesture/payments (Node 20+, no dependencies) import { Payments } from "@token-gesture/payments"; const payments = new Payments({ baseUrl: process.env.PAYMENTS_API_URL!, apiKey: process.env.PAYMENTS_API_KEY!, }); const link = await payments.links.create({ invoiceId: "inv_184", customerId: "cus_7f3a91", amount: 412000, currency: "EUR", }); redirect(link.url);
import { verifyWebhook } from "@token-gesture/payments/webhooks"; app.post("/webhooks/payments", express.raw({ type: "*/*" }), (req, res) => { let event; try { event = verifyWebhook({ body: req.body, // the bytes, not a parsed object headers: req.headers, // timestamp + signature, checked together secret: process.env.PAYMENTS_WEBHOOK_SECRET!, }); } catch (err) { // reason: missing_signature | bad_signature | stale | malformed return res.sendStatus(400); } switch (event.type) { case "payment.succeeded": markInvoicePaid(event.data); break; case "payout.paid": reconcilePayout(event.data); break; case "refund.created": markRefunded(event.data); break; case "subscription.renewed": extendPeriod(event.data); break; } res.sendStatus(200); // delivery is one attempt: 200 fast, work after });
# Create a payment link for an invoice curl -X POST https://payments.token-gesture.com/api/service/payment-links \ -H "X-API-Key: $PAYMENTS_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "invoice_id": "inv_184", "customer_id": "cus_7f3a91", "amount": 412000, "currency": "EUR" }' # → 200 OK # { # "url": "https://secure.token-gesture.com/pay/48812", # "payment_id": "pay_01JQ8M2X", # "expires_at": "2026-09-13T04:22:11Z" # } # Read the invoice payment state curl https://payments.token-gesture.com/api/service/invoices/inv_184 \ -H "X-API-Key: $PAYMENTS_API_KEY"
// Reconcile a payout back to the invoices inside it. const payout = await payments.payouts.get("po_01JQ8M2X"); for (const item of payout.items) { await finance.markPaid({ invoiceId: item.invoice_id, paymentId: item.payment_id, fee: item.fee, net: item.net, }); }
The core surface fits on one screen.
Your backend creates payment links, reads invoice state and receives signed webhooks. The hosted page collects payment details, so card data never belongs in your browser bundle.
| Method | Path | Returns |
|---|---|---|
| POST | /payment-links | A signed hosted-page URL for an invoice, customer or subscription. |
| GET | /invoices/{id} | Payment, refund and payout state for one invoice. |
| GET | /payments/{id} | Authorisation result, method, fees and customer reference. |
| POST | /subscriptions | Creates a recurring payment schedule backed by hosted checkout. |
| POST | /refunds | Refunds a payment and returns the percentage fee where the rail allows. |
| GET | /payouts/{id} | Payout items with invoice, payment, fee and net settlement lines. |
| POST | /webhooks/replay | Replays a signed event into your sandbox endpoint. |
Every payment state change we can send you.
Each event maps to a finance action: mark an invoice paid, apply a refund, extend a subscription or reconcile a payout.
| Event | What happened | State change |
|---|---|---|
| payment.succeeded required | Customer paid | invoice paid |
| payment.failed | Payment attempt failed | retry or support |
| refund.created required | Refund issued | invoice adjusted |
| payout.paid required | Settlement paid out | reconciled |
| subscription.renewed | Recurring payment succeeded | period extended |
| subscription.cancelled | Subscription stopped | end scheduled |
| dispute.opened | Cardholder disputed a payment | review required |
Six things that will bite you.
Every API has these. Most vendors let you discover them in production.
Changes always schedule
changePlan writes a pending plan that lands at the period end, upgrades included. Don't tell someone their upgrade is live and don't grant it locally, because the next read still reports the old plan.
No subscription is a 200, not a 404
An account with nothing returns subscription: null inside an envelope. Treat a 404 as "no subscription" and you'll also treat an outage as one, quietly revoking access for everybody.
Free is the absence of a subscription
A zero-priced plan can't be checked out and can't be changed to. Both are refused. Sending one to the processor builds a hosted page for nothing, and the customer sees a payment failure for a plan that costs no money.
The timestamp is part of the signature
X-Webhook-Signature-V2 signs X-Webhook-Timestamp and the body together. verifyWebhook refuses anything more than five minutes out with reason: "stale", and a replay with a rewritten timestamp fails the signature. Rotate the secret if a log ever leaked.
Retries mean an event can arrive twice
Anything but a 2xx is retried for about a day and a half, with the same event id. Return 200 before you do the work, de-duplicate on id, and reconcile against subscriptions.bulk on a schedule rather than trusting that every webhook landed.
subject is the whole integration
Our id is opaque. The gateway doesn't know whether the string is a person or an account. Declare subject at construction and passing the wrong id becomes a compile error instead of an incident.
Build against the sandbox today.
Test keys and a full event simulator are issued the moment you create an account. You don't need to be approved to integrate, only to take live money.
Account
Sign in to your account.
Check your subscription, see when it renews, and cancel or reactivate it.
Welcome back
Sign in with the email you subscribed with.
Taking payments with Token Gesture? Merchant sign in →
AI-guided demo
Book the right demo before you apply.
The intake qualifies your use case, prepares a short brief and routes you to the right human conversation. It does not approve merchants, quote binding rates or assign a processing rail.
Already boarded? Merchant sign in →
AI demo intake
Let the assistant route the call.
It asks the same first questions a person would ask: category, volume, integration shape and urgency. Then it prepares the right handoff.