---
title: Testing
nav: Testing
order: 6
---
# Testing

Everything runs in **test mode**: no real money moves and your backend must keep test orders separate from production entitlements.

## Test cards
| Card | Result |
|---|---|
| `4242 4242 4242 4242` | Approved |
| `4000 0000 0000 0002` | Declined: balance unchanged |
| `4000 0027 6000 3184` | 3-D Secure challenge, then approved after **Authenticate** |

Any future expiry and any 3-digit CVC. Real card numbers are rejected on the client and the server, and full card numbers are never stored.

**Apple Pay / Google Pay:** simulated buttons in test mode.

## Checks worth automating
1. A purchase credits your player once (watch your `order_id` dedupe).
2. A declined card leaves the balance unchanged.
3. A replayed player token is refused.
4. **Outage:** stop your webhook endpoint, buy, start it again. The coins arrive after it comes back, exactly once.
5. **Refund** from Studio → Orders: your backend gets `order.refunded`, so revoke (never below zero).

Studio → Integration → **Send test event** sends a `probe` webhook that grants nothing.
