// tutorial

Guides / Manual Mode / After mark paid

Wait or redirect after Mark as Paid

Configure what happens after the customer confirms Mark as Paid — stay on verifying until you Complete, or auto-redirect to success_url while you confirm later via webhooks.

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 vs continue after Mark as Paid

wait · default

Stay on verifying until Complete

  • Confirm dialog first (SweetAlert)
  • Stays on verifying / polling — no auto redirect
  • Redirect to success_url after you Complete
  • Webhook: payment.completed on 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
Confirm → Mark as Paid → waitingwait: stays verifyingYou Complete → redirectpayment.completed → fulfillcontinue: auto-redirectsuccess_url · still waitingComplete → payment.completedfulfill from webhook / verify

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.

More info

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.

More info

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.

Wait mode · stay on verifying until Complete
  1. 1

    Customer pays via QR or bank

    Money lands in your account

  2. 2

    Confirm dialog (SweetAlert)

    Copy explains they stay until you verify

  3. 3

    Mark as Paid succeeds

    Status: waiting · stays on verifying

  4. 4

    You mark Complete

    Status: complete · payment.completed

  5. 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.completed fires 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 complete after verify

Option: Continue after mark paid

Value: continue. Label in the dashboard: Continue after mark paid.

Continue mode · auto-redirect after Mark as Paid
  1. 1

    Customer pays via QR or bank

    Money lands in your account

  2. 2

    Confirm dialog (SweetAlert)

    Copy explains redirect + later unlock

  3. 3

    Mark as Paid succeeds

    Status: waiting · payment.waiting

  4. 4

    Auto-redirect to success_url

    Immediate — status still waiting

  5. 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_url immediately.
  • Payment status on return is still waiting — do not fulfill yet.
  • SkyPay fires payment.waiting; later payment.completed when 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.

wait

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.

continue

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.

continue

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.

EventWhen it firesWhat to do
payment.waitingCustomer marks paidAlert ops / start review — don’t fulfill yet
payment.completedYou mark CompleteVerify, 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.

javascript
// 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.

  1. Receive payment.completed (or poll verify after ops marks Complete).
  2. Call https://app.skypay.dev/api/v1/checkout/payments-verify/{code} with your API key.
  3. Fulfill only when data.status === 'complete'.
javascript
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 wait or continue per Manual provider to match how fast you confirm
  • Webhook endpoint live for payment.waiting and payment.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.

Manual Mode tutorial →

Next steps

Set after-mark-paid on your Manual provider, then try a test payment end-to-end.