Payments & money

In this chapter20 articles

Selza takes 0% of your own sales. Every fee on this page is the payment provider's, not ours. You have four ways to get paid: two cost you a fee and confirm themselves, two are free and you confirm them. Most shops run one of each.

If you only read one thing, read Check your PayNow number. It's the only check that catches the mistake nothing else can.

Which payment method should I turn on?

Selza takes 0% on all four. The only thing that really differs is who collects the money, and what it costs you.

  1. Do you need on-demand courier delivery?

    Courier is the one hard constraint. Selza books the courier and pays their invoice out of the card fee — so it only works on a rail the platform actually collects through.

    • Yes — I want couriers

      You need Stripe. PayNow-direct, bank transfer and HitPay can't fund a courier.

    • No — pickup or I deliver myself

      Every method works. Keep reading.

  2. Are you in Singapore?

    PayNow only appears when your shop's currency is SGD.

    • Yes

      PayNow QR is free money — 0%, straight to your bank. Turn it on.

    • No

      Bank transfer is your fee-free option, and works internationally.

  3. Do you mind confirming payments by hand?

    The fee-free rails have no webhook — nobody tells Selza the money arrived, so you confirm each one (the AI reads the screenshot and can auto-confirm the clear ones).

    • I'd rather it was automatic

      Add cards. HitPay is usually cheaper in this region (from 2.8% + $0.50) than Stripe (from 3.4% + $0.50) — but only Stripe funds couriers.

    • Confirming is fine

      Stay fee-free. You keep 100% of every sale.

  4. Turn on more than one

    These aren't exclusive. Most shops run PayNow for locals and cards for everyone else — the checkout shows whatever is live.


The payments page

The problem — Four possible ways to get paid, and no single place that answers "what can a customer actually pay with right now?" Before this page existed you had to open each method and work it out for yourself.

Where

SettingsPayments

What you'll see

The band at the top is the answer: "Customers can pay with…" followed by the methods that are actually live. If nothing is set up it says "Nothing is live yet" rather than leaving you an empty space to interpret.

Below that, methods are grouped by the only thing that genuinely differs between them:

GroupMethodsWho collects
A fee is deductedHitPay, StripeThe provider collects, then pays you
No fee at allPayNow QR, Bank transferStraight from your customer's bank to yours

Set it up

  1. Open Settings → Payments.
  2. Read the band at the top.
  3. Tap any row to open that method.
  4. Turn on as many as you like — they're not exclusive.

Free and Pro

The status pills

PillMeans
LiveOffered at checkout right now
PausedSet up, but switched off — or superseded (PayNow shows this when Stripe is collecting it)
Action neededGenuinely broken; customers can't use it
Not set upYou haven't connected it

Worth knowing — An unverified method still shows Live, not "Action needed". That's deliberate: an unverified method genuinely can take payments, and flipping it to "Action needed" would both read as "your payments are broken" and quietly drop it from the summary above. The nudge to verify appears separately, where it can't be mistaken for an outage.

Which rows you'll see — Not everyone sees four. PayNow only appears if your shop's currency is SGD (or you already had it on). Stripe is hidden where Stripe can't onboard merchants — notably the Philippines — because offering a dead end is worse than offering nothing; if you already have an account it never hides. HitPay appears only where Selza has HitPay configured. Bank transfer is always there.

Works withPayNow QR, Bank transfer, Stripe, HitPay


PayNow QR

The problem — Card fees eat 3.4% of every sale, and Singapore buyers expect PayNow anyway. This takes money straight from their bank to yours, and Selza never touches it.

Where

SettingsPaymentsPayNow QR

Before you start — A Singapore UEN or a PayNow-linked mobile number, and the recipient name exactly as your bank has it.

Set it up

  1. Choose your proxy type: UEN or mobile number.
  2. Enter the proxy value.
  3. Enter the recipient name exactly as your bank registered it. Max 25 characters — that's PayNow's own field limit, not ours.
  4. Turn PayNow on. A sample QR is generated at S$1.00 with the reference PN-PREVIEW, so you can scan it and see what a customer sees before anyone pays you.
  5. Open Check my number and scan your own QR. Do this — it's the whole ballgame.
  6. Optionally turn on auto-confirm.

Free and ProSingapore only — the row appears when your shop's currency is SGD.

CostNothing. 0%, ever.

