Start here

5 sections
Overview

Accept non-custodial crypto payments

Finality lets your site accept crypto payments, with funds landing directly in your own wallet—we never touch them. The flow: your backend calls one API to create a payment, you show the address to your customer, and once they pay we notify you via webhook within seconds. It's the payment-gateway experience you already know—minus the custody, freezes, and settlement delays.

The core principle: we never hold your funds or private keys. The protocol fee is split out atomically on-chain, so you always receive the net amount. Your customer just sends a normal transfer—from any wallet or an exchange withdrawal—with no wallet connection or contract calls required.
Start here

Pick your path

No code

Take payments without writing code

Everything here is done by clicking, copying and pasting. If you can install a WordPress plugin, you can do this.

First: set up your account (once)

  1. 1Sign in and open Settings. Paste the wallet address where you want to be paid — one per blockchain you want to accept. This is the address the money goes to, so double-check it.
  2. 2Open the API keys page and create a key. Copy it somewhere safe; it's shown once. Start with a key beginning sk_test_ if you want to rehearse without real money.
  3. 3Copy your webhook secret from the same page. The plugin needs it to confirm that incoming notifications really came from us.
That payout address is the only place your money ever goes. We never hold it, so there is no balance to withdraw and nothing for us to freeze — but it also means a wrong address cannot be undone. Check it twice.

If you have an online store

Install the plugin for your platform, then paste the API key and webhook secret you just copied. Crypto appears as a payment method at checkout, and paid orders update themselves.

WooCommerceUpload plugin → Settings → PaymentsFull checkout integration. Orders move to Processing automatically once the money settles on-chain.
WordPress (no store)Upload plugin → paste a shortcodeFor tips, donations, memberships or a single product. Put [finality_pay amount="49"] on any page.
ShopifyDeploy the app → install to your storeShopify only allows certified partners inside its checkout, so this app sends the customer a payment link after they order, then tags the order once it settles.

If you don't have a store

You don't need a website at all. A payment link works over email, WhatsApp, Telegram, or printed as a QR code.

  1. 1In the dashboard, create a payment: enter the amount and what it's for.
  2. 2Copy the link, or download the QR code.
  3. 3Send it to your customer. They open it, pick which coin to pay with, and send the payment from any wallet — or straight from an exchange withdrawal.
  4. 4You get an email the moment it settles, and the payment shows up in your dashboard.

How you'll know you got paid

The money arrives in your wallet directly — there's no 'finality balance' in between. You'll see the payment in your dashboard within seconds, with a link to the blockchain record so you can verify it yourself.

Two situations to watch for. If a customer sends less than the total, the order stays open until they top it up — you'll see 'partially paid'. If a payment arrives after the window expired, it shows as a late payment and the funds sit in that order's address; you can recover them from the dashboard. Neither loses money, but both need you to look.
How it works

How it works

Four steps, fully automated. You only implement steps 1 and 4:

1Create a payment from your backend

When a customer checks out, your server calls POST /v1/intents with the amount, chain, token, and your order ID. You get back a dedicated pay address and a hosted checkout link.

2Show it to your customer

Display the pay address (or a QR code, or our hosted checkout page). The customer sends a normal transfer from any wallet—no wallet connection or contract calls needed.

3We detect the payment

Our self-hosted full nodes detect the payment the moment it lands in a block—no waiting for multiple confirmations.

4We notify you via webhook

Once the payment is confirmed we POST a signed event to your webhook. You verify the signature and fulfill the order or redirect to a success page. Funds have already been split to your wallet atomically per your rules.

Quickstart

Integrate in 5 minutes

  1. 1Create an API key in the dashboard and configure your payout wallet address and webhook URL.
  2. 2When a customer checks out, call the create-payment endpoint from your backend to get a pay address.
  3. 3Show the address or QR code to the customer, or redirect them straight to our checkout page.
  4. 4Implement your webhook handler: verify the signature and treat payment.settled as a successful payment.
Create a payment · cURL
curl -X POST https://finality.money/v1/intents \
  -H "Authorization: Bearer sk_live_..." \
  -H "Content-Type: application/json" \
  -d '{
    "chain": "solana",
    "token": "USDC",
    "amount": "1240.00",
    "merchant_order_id": "your-order-9527",
    "webhook_url": "https://your-site.com/webhooks/finality"
  }'
Response · 201 Created
{
  "id": "9aRtUe2c-4f1b-4c3a-9e77-2b8d5f0a1c33",
  "chain": "solana",
  "token": "USDC",
  "amount": "1240.00",
  "pay_address": "7xKq...dedicated pay address...3fBw",
  "pay_url": "https://finality.money/pay/9aRtUe2c-...",
  "status": "pending",
  "expires_at": "2026-07-21T12:40:00Z"
}

Subscriptions? Just as fast

To charge on a recurring cycle (memberships / SaaS) instead of one-time, it's three steps:

  1. 1Create a plan on the dashboard Subscriptions page (name / amount / cycle / currency) and grab the checkout_url. To dry-run at zero cost, create a sandbox test plan first.
  2. 2Drop the checkout_url onto your Subscribe button, appending ?ref=your-user-id for reconciliation.
  3. 3Reuse the same webhook handler: treat subscription.active as provision-service, subscription.charged as a successful renewal.
Dry-run the whole flow at zero cost with a sandbox test plan: hit “Simulate payment success” on the hosted checkout and you'll instantly receive the subscription.active webhook—no real transfer needed. Swap in a live plan to go live. Full details in the Subscriptions section below.