Every Nepali store needs at least two of three payment rails: Khalti, eSewa, and FonePay. Cash-on-delivery is the fourth. We bake all four into every Vinoraam store, but you still need to plug in your merchant credentials to actually receive money. Here's the exact sequence.
Before you start
You need approved merchant accounts from each provider. They take 1–7 working days:
- Khalti — apply at khalti.com/merchant. Requires PAN, company registration, and a recent bank statement.
- eSewa — apply via my.esewa.com.np/business. Requires the same plus a fee schedule signature.
- FonePay — easiest of the three; apply via fonepay.com/business and most stores are approved in 48 hours.
Have these documents ready as PDFs before you start the applications.
Step 1 — Khalti
Once your Khalti merchant account is live, you get a Public Key and a Secret Key from the merchant dashboard.
Inside your Vinoraam dashboard, go to Settings → Payments → Khalti. Paste both keys, save, and tick "Enable on storefront". The webhook URL Khalti needs is shown on the same screen — copy it into your Khalti dashboard under "Webhook settings".
Test the connection with the Test transaction button. If it goes green, you are live. If it fails, the most common cause is that you pasted the test mode key into the live mode field, or vice versa.
Step 2 — eSewa
eSewa gives you a Merchant Code and a Secret Key. The Merchant Code is what shows up on the customer's eSewa app when they pay you, so make sure it matches your brand name.
Paste both into Settings → Payments → eSewa and save. The success and failure return URLs are pre-filled — you do not need to touch them. eSewa does not use webhooks; payment confirmation happens on the redirect, which Vinoraam handles automatically.
Step 3 — FonePay
FonePay is the simplest. You get a single Merchant ID and a Secret. Paste, save, done.
The one thing to know: FonePay supports QR-code payments natively. If you tick "Show QR fallback on checkout", customers who don't have the FonePay app can scan a QR with any banking app that supports FonePay (most of them do).
Step 4 — Cash on Delivery
COD is enabled by default. The one setting worth changing is the COD handling fee — most stores set this to NPR 50–100 to cover the cost of cash collection. Add it under Settings → Payments → COD.
Common gotchas
- Test vs live keys — Khalti's test keys start with the prefix "test_" and live keys with "live_". Mixing them silently fails.
- eSewa Merchant Code case-sensitivity — must be uppercase. eSewa returns errors that don't tell you this.
- FonePay HTTPS requirement — FonePay rejects redirects to HTTP. If you're testing on localhost, use a tunnel like ngrok.
- Webhook timeouts — all three providers will retry webhooks for up to 24 hours, but if your server is slow (>10s response), they may mark the transaction as failed even though the customer paid. Keep your hosting close to Nepal (Singapore at minimum) to avoid this.
That's it. You're now accepting payments via every method your customers actually use.
