Accepting Bitcoin and Litecoin While Pricing in Dollars
Selling a $50 product for Bitcoin means answering one awkward question: fifty dollars at which price? Get the answer wrong and either you are short or your customer is.
The problem stablecoins do not have
A USDT invoice for $50 asks for 50 USDT. There is nothing to convert and nothing to argue about.
A Bitcoin invoice for $50 asks for some fraction of a bitcoin, and that fraction changes every second. If the price moves between the moment you show a number and the moment the customer sends it, someone absorbs the difference.
Rate locking
The fix is to fix the rate when the invoice is created and keep it for the whole life of that invoice. The customer sees one number, sends exactly that number, and it matches.
The rate is stored with the invoice, so the fee and the reported amount are all computed from the same figure. Fetching a fresh rate at settlement time would mean the amount the customer already sent no longer matches what the system expects.
- The rate is captured once, at invoice creation
- It never changes while the invoice is open
- Fee is charged on the USD value, not on the coin amount
- The callback reports USD, so shop code does not need to know about conversion
Who takes the price risk
Between creation and payment, the price can move. Because the amount is fixed in coin, you receive a coin quantity whose dollar value may be slightly above or below the invoice.
Keeping invoice windows short limits this. An invoice open for fifteen minutes carries far less risk than one open for two hours, which is the real argument for a shorter expiry rather than any technical constraint.
Precision matters more than it looks
Rounding the coin amount too coarsely is a silent leak. Round a Bitcoin amount to six decimal places and each step is worth about eight cents at recent prices — on a $10 order that is nearly one percent, more than most gateway fees.
Amounts should be carried at the chain's own precision, not at whatever looked tidy. Bitcoin has eight decimals; use them.
What your server should read
The callback reports the amount in USD, the amount actually sent on chain, and the locked rate. Credit the USD figure. Keep the coin amount for reconciliation against a block explorer.
This keeps existing shop code working unchanged: it reads the same amount field it always did, and never has to learn that a payment arrived in a different currency.
Frequently asked questions
- What happens if Bitcoin's price moves after the invoice is created?
- Nothing changes for the customer — they pay the amount they were shown. The dollar value you receive may differ slightly, which is why shorter invoice windows reduce exposure.
- Is there a minimum payment for Bitcoin?
- Yes, and it is higher than for stablecoins because Bitcoin network fees are higher. A very small payment can cost more to send than it is worth.
- Do I get paid in Bitcoin or in dollars?
- In Bitcoin — it goes straight to your wallet. The dollar figure is how the invoice was priced and how the callback reports it.
- Which volatile coins can I accept?
- Bitcoin, Litecoin, Solana, Ethereum and BNB are all supported with USD pricing and locked rates.