BILLING ACCESS CHECK · EXPERIMENTAL
Your customer paid.
Can they use what they bought?
A payment can succeed while product access stays broken. See the mismatch before your customer has to explain it.
Try an example below — no signup or uploadONE FIX. ONE HIDDEN PROBLEM.
Would these billing checks pass?
Three invented customer cases. Simulate the correct access after a plan upgrade, then see why another case still needs attention.
| Customer case | Result | What needs attention |
|---|
Keep failures visible. One passing case cannot hide a missing, stale or failing case. Export the findings for an engineer, or make your existing build reject a non-passing result.
Checks supplied payment, subscription and access observations. No Stripe account is connected and no customer access is changed. A pass does not prove a whole release is safe.
Try the free staging kit → · Node.js 24+ · developer setup required
Check your own sandbox evidence or export these results
Download the input as a template. Declare every required case ID and include its version 1 evidence. Missing cases stay visible. Maximum 20 cases, 256 KiB total. Use pseudonyms, never credentials or real customer data.
Imports default to recent evidence. Timestamps are checked against your device clock; their source is not authenticated. Replay is for historical debugging and examples.
Included in the starter kit: node billing-suite-runner.mjs suite-synthetic.json --replay. Expected exit: 1, with one mismatch and one inconclusive case. For your own fresh evidence, omit --replay. Add --junit to print XML. Only all-passing cases return exit 0; every other outcome blocks.
Inspect a single case and its three checkpoints
TRY A FAILURE
One customer. Three checkpoints.
Invented records, no connected Stripe account. This checks supplied observations; it does not test a protected page in your app. The example expects an active paid plan at the checkpoint. An old payment alone does not establish current paid coverage.
Example policy: active Pro and Pro access within 60 seconds of payment. Observations must be no more than 30 seconds old.
Exact input, policy and fingerprint
REPEAT THE CHECK
Give an engineer something reproducible.
Download the complete starter kit below, or use these individual modules with your replay input. Run the same checker locally or in your own test workflow with Node.js 24 or later.
node billing-access-runner.mjs evidence.json
Rename the downloaded replay input to evidence.json. Exit codes: 0 pass, 1 mismatch, 2 incomplete or invalid evidence, 3 still provisioning, 4 no successful payment. A pass concerns the supplied checkpoint only.
Try your own sandbox observations
Use the downloaded input as the schema. Set mode to sandbox-evidence, use pseudonymous customer references, and replace every observation and timestamp with your test data. Keep the expected plan and timing policy explicit.
Read locally in this tab. Maximum 32 KiB. Do not include keys, real customer data or raw provider payloads.
The mode is your declaration, not verified sandbox provenance. No connector, scheduler or customer account is created. Clear the page by reloading.
FROM DEMO TO YOUR RELEASE WORKFLOW
Check your staging app. Keep a failing check out of your release.
Run an explicit local request against an access-check endpoint you control. The tool combines its response with your sandbox billing evidence and returns a process exit code your build can enforce.
Developer setup required. The endpoint must use the same identity and authorization policy as your protected feature. An endpoint that echoes the expected result proves nothing about customer access.
Requires Node.js 24+. No packages or credentials needed for the example.
- Extract all files into one folder.
- Open a terminal in that folder.
- Run
node billing-access-example.mjs.
Expected: broken fixture = fail, then corrected fixture = pass. Exactly two local requests, no external requests. Instructions, sample evidence and file fingerprints are included.
Individual files for manual setup
These individual files need the checker and runner above in the same folder. The ZIP includes these modules and the suite runner.
Starts a temporary loopback-only fixture, makes two local GETs, shows a broken access result followed by a corrected result, then closes. Invented data; no Stripe account or external request.
Connect your own authorized staging endpoint
- Prepare fresh version 1 billing evidence with mode
sandbox-evidence. Setaccessto null; the probe supplies that observation. - Confirm you own or are authorized to test the endpoint, that GET has no side effects, and that it is a sandbox. Configure the dedicated environment variables below in your local shell or CI secret manager.
- Run the command. The output advances the checkpoint to the probe completion time, preserves the original checkpoint and evidence fingerprint, and rechecks freshness. A stale subscription observation stays inconclusive.
- Fail the release step on any nonzero exit code. A match is an endpoint assertion at this checkpoint; it is not independent verification of payment, a protected action or complete lifecycle coverage.
CSV_ACCESS_PROBE_SANDBOX=YES CSV_ACCESS_PROBE_ORIGIN=https://staging.example.com CSV_ACCESS_PROBE_TOKEN=(optional app sandbox bearer token; secret manager only) node billing-access-runner.mjs --probe evidence.json https://staging.example.com/access-check
The lines above name environment settings; use your shell or CI system's environment editor. Never put the token in the command, URL, evidence file or chat. Do not use a Stripe key. Origin must exactly match the endpoint. HTTPS is required except literal loopback fixtures. The browser page never runs the probe.
Endpoint response contract
One GET includes a random X-CSV-Probe-Nonce. Return strict JSON like this using actual application state, with the same nonce and a fresh UTC timestamp. Return 200 for an allowed result; 200 or 403 may contain a valid denial. Authentication failure, generic error pages, redirects and unbound responses are inconclusive.
{
"schema_version": 1,
"environment": "sandbox",
"nonce": "the received X-CSV-Probe-Nonce",
"customer_ref": "pseudonymous_customer",
"plan_ref": "pro",
"allowed": true,
"checked_at": "2026-09-25T12:00:00.000Z"
}Use null for plan_ref when no plan applies. Timestamp above is illustrative: generate a current one. Response limit 8 KiB, request deadline 10 seconds, no redirects or retries. Clock skew more than five seconds into the past is rejected; future timestamps are rejected. Environment and policy correctness remain your responsibility. This optional developer probe sends its bearer token only to the exact explicitly configured endpoint; no probe traffic passes through CSV Close Check.
FOR SMALL SAAS ENGINEERING TEAMS
Would this belong in your release checks?
We are evaluating a $99/month billing-test pilot: one staging app, one supported integration, up to 30 runs a month covering signup, plan changes, failed renewal and cancellation.
That connected service is not available for purchase yet. Tell us which billing change you need to verify. We will confirm support and scope before offering a paid pilot.
Request a $99/month pilotOpens your email app. Nonbinding, no payment, no credentials. You send the request yourself. Privacy · Support.