Sandbox
A free test operator with identical isolation and events — Stripe test mode and GoCardless sandbox underneath, so no real money moves.
Sandbox
Note
A test operator behaves exactly like a live one — same isolation, same events — but uses Stripe test mode and GoCardless sandbox, so no real money moves.
Sandbox is included, not a separate product, and there is no parallel schema — a test
operator is modelled as operators.environment = 'test' (optionally a child of a live operator),
with identical row-level-security isolation to a live one. Stora has a sandbox too; StoreBay makes
it the default, frictionless way to build.
This page covers the sandbox model — what a test operator is, how environments bind to your
credentials, and what seed/reset do. The console that creates, seeds, and resets test operators —
the buttons themselves — lives in your StoreBay developer settings
(https://app.storebay.co.uk), not here.
The environment model
| Environment | Credential | Backing | Money |
|---|---|---|---|
| Live | sb_live_… | operators.environment = 'live' | Real Stripe / GoCardless |
| Test (sandbox) | sb_test_… | operators.environment = 'test' (optionally a child of a live operator) | Stripe test mode / GoCardless sandbox |
- The switch is the credential — a
sb_test_…key resolves to the test operator, asb_live_…key resolves to live. The base URL never changes:https://api.storebay.co.uk/v1. - Test operators connect to Stripe test mode and the GoCardless sandbox, so you can exercise full payment and Bacs Direct Debit flows — including the reversible states covered in the booking-flow guide — without moving real money.
- Test webhook endpoints and test API keys are managed exactly like their live counterparts (in your StoreBay developer settings).
- A key's prefix must agree with its own environment (a
sb_test_…-prefixed credential can never resolve to a live operator, or vice versa) — the resolver refuses the mismatch outright, so a copy-paste error fails closed, not open.
The worked example: Kestrel Storage
Kestrel Storage is StoreBay's own canonical test-mode fixture — a test operator, child of
Pennine Self Storage, seeded with 2 sites, ~40 units, and sample occupiers. It's connected to
Stripe test (card 4242 4242 4242 4242) and has an active GoCardless sandbox mandate, with
a test key shown in the console as sk_test_••••0c33. Point your integration at it while you
build, exactly as you would a real operator's test environment.
Reset and seed
The console's Seed sample data action populates a test operator with fixtures; Reset sandbox is destructive and test-realm-only:
Reset this sandbox?
This deletes all test data in {operator} and restores the clean seed. Live data is never touched. This can't be undone.— confirm: Reset sandbox
Every effect of Create / Seed / Reset is confined to the test environment — no real money, comms, or access commands ever fire from a test operator, no matter what you do to it.
Warning
Test mode — no real charges, comms, or access commands are sent.
Going live
Going live is a one-way, gated transition: an owner/admin flips a single column on the
operator, and nothing else about its data changes — every test-era site, contact, and invoice
remains, visible and auditable by its original created_at. The moment that flip commits, the
operator's sb_test_… API keys stop resolving — the resolver's key↔operator environment match
makes this immediate and automatic, not a manual cleanup step. Ongoing testing continues in a
child sandbox, never the now-live operator; live → test does not exist.
Build and test everything against sb_test_… first — then swap the credential to go live. Nothing
else in your integration changes.
Managing your sandbox
- Create test operator, Seed sample data, and Reset sandbox are all actions in your
StoreBay developer settings (
https://app.storebay.co.uk) — not in-page actions here. - Test API keys: manage them alongside your live keys, in the same developer settings.
- Test webhook endpoints: register them exactly as described in Webhooks — just
point them at a
sb_test_…-owned endpoint while you build.