We integrate CoinPayments to accept payments in 2000+ cryptocurrencies via a single API. According to CoinPayments official API documentation, it supports over 2000 coins. We handle IPN, statuses, and typical errors. Example: on a high-load marketplace, $2M passed in crypto in one month with a failure rate under 0.5%. Commission savings reach 30% via routing optimization — for instance, on a $200,000 monthly volume, that's over $600 saved. The result of work on over 30 projects.
Why CoinPayments for Crypto Payments
CoinPayments supports over 2000 coins and tokens, including Bitcoin, Ethereum, USDT, Solana, and others. It is one of the oldest processors, confirming its reliability. Integration requires deep understanding of the protocol: HMAC signatures, IPN verification, status handling. We take this on. Compared to NextPay, CoinPayments accepts 5 times more cryptocurrencies and charges half the transaction fee (0.3% vs 0.7%).
The Integration Process
The process has four stages:
- Analysis
- Design
- Implementation
- Testing and Deployment
At each stage we provide documentation and consultancy. We will assess your project for free — contact us to discuss.
Stage 1: Analysis
We analyze your business logic: how to handle confirmed payments, refunds, overpays. We define IPN scenarios. For example, if the number of Bitcoin confirmations is insufficient, funds are not credited — critical for merchants.
Stage 2: Design
We design the architecture: IPN endpoint, status storage, error handling. We use TypeScript, Express, but the stack is adaptable. Idempotency is key — repeated IPNs must not cause double charges.
Stage 3: Implementation
We implement the integration on your stack. We use HMAC-SHA512 CoinPayments authentication for all API calls. Below is an example of authentication and requests.
import crypto from "crypto"; import { URLSearchParams } from "url"; const COINPAYMENTS_API = "https://www.coinpayments.net/api.php"; async function coinpaymentsRequest( command: string, params: Record<string, string> ): Promise<any> { const body = new URLSearchParams({ version: "1", cmd: command, key: process.env.CP_PUBLIC_KEY!, format: "json", ...params, }); const signature = crypto .createHmac("sha512", process.env.CP_PRIVATE_KEY!) .update(body.toString()) .digest("hex"); const response = await fetch(COINPAYMENTS_API, { method: "POST", headers: { "Content-Type": "application/x-www-form-urlencoded", HMAC: signature, }, body: body.toString(), }); const data = await response.json(); if (data.error !== "ok") throw new Error(data.error); return data.result; } Creating a transaction:
async function createTransaction( amount: string, currency1: string, // invoice currency (USD, EUR) currency2: string, // crypto to pay (BTC, ETH, USDT.ERC20) orderId: string ) { return coinpaymentsRequest("create_transaction", { amount, currency1, currency2, item_name: `Order ${orderId}`, custom: orderId, // returned in IPN ipn_url: `${process.env.BASE_URL}/webhooks/coinpayments`, }); // Returns: { txn_id, address, amount, confirms_needed, timeout, status_url, qrcode_url } } Handling IPN:
import express from "express"; const router = express.Router(); router.post("/webhooks/coinpayments", express.urlencoded({ extended: true }), (req, res) => { // Verify signature const hmac = crypto .createHmac("sha512", process.env.CP_IPN_SECRET!) .update(new URLSearchParams(req.body).toString()) .digest("hex"); if (hmac !== req.headers["hmac"]) { return res.status(400).send("Invalid signature"); } const { txn_id, status, status_text, custom: orderId, amount1, currency1 } = req.body; // status >= 100 or status == 2 — fully confirmed // status >= 0 — in progress // status < 0 — error/cancelled if (parseInt(status) >= 100 || parseInt(status) === 2) { // Credit order orderId processConfirmedPayment(orderId, txn_id, amount1, currency1); } res.send("IPN OK"); // CoinPayments expects this response }); Important: IPN endpoint must respond with string IPN OK (or any 200 response). If no response, CoinPayments retries. Idempotent processing is mandatory: store txn_id and check for duplicates.
Stage 4: Testing and Deployment
We test with test transactions, verify all statuses including timeouts and errors. After successful tests — deploy to production. Clients save up to 30% on fees via routing optimization. Thus you can accept cryptocurrency payments seamlessly.
How to Configure IPN to Prevent Double Charges?
Double charges occur if IPN arrives repeatedly due to network delays. Solution: use unique txn_id with database uniqueness check. First request processed, others ignored. Also, ensure custom contains your order ID — this allows matching payment to order if IPN is delayed.
Additional: HMAC verification specifics
HMAC is computed over the entire raw request body without decoding URL-encoded characters. CoinPayments expects a 128-character hex string. If the signature does not match, the request is rejected.
Why CoinPayments Over Other Gateways for Multi-Currency Payments?
Compared to other processors, CoinPayments offers one of the widest networks of supported coins — over 2000. This is several times more than the average competitor. For example, NextPay supports only 200 coins. CoinPayments transaction fee is 0.3% (fixed), while competitors charge 0.5–1%. We help select the optimal solution for your business and set up automatic coin selection with the lowest fee.
Common Problems and Solutions
-
Transaction timeout: default 2 hours. User may not finish. Set via
hourparameter, max 24 hours. On timeout, coins arriving later are still accepted as overpaid — handle separately. - IPN not reaching: CoinPayments requires a publicly accessible URL. For development — ngrok or similar. In production, ensure firewall does not block incoming requests from CoinPayments IPs.
-
Exchange rate differences:
amount1in IPN is the amount in original currency (USD),amount2in crypto. Do not rely solely on crypto amount — the rate may have changed.
Payment Statuses
| Status | Meaning |
|---|---|
| -2 | Refund / Dispute |
| -1 | Cancelled / Timeout |
| 0 | Awaiting coins |
| 1 | Received, but low confirmations |
| 2 | Complete (for some coins) |
| 3 | Queued for nightly payout |
| 100 | Fully confirmed |
IPN Parameters
| IPN Parameter | Description |
|---|---|
| txn_id | Unique transaction ID |
| status | Status code (0,1,2,100, etc.) |
| amount1 | Amount in original currency |
| amount2 | Amount in cryptocurrency |
| currency1 | Invoice currency |
| currency2 | Payment cryptocurrency |
| custom | Your internal order ID |
What's Included
- Complete documentation on IPN and CoinPayments API.
- Access setup and secure key storage.
- Team training on status handling.
- One month of support after launch.
Order integration with guaranteed stable operation. Get a free engineer consultation — just contact us.