The trade-off — Nobody collects for you. PayNow has no webhook, so nothing tells Selza the money arrived. You confirm each payment — or let the AI read the screenshot and do it. See what happens when someone pays this way.

Details that will save you a support ticket

  • You can save a half-finished setup. Partial saves are allowed; only enabling PayNow with an incomplete proxy is refused. Your customer-facing QR can never be broken by a half-typed number.
  • Turning it on with an incomplete proxy is refused outright — not silently ignored. If the toggle won't stick, something above it is blank.
  • Removing PayNow resets everything — the proxy, the mode, auto-confirm, and your verification stamps. Re-adding means verifying again. That's intentional: a verification that survived a number change would be vouching for nothing.
  • Editing your number silently drops your verified badge. See The verified badge.

Common problems

What you seeWhat's happening
The toggle won't turn onProxy type, proxy value, or recipient name is blank.
Your bank shows a different name when you scanStop. Your proxy belongs to someone else.
The name looks truncated25 characters is PayNow's ceiling. Banks truncate on their side too.
PayNow says Paused and you didn't pause itStripe is collecting your PayNow — see PayNow via Stripe.
Customers say the QR won't scanScan the sample QR yourself first — it's built from the same payload.

Works withCheck your PayNow number, Auto-confirm, PayNow via Stripe


Check your PayNow number

The problem — This is the most important two minutes in this chapter.

A typo onto an unregistered number just fails harmlessly — nobody can pay you, you find out immediately, you fix it. The dangerous typo is the one that lands on a stranger's registered number. Then it works perfectly: your customers pay, the money arrives, and it arrives in someone else's account. Silently. Forever.

And nothing else in Selza can catch it. Every later check — including the AI that reads payment screenshots — compares what it sees against the number you saved. A screenshot showing payment to the wrong number matches the wrong number you typed, and the AI reports "verified". The system is working exactly as designed and is confidently wrong.

Where

SettingsPaymentsPayNow QRCheck my number

Making sure your PayNow number is really yours

Each rung is stronger than the last. Rung 2 is the one that matters — it's the only check that catches a typo onto a stranger's registered number.

  1. 1 · Type it in

    Proxy + recipient name. Catches nothing on its own — a typo here is exactly the problem the rest of this ladder exists to catch.

  2. 2 · Scan your own QR

    Your banking app shows the registered account name BEFORE any money moves. If it isn't your name, stop. This is free, takes ten seconds, and nothing else can catch this.

    • The name isn't yours

      Your proxy belongs to a stranger. Every payment would pay them, silently. Fix the number and scan again.

  3. 3 · Send yourself 10 cents

    The strongest check. Upload the receipt and an AI reads back who it actually paid. If the number is wrong, ten cents reaches a stranger and the receipt names them — at a price that beats finding out on a customer's real order.

  4. Badge earned

    It decays by itself the moment you edit the number — there's no clearing step anyone can forget. Reformatting the same number doesn't drop it.

Set it up

  1. Open the page. It renders a 320px QR for 10 cents, reference PN-VERIFY.
  2. Scan it with your own banking app.
  3. Read the name your bank shows back — before any money moves.
  4. Is it you? Confirm it.

Free and Pro(Singapore only). If you haven't saved a number yet, the page sends you back to set one up.

Why this works at all — Since June 2026 the payer's bank app shows the registered account name before the transfer goes through. That makes your own phone the only oracle needed: no API, no fee, no integration. We just have to make you look.

It's an attestation, not a proof — you're telling us you saw your name. Which is why the 10-cent test is the stronger rung.

For certainty: send yourself 10 cents

  1. Actually PayNow yourself S$0.10 using the QR.
  2. Upload the receipt (PNG, JPEG or WebP, up to 8 MB).
  3. An AI reads it and tells you who it actually paid.

If your number is wrong, ten cents reaches a stranger and the receipt names them — exactly what you need to see, at a price that beats finding out on a customer's real order.

