What this setting does
In Manual Mode, money moves outside a PSP API. When the
customer taps Mark as Paid, they first see a confirmation dialog
(SweetAlert) whose copy depends on this setting. After they confirm and mark paid succeeds,
SkyPay needs a rule: keep them on a verifying screen until you Complete, or auto-redirect
to success_url immediately.
That rule is configured per Manual Mode provider in the dashboard under manual_configuration.after_mark_paid.
How it works
Both options start with a confirm dialog, then set status to waiting. The fork
is what happens next: stay on verifying until you Complete (wait), or
auto-redirect to success_url right away while you confirm later
(continue).
wait · default
Stay on verifying until Complete
- Confirm dialog first (SweetAlert)
- Stays on verifying / polling — no auto redirect
- Redirect to
success_urlafter you Complete - Webhook:
payment.completedon Complete
continue
Auto-redirect right after Mark as Paid
- Confirm dialog first (SweetAlert)
- On success → immediate redirect to
success_url - Return status is still
waiting— fulfill only on completed - Later Complete →
payment.completed
Both paths create a waiting payment — only redirect timing and the verifying screen differ.
Dashboard settings
Open Payment Providers, edit a Manual provider, and choose After mark paid:
Wait for confirmation
wait · default
After confirm + Mark as Paid, checkout stays on verifying and polls until you mark
Complete, then redirects to success_url.
Best when your team confirms transfers quickly (minutes). No auto redirect after
Mark as Paid — the customer stays on verifying until status becomes complete (or the session ends).
Continue after mark paid
continue
After confirm + Mark as Paid succeeds, checkout auto-redirects to success_url immediately. Status on return is
still waiting.
SkyPay fires payment.waiting on Mark as Paid. When you mark Complete
later, SkyPay fires payment.completed. Wire your backend to fulfill
from completed — not from the browser return alone.
Option: Wait for confirmation
Value: wait (default). Label in the dashboard: Wait for confirmation.
- 1
Customer pays via QR or bank
Money lands in your account
- 2
Confirm dialog (SweetAlert)
Copy explains they stay until you verify
- 3
Mark as Paid succeeds
Status: waiting · stays on verifying
- 4
You mark Complete
Status: complete · payment.completed
- 5
Redirect to success_url
Then fulfill from webhook / verify
No auto redirect after Mark as Paid — redirect only after you mark Complete.
- Customer taps Mark as Paid → confirmation dialog (SweetAlert) first.
- After confirm succeeds, checkout stays on a verifying screen — no auto redirect.
- SkyPay polls until the merchant marks Complete.
- Then the customer is redirected to
success_url. payment.completedfires when you confirm — fulfill from that (and verify), not from the redirect alone.
Example · wait
Kathmandu freelancer confirming eSewa / bank in 5–10 min
A designer invoices NPR 8,000 via Manual Mode. The client pays by bank transfer, confirms
Mark as Paid, and stays on verifying while you check your statement on your phone and
mark Complete. They land on success_url and you
email the files.
- Customer sees: confirm dialog → verifying spinner until you Complete
- You do: match amount / reference, mark Complete
- Webhooks:
payment.completed(and typically waiting on mark paid) - Fulfill when: status is
completeafter verify
Option: Continue after mark paid
Value: continue. Label in the dashboard: Continue after mark paid.
- 1
Customer pays via QR or bank
Money lands in your account
- 2
Confirm dialog (SweetAlert)
Copy explains redirect + later unlock
- 3
Mark as Paid succeeds
Status: waiting · payment.waiting
- 4
Auto-redirect to success_url
Immediate — status still waiting
- 5
You Complete later → fulfill
payment.completed — not the return URL
T+0
Confirm + Mark as Paid
Auto-redirect · still waiting
Later
Ops reviews transfer
Customer already on success_url
Complete
payment.completed
Safe to fulfill
Fulfill from the completed webhook — never from the browser return alone while status is waiting.
- Customer taps Mark as Paid → confirmation dialog (SweetAlert) first.
- After confirm + mark paid succeeds → auto-redirect to
success_urlimmediately. - Payment status on return is still
waiting— do not fulfill yet. - SkyPay fires
payment.waiting; laterpayment.completedwhen you mark Complete. - Admin Complete later still fires the completed webhook for fulfillment.
Example · continue
Course seller verifying overnight / next morning
A Pokhara instructor sells a NPR 2,500 online course. Students often pay late evening.
With continue, they confirm Mark as Paid, get
redirected to success_url immediately (status still
waiting), and see “we’ll unlock after we verify.” You clear waiting payments with morning
coffee — unlock via payment.completed.
- Customer sees: confirm dialog → immediate redirect to success_url
- You do: review bank/QR backlog when you are available
- Webhooks:
payment.waiting(alert) →payment.completed - Fulfill when: completed webhook + verify — not on browser return
Real scenarios
Pick wait or continue from how fast you actually confirm Nepal
QR and bank transfers — not from what sounds nicer on a settings screen.
Freelancer / small shop — confirm within 5–10 min
You sell one-off services or low volume from a phone banking app. When a payment lands, you can open the statement, match the amount, and mark Complete before the customer gets impatient.
Customer
Pays → confirm dialog → Mark as Paid → stays on verifying → redirected to success after you Complete.
Merchant + webhooks
Dashboard Complete → payment.completed →
fulfill (verify first). Waiting webhook still useful as a heads-up.
Safe to fulfill: only when status is complete.
SaaS / course — overnight or next-morning verify
Subscriptions and digital products often get paid when you are offline. Auto-redirect
buyers to success_url after Mark as Paid; tell
them access unlocks after transfer verification. Wire payment.waiting to Slack/email and unlock on payment.completed.
Customer
Pays → confirm dialog → Mark as Paid → immediate redirect to success_url (status still waiting). No verifying wait.
Merchant + webhooks
payment.waiting alerts ops → morning
Complete → payment.completed unlocks the
account. Return URL is not the fulfill signal.
Safe to fulfill: completed webhook + server verify — never on return
URL while still waiting.
eCommerce — ops clears waiting queue in business hours
A Kathmandu store takes COD-style bank/QR checkouts all day. Packing starts after finance matches statements. Customers should not sit on a verifying spinner during peak hours — continue redirects them to success_url right after Mark as Paid.
Customer
Confirms Mark as Paid, lands on success_url / order received (pending verification). Shipping SMS comes after you Complete.
Merchant + webhooks
Ops queue fed by payment.waiting. Batch
Complete during shift → payment.completed triggers WMS / email.
Safe to fulfill / ship: only after Complete + verify.
Webhooks for both options
Configure an HTTPS endpoint in the dashboard
(Webhooks). Enable at
least payment.waiting and payment.completed.
| Event | When it fires | What to do |
|---|---|---|
payment.waiting | Customer marks paid | Alert ops / start review — don’t fulfill yet |
payment.completed | You mark Complete | Verify, then fulfill |
Continue mode makes webhooks especially important: the customer is already on success_url with status still waiting, so the return URL is not
proof of funds. Fulfill when you mark Complete. See the Manual Mode webhooks section for signature details.
// Express example — POST /webhooks/skypay
app.post('/webhooks/skypay', express.raw({ type: 'application/json' }), (req, res) => {
const body = req.body.toString('utf8');
// Verify SkyPay-Signature: t=...,v1=hmac_sha256(secret, `${t}.${body}`)
const event = JSON.parse(body);
if (event.type === 'payment.waiting') {
// Customer marked paid — alert ops. Do NOT fulfill.
}
if (event.type === 'payment.completed') {
const payment = event.data.object; // { code, status, amount, ... }
// Prefer: re-verify, then fulfill
// GET https://app.skypay.dev/api/v1/checkout/payments-verify/${payment.code}
}
res.status(200).send('ok');
});Fulfill only on completed
Fulfill only on payment.completed (plus server-side verify) —
never on redirect alone when status is still waiting.
- Receive
payment.completed(or poll verify after ops marks Complete). - Call
https://app.skypay.dev/api/v1/checkout/payments-verify/{code}with your API key. - Fulfill only when
data.status === 'complete'.
const res = await fetch(
'https://app.skypay.dev/api/v1/checkout/payments-verify/ORDER_8821',
{ headers: { Key: 'YOUR_API_KEY' } }
);
const { data } = await res.json();
if (data?.status === 'complete') {
// Safe to fulfill — never fulfill while status is waiting
}Production checklist
- Choose
waitorcontinueper Manual provider to match how fast you confirm - Webhook endpoint live for
payment.waitingandpayment.completed - Signature verification on your server
- Fulfill only when verify returns
complete - Customer copy for continue (SweetAlert + success_url): “We’ll unlock access after we verify your transfer”
- Ops process to clear waiting payments promptly
FAQ
Which after-mark-paid option should I choose?
Use wait if you confirm bank transfers within about 5–10 minutes (freelancer, small shop) and want customers to stay on verifying until Complete. Use continue when verification can wait overnight or until business hours (SaaS, courses, eCommerce ops queue) — customers are auto-redirected to success_url right after Mark as Paid, and you fulfill from payment.completed webhooks.
Does continue still fire payment.waiting?
Yes. When the customer confirms and marks paid, status becomes waiting and SkyPay fires payment.waiting. Checkout then auto-redirects to success_url. When you mark Complete later, SkyPay fires payment.completed.
Can I fulfill when the customer returns to my site in continue mode?
No — not while status is still waiting. Continue redirects immediately, but that return is not proof of funds. Fulfill only on payment.completed after you verify.
What should customer copy say in continue mode?
SweetAlert and success_url pages should set expectations — e.g. “We’ll unlock access after we verify your transfer (usually within a few hours).” They should not expect instant access from the return URL alone.
Where do I change this setting?
In the merchant dashboard, open Payment Providers, edit a Manual Mode provider, and set After mark paid (manual_configuration.after_mark_paid).
Manual Mode overview
QR & bank flow, redirects vs webhooks, and verifying payments.
Next steps
Set after-mark-paid on your Manual provider, then try a test payment end-to-end.