---
title: Checkout page
description: How the Coinetic hosted crypto checkout page works, how to open it from your website or mobile app, and how to bring the customer back after payment.
url: https://coinetic.money/docs/checkout/
lang: en
---

# Checkout page

We build and host the checkout page. Your server just redirects the customer to it using the `checkout_url` from the invoice creation response.

## What the customer sees

- The order amount and the invoice countdown timer.
- A currency picker showing only the invoice's currently available assets.
- After choosing: a QR code, the exact amount with a “Copy” button, the address, a network warning and an “Open in wallet” link (BIP21, EIP-681, Solana Pay, TRON).
- A status that updates on its own: “Payment detected” → “Confirmations 7/20” → “Payment received.”
- A “Return to store” button that leads to your `return_url`.

Until something is paid, the customer can switch currencies. After the first payment, the currency is locked. For volatile assets, a rate timer runs (20 minutes); when it expires, the amount and address are hidden.

The page is available in English and Russian, with light and dark themes that follow the device settings.

## How to open it

| Where | How |
| --- | --- |
| Website | Navigate in the same tab: `303 See Other` from your server, or `location.href` |
| iOS | `ASWebAuthenticationSession` or `SFSafariViewController` |
| Android | Chrome Custom Tabs (`androidx.browser`) |
| Telegram bot | An inline button linking to `checkout_url` |
| **Don't use** | `iframe`, `WKWebView`, `WebView`: there's no address bar (so phishing is indistinguishable), and wallet links are unreliable. The page blocks embedding (`frame-ancestors 'none'`) |

> **Mobile apps.** The app never calls the Coinetic API directly and never stores the key secret, which can be extracted from a build in minutes. Your server creates the invoice when the app asks and hands the app only the `checkout_url`.

## Bringing the customer back

- The customer may come back before paying, during confirmations, or not at all. Your order page shouldn't depend on it.
- You can include the order number in `return_url`, but **take the status from your own database**, which the webhook keeps up to date. If the order isn't paid yet, re-check with `GET /v1/invoices/{id}`.
- For apps, pass a universal link (Universal Links / App Links): `https://shop.example/app/orders/ORDER-1001`. Custom schemes (`myapp://`) aren't accepted.

## Common situations

| Situation | What to do |
| --- | --- |
| The customer closed the tab | Add a “Continue to payment” link to `checkout_url` on the order; the invoice stays valid until `expires_at` |
| The invoice expired | Create a new invoice with a new `order_id` (for example, `ORDER-1001-2`) and a new `Idempotency-Key` |
| Underpayment | “Send the remaining balance to the same address”: the checkout page shows what's left |
| Late payment | The funds have arrived, and the call is yours: fulfill the order or issue a refund |
| AML review | Let the customer know the payment is being reviewed; wait for `invoice.paid` |
