YooKassa payments wizard

The «YooKassa payments» wizard assembles a complete payment flow: order → payment → status page → notification receiver. This walkthrough covers every wizard field, the three scenarios it builds, wiring the YooKassa dashboard, and verifying the chain on a test shop.

YooKassa processes the payment and tells your site about the result. For that to work a site needs four things: an «Order» content type, a checkout scenario, a status page, and a notification receiver. The wizard builds all of them at once — you only supply the shop credentials and two clicks in the YooKassa dashboard.

What you need

  • Shop ID — YooKassa dashboard → Settings → Shop.
  • Secret key — Settings → API keys. The key of a test shop works for a trial run.
  • A scenario whose canvas hosts the checkout (an empty new one is fine).

Where to find the wizard

Admin → «Сайт» (Site) → a scenario → toolbar → «Пресеты» (Presets) → the «YooKassa payments» card. The wizard is also offered when creating a scenario — the creation dialog has a «Start from a preset» field.

Preset gallery: the «YooKassa payments» card

Wizard fields

Field What to enter
Order content type An existing orders type, or let the wizard create «Orders» (order) with title, amount, status, payment_id
Shop ID From the YooKassa dashboard; digits only
Amount field The type property that stores the amount (amount); 990, 990.5 or 990.00 all work — YooKassa receives "990.00"
Status field The order status property (status)
Shop secret key The shop’s API key; it lands in Secrets as yookassa_basic and never appears in the scenario as plain text
Notification URL secret A random string ≥8 chars — it becomes part of the receiver URL you paste into the dashboard
Site address https://your-site — buyers return there and notifications arrive there
Return page path Where buyers land after paying, default /payment/return

The wizard form: order type, Shop ID, amount and status fields, secret key and notification URL secret

What the wizard builds

One click of «Create» adds three scenarios, two routes and a template to the project:

Artifact Role
Main scenario (onto your canvas) Order → payment → redirect to YooKassa
payment_return scenario Status page: shows «paid / processing»
yookassa-hook scenario Notification receiver: flips the order to «paid»
Route <return path> (GET) Hosts the status page; cache disabled (TTL 0)
Route /yookassa-hook/<secret> (POST) Receives notifications; cache disabled (TTL 0)
payment_return.liquid template Status page markup — editable under Files

The main chain reads top to bottom: Start → GraphQL (create an order with status pending) → HTTP POST to api.yookassa.ru/v3/payments — Basic auth from Secrets, a fresh uuid as the idempotence key — → GraphQL (attach payment_id to the order) → Redirect 303 to the confirmation_url from the YooKassa response.

The finished checkout scenario: order → payment → payment_id → redirect to YooKassa

The notification receiver works like this: the order is looked up by payment_id and amount from the notification; on a match the status flips to paid and YooKassa gets 200 {"ok":true}, otherwise 400 {"error":"mismatch"} and the order is left untouched.

Wire up the YooKassa dashboard

  1. Copy the receiver URL from the wizard’s hint: https://<site address>/yookassa-hook/<secret>.
  2. YooKassa dashboard → Settings → HTTP notifications → paste that URL.
  3. Subscribe the payment.succeeded event — it is all you need to mark orders as paid.

Verify on a test shop

The chain is verified end-to-end against a YooKassa test shop:

  • placing an order redirects to the yoomoney checkout (303) and returns the buyer to the status page after payment;
  • the notification gets 200, the order flips to «Paid», the return page shows the paid state;
  • a notification with a foreign amount gets 400, the order stays untouched;
  • a request with a wrong URL secret gets 404.

Fine print

  • The amount is normalized by the money filter — enter 990, 990.5 or 990.00; YooKassa always receives "990.00": Liquid prints numbers in minimal form («990»), so the format is pinned by the filter, not the field type.
  • YooKassa does not sign its notifications — instead of a signature check the wizard relies on an unguessable URL secret plus an amount cross-check against the order. Subscribe only to payment.succeeded.
  • 54-FZ receipts are out of scope — wire them separately if you need fiscalization.
  • payment_id does not exist yet at checkout — the scenario attaches it in a second request after the payment is created.
  • Both pages are never cached (TTL 0): status and webhook always answer with live data.
  • The amount is cross-checked against the order: if a visitor opens the status page before paying, the template honestly shows «not paid yet».

FAQ

Question Answer
Every notification gets 404 The URL secret does not match or the yookassa-hook scenario is not published. Compare the dashboard URL with the wizard’s hint.
The order never turns «Paid» Check the notification URL is in the dashboard and the order amount equals the payment amount — a mismatch answers 400.
Can I charge non-rubles? The RUB currency is baked into the payment node — change it in the HTTP POST node on the canvas.
The return page says «not paid yet» after paying Refresh in a minute — the notification may still be in flight. If it persists, compare the notification URL and the yookassa-hook runs journal.

See also: Scenario presets · Action nodes · Draft, preview and publish