incomplete\_expired | First invoice was never paid within 24 hours - terminal |
| `draft` | Start date is in the future |
| `trialing` | Active, in trial period - no invoices yet |
| `active` | Billing enabled. Check the invoice for the period before granting paid access. |
| `past_due` | A renewal invoice is unpaid past the grace period |
| `paused` | Billing paused - no invoices generated |
| `cancelled` | Ended - no further invoices |
| `completed` | Terminal - no further invoices. Open-ended plans normally end as `cancelled`. |
***
## Managing subscriptions
### Pause
```typescript theme={null}
await paybridgenp.subscriptions.pause(subscription.id, {
reason: "Customer requested temporary pause",
});
```
No invoices are generated while paused. Resume resumes billing from the current period.
### Resume
```typescript theme={null}
await paybridgenp.subscriptions.resume(subscription.id);
```
### Cancel
```typescript theme={null}
// Cancel immediately
await paybridgenp.subscriptions.cancel(subscription.id, {
reason: "Customer churned",
});
// Cancel at end of current period
await paybridgenp.subscriptions.cancel(subscription.id, {
atPeriodEnd: true,
});
```
### Change plan
```typescript theme={null}
// Change takes effect at the next renewal
await paybridgenp.subscriptions.changePlan(subscription.id, {
planId: newPlan.id,
});
```
The current period continues on the old plan. At renewal, the subscription switches to the new plan.
***
## Invoices
Invoices are read-only from the API - PayBridgeNP creates them automatically. Use them to display billing history to customers.
```typescript theme={null}
const { data: invoices } = await paybridgenp.invoices.list({
subscriptionId: subscription.id,
});
for (const invoice of invoices) {
console.log(invoice.status, invoice.amount_due, invoice.due_at);
}
```
| Invoice status | Meaning |
| --------------- | ------------------------------------------------ |
| `draft` | Not yet sent |
| `open` | Sent to customer, awaiting payment |
| `paid` | Customer paid |
| `overdue` | Not paid by due date |
| `void` | Cancelled |
| `uncollectible` | Dunning exhausted - written off as unrecoverable |
***
## Webhook events
PayBridgeNP fires webhook events throughout the subscription lifecycle:
| Event | When |
| -------------------------- | ----------------------------------------------------------------------------------------- |
| `subscription.created` | New subscription created (may be `incomplete` until first payment) |
| `subscription.activated` | First invoice paid, a `past_due` subscription recovered, or a paused subscription resumed |
| `subscription.trial_ended` | Trial ended and the first post-trial invoice was generated |
| `subscription.expired` | First invoice never paid within 24h - subscription is `incomplete_expired` |
| `subscription.past_due` | A renewal invoice went past due |
| `subscription.paused` | Subscription paused |
| `subscription.cancelled` | Subscription cancelled |
| `invoice.created` | New invoice generated |
| `invoice.paid` | Customer paid an invoice |
| `invoice.overdue` | Invoice went past due |
# Confirming a payment
Source: https://docs.paybridgenp.com/guides/confirming-payments
Know for certain when a payment succeeded. Use webhooks as your source of truth, and verify server-side before you release value.
A customer landing on your success page is not proof of payment. Confirm every payment on your server before you release goods, credit, or access.
Waiting for scan…
Developer documentation
One checkout call, one signed webhook, and money that settles to your own merchant accounts. Hosted checkout, payment links, subscriptions, Direct QR, and a native mobile sheet.
payment.succeeded
NPR 4,500
eSewa·Verified·Signed
Buyer pays
PayBridgeNP verifies
Your server gets the webhook
Start with a hosted page, build the flow into your own app, or connect the store you already run.
Redirect customers to a payment page PayBridgeNP hosts.
Open guide →Open one native payment sheet inside your iOS or Android app.
Open guide →Send a checkout link in chat or share it as a QR code.
Open guide →Create plans and collect recurring payments on schedule.
Open guide →Create a provider QR for counter, invoice, or in-app payment.
Open guide →From sandbox to production
The same path after you pick an integration above.
Inside the Mobile SDK
Present eSewa, Khalti, Fonepay QR, and bank apps without rebuilding checkout for each provider.
Explore the Mobile SDK →Ask your AI
Connect Claude or ChatGPT to your PayBridgeNP account, or script it from the CLI.
Two ways in
PayBridgeNP Docs
Everything you need to accept payments in Nepal with one API and your own provider accounts.
Accept payments
Developers
Integrations