Lightening Tech Evidence, not opinion

Blockchain & Web3

Crypto payment and wallet integration

Stablecoin checkout added to the product you already have — signature-verified webhooks, idempotent order updates, and no keys or customer funds held by anyone but the processor.

From
$1,000–$10,000
Typical time
2–6 weeks
Usually bought by
E-commerce, SaaS

What this actually solves

Three business problems bring people to this page, and all three are ordinary. The first is customers in markets where card payments are expensive, slow or unreliable, who are already asking whether they can pay another way. The second is chargebacks — a merchant tired of shipping goods and then losing both the goods and the money months later. Settled crypto payments cannot be reversed, which removes that particular loss and, in fairness, removes your customer's protection too. The third is cost, and the honest version is that it depends entirely on your processor, your currencies and your volumes — we price both routes before you commit.

What makes this the safest place to start in this whole category is what you are not doing. You are not launching a token. You are not writing a contract that holds anyone's money. You are not custodying keys. A hosted processor does the dangerous part, and your application does what it already does for cards — create a payment, send the customer somewhere to pay, and update an order when told it is done. The entire risk of the project concentrates into one small piece of code, the webhook handler, and that is where the engineering attention belongs. Failures in a crypto checkout trace back to that endpoint being trusted more than it deserved.

How the integration runs

  1. Processor selection and the pricing question. We choose between hosted processors such as NOWPayments and Coinbase Commerce, or a self-hosted BTCPay Server if you have a specific reason to hold custody, based on your currencies, markets and settlement preferences. Then the question everyone forgets — your prices are in dollars and the payment arrives in crypto, so which moment's exchange rate applies and for how long is that quote held before it expires. Two to four days.
  2. Checkout flow and order states. Payment creation, redirect to the processor's hosted page, return handling, and an order state machine that includes awaiting payment, pending confirmations, underpaid, overpaid, expired and paid. Those middle states are where real payments live for minutes at a time, and a system that only knows unpaid and paid will lie to your staff and your customers. Three to five days.
  3. The webhook handler, built properly. The signature is verified against the shared secret using the raw request body before anything parses it as JSON, because parsing first is what silently breaks verification, and a broken check still looks like a working one. Delivery is made idempotent by a unique database constraint on the processor's event id, not by application logic alone, so the same event arriving five times or twice simultaneously cannot mark an order paid twice. Confirmation thresholds are configured per currency, with anything below the threshold held in a pending state. Under and overpayment are handled as explicit outcomes with a tolerance you set. Every raw event is logged for later reconciliation. Four to eight days.
  4. Adversarial testing on the sandbox, then one real payment. The test plan is deliberately hostile — a replayed webhook, a webhook with a tampered signature, a duplicate delivery of the same event id, an underpayment inside and outside tolerance, and a payment that arrives after the quote expired. Only when all of those behave correctly do we run a small genuine payment on mainnet with our own funds before handing over. Three to five days.
  5. Reconciliation, refunds and handover. An accounting export that ties each order to its transaction hash and settled amount, a written refund procedure since refunds are a manual outbound payment rather than a button, and a handover paragraph in plain language your support team can actually use when a customer asks for their money back. Two to four days.

What moves the price

What you are integrating into. A hosted checkout dropped onto a Shopify or WooCommerce store sits at the bottom of the range. A custom SaaS with subscriptions, seat changes, proration and dunning sits at the top, because recurring billing in an irreversible payment rail is a genuinely harder problem than one-off orders.

How many currencies and chains you accept. Each additional asset brings its own confirmation threshold, its own fee behaviour and its own accounting treatment, and the same stablecoin on three different networks is three configurations, not one.

How deep the reconciliation has to go. Marking orders paid is the easy half. Feeding settlement data into your accounting system so month-end closes without anyone reading a block explorer is the other half. The range is $1,000–$10,000 over 2–6 weeks, and wallet sign-in is scoped and quoted separately from checkout.

What usually goes wrong

The webhook is believed because it says paid. That endpoint is a public URL on the open internet, and anybody who finds it can post a convincing JSON body to it announcing that order 1042 is settled. The only thing separating a real notification from a forged one is the signature, and it has to be verified against the raw body before the body is parsed — verifying after JSON parsing usually fails silently in exactly the way that looks fine in testing. Every integration we take over gets checked for this first.

The handler is not idempotent, so one order ships twice. Processors retry deliveries by design, not by fault, and a retried event will arrive after a timeout, after a deploy, sometimes concurrently with the original. If the only protection is an if-statement checking whether the order is already paid, two simultaneous requests will both pass it. The protection has to be a unique constraint in the database on the event id, so the second write fails at the storage layer rather than depending on timing.

The order is marked paid at zero confirmations. The payment appears, the code sees it, and goods are released before the network has agreed the transaction is final. On a fast chain the window is small and on a slow one it is not, and a low-value order and a high-value order should not use the same rule. Confirmation counts are configured per currency with an explicit pending state in between, and that threshold is a commercial decision we put in front of you rather than a default we choose silently.

See where the site stands before you brief anyone.

If the site is already live, start from what it scores rather than from a guess. The audit reports what it checked, what it found, and — the part most tools leave out — what it could not check, and why.

See the website audit Talk about this work

Questions people ask before they commit.

Will you or we be holding customer funds or private keys?
Neither. The integration runs through a hosted payment processor that takes custody, handles conversion and manages the wallets. Your application creates a payment, redirects the customer, receives a signed webhook and updates an order — the same shape as any card gateway integration. Self-custody through something like BTCPay Server is possible if you specifically want it, and it is a materially larger commitment because the keys and the uptime become yours.
What happens when a customer underpays or overpays?
They become explicit order states with a tolerance you configure, never silently treated as paid. Underpayment happens for ordinary reasons — a customer sends the amount but not the network fee, or the quoted rate expires mid-transfer. The system holds the order, records exactly what arrived, and routes it to a human decision rather than shipping or cancelling on its own.
Can we refund a crypto payment?
Not automatically, and this is the single largest operational difference from cards. There is no reversal mechanism — a refund is a new outbound payment your team chooses to make, to an address you have to obtain and verify. The upside is the same fact from the other direction, since chargebacks do not exist here. We write the refund process into your handover document in plain language so support staff know what they can and cannot promise.
Which currencies should we accept?
We generally recommend restricting to major stablecoins. If you price in dollars and accept a volatile asset, you have added a currency exposure to a business that did not ask for one, and an overnight move can wipe out the margin on the sale that created it. Stablecoins keep the transaction being a payment rather than a position.
How does this change our accounting?
Every settled payment carries a transaction hash, a received amount, a confirmation count and a timestamp, and all of that has to reach your books. We build an export that reconciles against the processor's own records and against the chain, and we log every raw webhook event received, because the reconciliation question you will eventually be asked is about one specific order six months ago.
Can customers sign in with a wallet instead of a password?
Yes, using Sign-In With Ethereum. Your site issues a phrase, the customer signs it with their wallet, and your server verifies the signature — no password, no transaction and no network fee. It is useful for members-only areas, holder-gated content and anywhere you only need to prove somebody controls an address. It is quoted separately from checkout because it is a different piece of work.

Often taken together.

Start with the brief, not the invoice.

Send what you are trying to achieve. You get a written scope, a price and a date — or an honest “this is not the right service for that”.

Talk about Crypto payment & wallet integration All Blockchain & Web3 services