Your privacy — Your own screenshot is read straight from the upload and never stored. Keeping it would build a pile of account screenshots that nothing ever reads again. (A buyer's proof is stored, because you need to re-open it from the order.)

Works withThe verified badge


Bank transfer

The problem — Fee-free money that works where PayNow doesn't, including from overseas.

Where

SettingsPaymentsBank transfer

Set it up

  1. Enter your bank name, account holder name, and account number.
  2. Type the account number a second time. Pasting is disabled in that field on purpose — retyping is what catches a wrong digit; pasting the same mistake twice catches nothing.
  3. Optionally add SWIFT/BIC, a branch or routing code, and Extra instructions (up to 500 characters — a reference format, or which name to put in the comment).
  4. Turn on Show bank transfer at checkout and save.
  5. Optionally open Confirm details and upload a screenshot of your bank app's account screen.

Free and ProAvailable everywhere, on every plan — it's the one method with no region gate.

CostNothing.

Details worth knowing

  • You're only asked to retype when the number actually changed. Re-confirming an unchanged number is friction that buys nothing, and would make that field a permanent toll on every future edit.
  • The match is digits-only. 005-231289-1 and 0052312891 are the same account, so reformatting doesn't trigger a re-confirm.
  • Enabling without an account number and holder name is refused — in the form, and again on the toggle.
  • Clearing the double-entry marks you self-confirmed. You've checked it to the standard this method can reach on its own, so it's stamped rather than nagging you forever.

Why the paranoiaNo bank in Singapore will confirm an account number belongs to you. There is no Confirmation-of-Payee for raw account numbers here, and the proxy-based services don't cover them. So reading your own bank app back to yourself is genuinely the strongest check available — not a weak substitute for a real one.

Works withWhat happens when someone pays this way, Auto-confirm


Stripe

The problem — Cards, Apple Pay, Google Pay. It's also the only rail that can fund on-demand courier delivery.

Where

SettingsPaymentsStripeConnect Stripe

Set it up

  1. Press Connect Stripe.
  2. Complete Stripe's own onboarding — business details, ID, and the bank account they'll pay out to.
  3. You're returned to Selza and your status refreshes while the page renders, so what you see is current rather than a stale "pending" from before you left.

Free and Pro

Cost (Singapore, from) — local cards 3.4% + $0.50, overseas cards 3.9% + $0.50, PayNow via Stripe 1.3%, currency conversion +2%.

Before you start — Stripe's own identity checks. Selza can't do this part for you, and can't speed it up.

What the statuses mean

StatusMeans
OnboardedStripe will accept charges. You're live.
PendingStripe still wants something. Their onboarding will say what.
DisabledStripe has blocked charges. Only Stripe can tell you why.

Details worth knowing

  • Disconnecting is not destructive. It unlinks Selza only. Your Stripe account, payout history and pending balance are untouched, and you can still be paid out.
  • Reconnecting creates a new connected account. Saved card details from the old one don't follow. Checkout handles this rather than dead-ending: if a saved customer record no longer exists on the new account, it forgets it and retries the buyer as a guest.
  • You are the merchant of record. Charges are made directly on your Stripe account; Selza's cut (0% on your own sales) rides along as an application fee rather than Selza collecting and forwarding your money.

Works withPayNow via Stripe, Refunds, Stripe payouts


PayNow via Stripe

The problem — PayNow-direct means confirming every single payment by hand. Routing PayNow through Stripe buys instant, automatic confirmation — for a fee.

Where

SettingsPaymentsStripe

not the PayNow page — Stripe charges for it, so it lives with the methods that take a cut

Set it up — Connect and fully onboard Stripe first, then switch PayNow's mode to Stripe.

Free and ProNeeds an onboarded Stripe account — connecting isn't enough.

Cost1.3%, against 0% for PayNow-direct. You're buying away the manual confirm step.

Details worth knowing

  • Stripe has to approve PayNow on your account first. Selza requests the capability when you connect. If it's still pending, the switch refuses with a retryable error rather than flipping and breaking every checkout.
  • Disconnecting Stripe reverts PayNow to direct automatically — otherwise your storefront would offer a PayNow that nothing could confirm.

Works withStripe, PayNow QR


HitPay

The problem — PayNow, cards, GrabPay and UPI QR through your own HitPay account, usually cheaper than Stripe in this region.

Where

SettingsPaymentsHitPayConnect your HitPay account

Set it up

  1. Press connect. You approve access on HitPay's own page — this is your account, not Selza's.
  2. You're returned here, connected.
  3. Use Show HitPay at checkout to pause it without disconnecting.

Free and ProThe row appears only where Selza has HitPay configured.

Cost (SGD, from) — local cards 2.8% + $0.50, overseas 3.65% + $0.50, PayNow over S$100 0.65% + $0.30, PayNow under S$100 0.9% (min $0.20).

Details worth knowing

  • Your buyers see "PayNow / Card", not "HitPay". Don't expect customers to recognise the name.
  • Money settles to your own HitPay account. Selza never touches it — and takes nothing.
  • Disconnecting here deletes Selza's access tokens. To revoke fully, also remove the app in your HitPay dashboard under Developers → Connected Apps.
  • A test-mode connection won't be offered on the live site. Checkout requires the connection's environment to match, so a sandbox account can't quietly take real orders.

Works withCourier needs card payment


What each method costs

The problem — Choosing a rail with your eyes open.

Cost to youConfirms itself?Funds courier?Where
PayNow QR0%No — you confirmNoSingapore
Bank transfer0%No — you confirmNoEverywhere
PayNow via Stripe1.3%YesYesSingapore
HitPayfrom 2.8% + $0.50YesNoWhere configured
Stripefrom 3.4% + $0.50YesYesNot the Philippines

Selza's cut of every one of these: nothing.


Courier needs card payment

The problem — "Why can't my PayNow customers get courier delivery?"

The ruleOn-demand courier requires Stripe. PayNow-direct, bank transfer and HitPay can't fund it.

Why — Selza books the courier and pays their invoice out of the card fee. On the other three rails the money goes straight to your account and never passes through Selza — so Selza would be booking and paying a courier it never collected a cent for. It's a money problem, not a technical one.

What still works on every methodPickup and self-arranged delivery (your own flat fee). Only on-demand courier is affected.

What your buyer sees"Courier delivery needs card payment — pay by card, or choose self-pickup." They're told at checkout, before they've committed.

Works withDelivery


What happens when someone pays this way

The problem — PayNow and bank transfer have no webhook. Nothing tells Selza the money arrived, so somebody has to read every screenshot a customer uploads. That somebody was you.

What happens when someone pays by PayNow or bank transfer

There's no webhook on the fee-free rails — nobody tells Selza the money landed. This is the loop that replaces one.

  1. Buyer opens their order page

    They see your QR, or your bank details.

  2. They pay from their own banking app

    The money goes bank-to-bank. It never touches Selza.

  3. They upload a screenshot

    On the same page. This is the only signal that a payment happened.

  4. An AI reads it

    It extracts what's ON the screenshot — amount, who it paid, whether the transfer succeeded. Whether that MATCHES your order is then decided by Selza's own code, not the AI. A hallucinated 'it matches' can't flip an order to paid.

  5. You confirm — or it confirms itself

    With auto-confirm off (the default), you tap to accept. With it on, only unambiguous high-confidence matches go through by themselves.

    • Anything less than certain

      Comes to you regardless of the setting.

    • A screenshot is not proof

      It can be forged, or show a transfer that's still pending or failed. Auto-confirm is you choosing that risk for the convenience — which is why it's off unless you turn it on.

Where — Automatic. The verdict appears on the order.

Free and ProThe check always runs; only auto-confirm is opt-in.

The part worth understanding — The AI only extracts what's on the screenshot: the amount, the currency, who it paid, the transaction reference, and whether the transfer says it succeeded.

Whether that matches your order is then decided by Selza's own code, comparing those figures against the order. The AI never gets a vote on "does this match". So an AI that hallucinated "it matches" cannot flip an order to paid — the numbers it read still have to actually match.

It reads bank transfers too, not just PayNow. Only the wording differs; the recipient check keys on a digits-only number that serves a UEN, a mobile and a bank account alike.

Works withAuto-confirm


Auto-confirm verified payments

The problem — Even with the AI check, you're still tapping "Mark paid" on payments that are obviously fine.

Where

SettingsPaymentsPayNow QR

and separately on Bank transfer — two switches, two decisions

Set it up — Flip the toggle. Off by default on both.

Free and Pro

When it actually fires — Only when the verdict is verified and confidence is high. Anything less comes to you, whatever the setting says. For PayNow it also requires PayNow to be in direct mode — in Stripe mode the webhook confirms instead, so there's nothing to auto-confirm.


The verified badge (and why it vanishes)

The problem — A badge that outlives the thing it vouched for is worse than no badge: it tells you a wrong number is safe.

Where

SettingsPayments

Set it up — Nothing. The badge compares what you verified against what's saved right now. Change the number and the badge disappears by itself. There's no clearing step for anyone to forget, and no job that might not run.

Free and Pro

Details worth knowing

  • PayNow matches exactly. Any edit drops the badge.
  • Bank transfer matches digits-only. Re-saving 005-231289-1 over 0052312891 hasn't changed where money goes, so it shouldn't cost you your badge.
  • Two different warnings. "Never checked" and "changed since you checked" say different things, because they mean different things.
  • How you verified is recorded — self-scan or AI receipt for PayNow; self-confirm or AI screenshot for bank.

Deposit then balance

The problem — A big custom job needs money down before you start, and the rest on completion.

Where — Set the deposit % on an order form; manage it from the order.

Set it up — Your buyer pays the deposit to confirm the job, then the balance later.

Free and Pro

Worth knowing — The order page, the buyer's page, the tracking page and the AI all read the same source for "what stage are we at" and "what's owed right now". They can't disagree with each other and quote your customer a different number than you're looking at.

Works withOrder links


Refunds

The problem — Something went wrong and the customer needs their money back, without you leaving Selza.

Where

SalesOrders(order)Refund

Set it up

  1. Choose full or partial.
  2. Pick a reason: duplicate, fraudulent, or requested by customer.
  3. The order stays paid until refunds reach the full amount, then flips to refunded.

Free and ProRefundable from paid, in production, ready, or completed.

Details worth knowing

  • Refunding releases the booking slot back to your calendar automatically.
  • Platform-held delivery money comes back too. Otherwise a refund would charge you for delivery money you never received.
  • Stripe is the source of truth. If a refund's outcome is ambiguous — a timeout where the refund may or may not have gone through — Selza waits for Stripe's own confirmation rather than guessing. You won't see a refund that didn't happen.

Earnings

The problem — What did I actually make, after everything?

Where

GrowEarnings

What you'll see — Your last 30 days net, with gross, platform fees and refunds broken out; a plain-English explanation of the arithmetic; and all-time totals.

The mathsnet = gross − platform fees − refunds, counted on the date each order was paid.

Free and Pro

Details worth knowing

  • It's a fixed 30-day window on purpose. The static "Last 30 days" pill is there to make that deliberate rather than look like a control someone forgot to build.
  • Delivery fees aren't in your net. Buyers pay those on top; they never come out of your goods revenue — so including them would inflate the number without putting anything in your pocket.

Forecast

The problem — "Can I afford to restock?"

Where

GrowEarnings

What you'll see — A projection for your next 30 days with a low–high range and a confidence level, momentum against the previous 30 days, whether you're on pace this month, and a chart where the lighter bar is the projection.

Free and Pro

Worth knowing — It says "an estimate, not a guarantee" and means it. Without enough history it says "Not enough sales yet to forecast" rather than inventing a number out of three orders.


Stripe payouts

The problem — When does the money actually land in my bank?

Where

GrowEarnings

What you'll see — Your available and pending Stripe balance, and your last five payouts with date, status and amount.

Free and ProNeeds Stripe connected and onboarded.

Worth knowing — If Stripe is unreachable the block hides rather than showing an error. A missing payouts card doesn't mean missing money.


Plan & billing

The problem — What am I on, what am I using, and where are my invoices?

Where

SettingsBilling

Set it up

  1. Read your plan card.
  2. Upgrade to Pro opens Stripe checkout. Already paying? Manage subscription opens Stripe's portal — change your card, see invoices, or cancel.
  3. Check your AI usage meter.
  4. Invoice history shows your last 12, with PDFs.

Free and Pro

The price is S$29/month. ⚠️ You'll see it written "SGD 29/mo" in-app and "S$29" on the website. Same price, same currency, two ways of writing it.

Details worth knowing

  • There's no downgrade button. Cancel in Stripe's portal; you land on Free and keep working.
  • Cancelling doesn't lock you out. Your plan card will say so: "You're on the Free plan — still fully operational."
  • A failed payment shows a banner and your account stays usable while you fix it. You'll get "Payment failed — update your card", or "Confirm your payment" if your bank wants a second factor.
  • The in-app price is read live from Stripe, not hardcoded — because a hardcoded label drifted from the real price once already ($29 in the copy against $19 on the invoices).

Works withThe two plans


Tips

The problem — Customers who want to say thank you with money.

Where

SettingsGeneralLet customers add a tip

Set it up — Flip the toggle. It saves instantly — there's no Save button on this one.

Free and ProOff by default.

Worth knowing100% of tips are yours. They're excluded from every platform fee.


GST / tax

If you're GST-registered and need proper tax invoices, Selza can't produce them for you today — you'll need to issue those yourself. Tell us through the co-pilot if you need this; it's the kind of thing we build when enough shops ask.