UnifiWallet Payments

The buyer pays. You are paid. Same transaction.

No settlement window, no payout to request, no balance anyone could freeze — the money leaves their wallet and arrives in yours, and we are never in between. Then everything a real shop needs on top of that: holds for goods you ship, subscriptions, splits, and tax records you can file.

Why it settles now

There is no settlement delay because there is no settlement step.

Every other gateway receives your money and then sends it on, which is where the waiting, the reserves, the payout schedule and the frozen accounts all come from. The transaction your customer signs pays you directly, so none of that exists to go wrong.

Nothing to reconcile

No balance accumulates with us, so there is nothing to withdraw and nothing of yours to hold back. Your settlement address is a wallet whose key only you have.

Nobody can redirect it

The settlement contract has no owner, no admin key and no upgrade path. We cannot move your funds, pause your payments, or change a payment already on its way — not under pressure, not by mistake.

The quote is the settlement

Fee, rate and destination are fixed onto the payment before your customer sees a checkout, and rounding that lands between units resolves in your favour rather than ours.

Built for shops, not for demos

The things that made crypto unusable for real commerce.

Each of these came out of comparing this gateway against Coinbase Commerce, Daimo, NOWPayments, BTCPay, CoinGate and Loop, finding it short, and building the missing piece.

Hold the money until you ship

Authorize at checkout, capture when the parcel leaves — in full, or in part if you shipped part of it. Void and the buyer is whole. Do nothing at all and they reclaim it themselves once the window expires, without needing us or you. Most crypto gateways settle instantly and irrevocably, which turns every cancellation into a refund you fund yourself.

Buyers who hold only USDC can pay

They sign; we submit and pay the gas. No native coin, no separate approval step, no "insufficient ETH for gas" at the last screen — which is where gateways quietly lose the median stablecoin holder, because holding USDC and no ETH is the normal way to hold USDC.

Your fee ceiling is in the bytecode

MAX_FEE_BPS = 500 is a constant in a deployed contract with no owner and no upgrade path. We could not raise your rate above it if we wanted to, and neither could anyone who acquired us. Everywhere else, the ceiling is a clause in an agreement that can be amended by notice.

Tax records you can actually file

A tax point per payment, the evidence EU VAT asks for, credit notes when you refund, and a fiat valuation captured at the moment of the transaction rather than reconstructed later. Almost no crypto gateway has this, and your accountant cannot close a year without it.

Subscriptions that do not store a card

The buyer signs a spend permission with a limit and an expiry, and revokes it from their own wallet whenever they like. You charge within it. Nobody holds credentials that could be charged after the customer has walked away.

Split one payment across many wallets

Marketplaces pay the seller, the platform and the referrer from the same transaction the buyer signed, in the proportions you set — no float sitting with us between the sale and the payout, because there is no payout.

Changing where money lands is deliberately hard

A new settlement address needs a signature from that wallet, waits out a cooling period, is screened, and emails every owner. This is the attack that empties a merchant overnight, and the friction is the feature.

Test mode rehearses the bad days

Underpayment, overpayment, expiry, late settlement, a chain reorganising under a confirmed payment. Real webhooks, real state machine, no money. You write the unhappy paths before they happen, not during.

Integration

One call, then send the buyer a link.

Create a payment, redirect to the checkout we host, and act on the webhook. Your servers never touch a wallet, a private key or a chain.

import { createHmac, createHash, randomBytes } from 'node:crypto';

const body = JSON.stringify({
  amount: '49.99',
  currency: 'USD',
  merchant_order_id: 'order_1041',
  return_url: 'https://shop.example.com/thanks',
});

const ts = Math.floor(Date.now() / 1000).toString();
const nonce = randomBytes(18).toString('base64url');
const bodyHash = createHash('sha256').update(body).digest('hex');
const message = ['v1', 'POST', '/v1/payments', ts, nonce, bodyHash].join('\n');

const res = await fetch('https://api.payment.unifiwallet.com/v1/payments', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    'X-UW-Org-Id': process.env.UW_ORG_ID,
    'X-UW-Key-Id': process.env.UW_KEY_ID,
    'X-UW-Timestamp': ts,
    'X-UW-Nonce': nonce,
    'X-UW-Signature': 'v1=' + createHmac('sha256', process.env.UW_SECRET).update(message).digest('hex'),
    'Idempotency-Key': 'order_1041',
  },
  body,
});

const payment = await res.json();
// Send the buyer here. They pay from their own wallet.
console.log(payment.checkout_url);

Read the quickstart for the webhook you need to handle and the one status worth waiting for.

Lifecycle

Ship on completed, not before.

These are the states the API actually returns. The distinction that matters is the last one: settling means a transaction exists, completed means it is deep enough that it will not be undone.

created

The payment exists and has a checkout link. Nothing has moved.

awaiting_payment

The buyer has opened the checkout and chosen what to pay with.

settling

A transaction is on chain. Not yet deep enough to rely on.

completed

Confirmed to this chain’s depth. Safe to ship.

The other side of it

What we cannot do for you.

Not holding your money is the point, and it has a cost worth understanding before you integrate rather than during your first refund.

How refunds work · Settlement addresses

A transfer cannot be reversed, and a refund comes from you.

We never received the money, so we cannot send it back. A refund is recorded here with a deadline, and you pay it from your own wallet; we verify it on chain before marking it done.

The same applies to your settlement address. Funds sent to the wrong one are gone — which is why adding one takes a signature from that wallet and a cooling period before it can receive anything.

Start in test mode. No wallet, no chain, no money.

Test keys simulate the whole lifecycle, including underpayment and reorgs, so you can build the unhappy paths before you go anywhere near real funds.