Testing and rehearsal
Operator page, sandboxes only
Developers and owners only, like the Rehearsal tab. In production this screen shows an explanation instead of any buttons. That is deliberate.
Where you plant practice data, check that FMS still behaves, and rehearse renewals on Stripe and Opn test accounts. The page title is Test tools. The top line names the sandbox you are in.

Every button that changes something asks first in a small window. It lists what will happen. Press Cancel to back out.
Demo data

Plants a full cast so every screen has something to show.
- Open What it creates to see the list first.
- Press Load demo data.
- Read the window, then press Load demo data again.
A green line then counts what was planted. Open Everything that was planted for each item.
It replaces the existing practice data
Anything loaded before is wiped and replanted. Real members are untouched, but do not run it while somebody else is mid-demo.
What it plants
Members on every billing source and status, members who appear twice, card routing cases, teams, a newsletter opt-out, two queue examples for Health, a broken plan for Plans → Tools, whitelist grants with end dates, and thirteen months of history for the Dashboard charts. Nothing is sent to Stripe or Mailchimp.
Checks
Runs FMS through each practice scenario and compares the result with what should happen. Use it after an upgrade.
- Press Run all checks, or Run group beside one group.
- Press Run checks in the window.
- Read the counts: passed, failed, errored.
- Open a failed check to see expected against actual.
Each run loads the demo data again first. Members and Teams stay populated afterwards.
Some groups leave nothing behind. They create their own test members, run, then undo every change. Nothing from them shows on Members, Health or the email queue.
What the checks cover
The first groups cover members, duplicates, card routing, teams, newsletter opt-outs, the queue, plan repair and whitelist grants.
The groups that leave nothing behind:
- Renewal needs bank confirmation: the payment link is kept and access is held, then stops.
- Team invoices: staff vouching for an address, the billing address, a paid notice, an unpaid team.
- Change plan and move to Stripe billing: nothing changes before payment, and late money is refused.
- Gift memberships and discount codes: a claimed gift, a link that works once, the discount sums.
- Membership emails: each email only when switched on, the stop link, a send refused for good. A card membership follows its payment connection's switches checks that a card member gets only what their payment account's page switches on, and a free grant only what Email does. The emails are switched on inside the check only. Your settings on Email and on each connection do not change.
- Refunds and webhook safety: refunds in Reports, a notice sent twice, a notice on the wrong account.
- Opn Payments (Omise): three declined renewals and the grace that follows, cancel at period end, an Omise notice sent twice, a charge for the wrong amount. Each makes its own practice Opn account, so it runs without one connected.
None of them contacts Stripe, Omise or Mailchimp, and none sends an email.
Stripe test accounts
One box per connected Stripe test account. Create test members… makes a set of fake customers. Create products & subscriptions adds a handful of products. Clean test data… deletes them again. Each one shows what it will touch before it runs. Live accounts are never touched.
Open checkout page opens the public checkout in a new tab, for a single test purchase. With no test account connected, the box says so and offers Open Connections.
Opn test accounts
One box per Opn Payments account connected with test keys. It charges the Omise test account with Omise's own test cards, so you can see what each card does. No real money moves.
You'll need
- An Opn account connected with test keys on Connections
- Choose a Test card. The line under it says what it should do.
- Leave Amount at 20.00 and Currency at THB, or change them.
- Press Charge, then Charge again in the window.
- Read the result under the box.
A successful charge shows what Reaches the bank, the Omise fee and the VAT on the fee. A declined one shows Omise's reason, such as insufficient_fund. The charge id at the bottom finds it in the Omise test dashboard under Charges.
| Test card | What it proves |
|---|---|
| Visa · succeeds | A normal payment goes through, with its fee. |
| Mastercard · succeeds | The same on Mastercard. |
| JCB · succeeds | JCB pays in THB. Omise may need to enable it for test mode. |
| American Express · succeeds | Only once Omise has enabled AMEX on the account. |
| Visa · insufficient funds | A decline a renewal would retry. |
| Visa · stolen or lost | A decline for a reported card. |
| Visa · processing failed | A decline because the bank could not process it. |
| Visa · payment rejected | A decline by the bank. |
| Visa · fraud check failed | A decline by Omise's fraud check. |
| Visa · invalid card number | A decline for a card the bank does not know. |
| Visa · 3-D Secure enrollment fails | The challenge flow, ending in a rejection. |
| Visa · 3-D Secure check fails | The same, failing at the bank's check. |
Check capability asks Omise again which cards and currencies the account takes, and the limits of one charge.
Every test charge here asks for 3-D Secure
Our test account uses dynamic 3-D Secure. This box sends a return address with each charge, so the bank asks to confirm it, even with a success card. When a charge waits, press Complete 3DS to open the bank's page in a new tab.
What FMS keeps of a test charge
FMS notes each test charge before sending it, so an answer lost on the way can be found again. It is never a payment: it is not in Reports and grants nothing. Removing the Opn account forgets these notes too. In production the box is not shown and the server refuses the charge.
Live-fire rehearsal
Drives real Stripe test-clock renewals, so you can watch a renewal happen in minutes rather than a month. With an Opn test account picked, it also charges, renews and declines on Omise's test system. Test mode only. It exists to prove the wiring, not to be run casually.
- Choose the Primary account (like Thailand) and the Backup account (like Singapore).
- Choose an Opn test account (optional), or leave it at None.
- Press Run rehearsal, then Start rehearsal in the window.
- Wait. Each scenario shows a status: Waiting, Running, Passed, Warning, Your turn, Failed or Skipped.
Scenarios marked Uses a Stripe test clock take a few minutes. The page updates by itself.
The list now includes Renewal that needs bank confirmation (3D Secure): a renewal on Stripe's test card whose bank asks for confirmation every time, which FMS must hold for the member and then settle once the invoice is paid. It has not been run yet, so its first run is the verification.
Guided manual checks sit underneath. Open Steps, do them in a browser, then press Verify.
Opn in the live-fire rehearsal
The Opn scenarios run after the Stripe ones, on the Opn account you picked. With None, they show Skipped and say why.
You'll need
- An Opn account connected with test keys, not read-only, on Connections
- Its webhook address set and its webhook secret pasted, for the webhook check
| Scenario | What it proves |
|---|---|
| Opn preflight: account, capability, webhook | The keys work in test mode. It lists cards, currencies, limits and the webhook. |
| Opn test charge: a ฿20 Visa charge succeeds | A ฿20 Visa charge succeeds, with Omise's fee and what reaches the bank. |
| Opn decline: insufficient funds is a clean refusal | The insufficient-funds card is refused, the member gets plain words, nothing is recorded as paid. |
| Opn donation: charged, recorded, settled in baht | A $5 donation is charged once and settles in baht in the money ledger. |
| Opn checkout: a membership bought by card | A Visa buys a membership. The card is saved, the invoice is paid, the fee is recorded. |
| Opn renewal: FMS charges the saved card | FMS charges the saved card at the period end and moves the date on by one term. |
| Opn renewal declined three times → dunning grace | Tries at the period end, three and seven days later, then grace, the member's email and a staff alert. |
| Opn checkout with 3-D Secure (guided) | The checkout waits for the bank and grants nothing until it says yes. |
| Opn duplicate check: the same ref_id makes one charge | A ฿20 charge sent twice with FMS's reference is charged once. A second charge fails the row and is refunded. |
| Opn renewal skips 3-D Secure | On a saved card, a payment with a return address waits for the bank. A renewal without one goes through at once. |
| Opn webhook reaches FMS (guided) | An event Omise sends arrives and passes the signature check. |
| Opn reconcile: the event poll runs clean | The safety-net poll reads the account's events without an error. |
| Opn clean-up | Practice memberships cancelled, Omise test customers deleted, temporary changes put back. |
Warning is amber. It means a setting on the Omise account, not a fault in FMS. Its step says what to change or what to ask Omise. Typical ones: USD or American Express not enabled, the webhook address or secret missing, or Omise asking for 3-D Secure where it said it would not.
Checkouts stop with a Warning on our test account
A checkout's first payment is sent with a return address, so our account asks the bank. These scenarios run without a browser, so these stop there with a Warning:
- Opn checkout: a membership bought by card
- Opn renewal: FMS charges the saved card
- Opn renewal declined three times → dunning grace
Opn checkout with 3-D Secure (guided) and Opn renewal skips 3-D Secure cover what they cannot.
The 3-D Secure checkout needs you
When Opn checkout with 3-D Secure (guided) says Your turn, press Open Omise's test page. Mark the charge Successful on Omise's page. Come back and press Verify on that row. Verify then cancels the practice membership and deletes its Omise customer. If the account has 3-D Secure off, the row shows a Warning instead: Omise charged without asking the bank.
For Opn webhook reaches FMS (guided), a Warning means no event arrived. Send a test webhook from Omise's dashboard, or make one test charge above, then press Verify on that row.
What the Opn scenarios change while they run
- Visa is sent to the Opn account first. The clean-up puts its routing priority back.
- The checkout buys the cheapest paid plan at its USD price. On an account without USD it pays the THB price from the account's exchange rate; with no rate the checkouts are skipped with a warning.
- Renewals are rehearsed by moving the membership's renewal date into the past.
- The practice donation stays in the sandbox as a record of the run.
- What the Opn scenarios created, under the list, names every member, membership, Omise customer and charge the run made, and what the clean-up did with each.
Migration rehearsal
There is a separate Rehearsal tab, a checklist that walks the whole cutover from a copy of the live site. Most people will never open it. The one-page description lives in the repository at docs/migration-runbooks/local-rehearsal.md.