Hosted checkout
A fast, mobile-first payment page in English and Bangla. If a customer refreshes, goes back or opens two tabs, they are still charged only once.
Sandbox open. No real money moves yet.
X-Pay takes payments for Bangladeshi businesses and tracks every poisha from checkout to bank payout, on a ledger that has to balance before anything moves.
Test every outcome, including the ones that go wrong.
| Journal entry | Debit | Credit |
|---|---|---|
| Provider receivable | 1,000.00 | |
| Merchant payable | 975.00 | |
| Fee revenue (sample 2.5%) | 25.00 | |
| Balanced | 1,000.00 | 1,000.00 |
Money is stored as whole poisha. No rounding drift, ever.
Payouts, fee changes and bank account changes need a second approver.
Customers pay on the provider's hosted page. We never see card data.
A release test matrix for the failures that cost real money.
Features
One system for taking payments, handling what goes wrong and paying merchants out.
A fast, mobile-first payment page in English and Bangla. If a customer refreshes, goes back or opens two tabs, they are still charged only once.
Our records, the provider's report and the bank statement are compared every day. Merchants become payable only when all three agree. Differences go to a queue that two people resolve.
Full or partial, never more than was paid. Large refunds need a second person.
Deadlines, reminders and evidence upload, with the disputed amount held automatically.
Daily batches with a cut-off and holiday calendar. A payout counts as paid only when the bank shows it.
Every event is signed and retried for up to 24 hours, with a delivery log you can resend from.
Give each person only what they need, down to a single store. Two-step sign-in included.
Opening balance, every movement, closing balance. Export it for your accountant.
No website? Send a payment link or invoice. Opening it twice never creates a second payment.
Versioned fee schedules, with the fee frozen on each payment. Later changes never re-price old orders.
How it works
Your server creates a session; the customer pays on the hosted page.
A browser redirect proves nothing. Only a verified provider answer counts.
One balanced journal entry, however many times the provider calls back.
Provider report and bank statement are matched against the ledger.
Approved by two people, sent to your bank, confirmed by the statement.
Who it is for
Merchants
Developers
# Create a payment session
curl -X POST "$XPAY/api/v1/payment-sessions" \
-u "$KEY_ID:$SECRET" \
-H 'Idempotency-Key: session-ORDER-1001' \
-H 'Content-Type: application/json' \
-d '{
"merchant_order_id": "ORDER-1001",
"amount_minor": "100000",
"currency": "BDT",
"description": "School fees",
"return_url": "https://shop.example.com/done"
}'
Finance and operations
Security
The rules live in the database as well as the code, so a bug cannot quietly link one merchant's money to another's or rewrite a journal.
Mandatory for staff. Sensitive actions ask you to confirm it is you again.
Customer details and credentials are encrypted at rest, with rotating keys.
Append-only events, exported in a hash chain and verified daily.
Pause payments, refunds or payouts in seconds during an incident.
Enforced by database keys, so one merchant can never reach another's data.
A restored copy starts locked and cannot move money until its ledger checks out.
Status
Software being finished is not the same as being ready for real money. Here is the honest picture.
The whole system works against a built-in payment simulator. No real money.
Licensing, partner agreements, certification, security and accounting reviews.
A small group of merchants with low limits and a daily finance review.
Limits rise only after each recorded review of the pilot's results.
Planned payment channels, once partner agreements are signed: bKash, Nagad, Rocket and bank cards. None is connected yet.
Create a sandbox account and run real scenarios: timeouts, late callbacks, refunds and disputes. No real money involved.