Credits and billing

CrossCheck bills in credits. One credit roughly maps to one cheap-tier check evaluation; deeper reasoning costs more.

How credits work

Every check the reviewer evaluates costs credits based on which tier of the agent ran it:

TierCreditsWhen it runs
Triage1First pass on most checks. Cheap model, read-only tools, decides pass / fail / not applicable / escalate.
Deep5Runs when triage escalates, or when a check has tier_hint: deep. Larger model, full tool access, multi-step reasoning.

A typical PR with 10 attached checks costs somewhere between 10 and 50 credits — most pass at the triage tier, a few escalate to deep.

General review (inline code review, see PR workflow) always runs at the deep tier and adds 5 credits per PR when enabled.

Plans

PlanCredits / seat / monthBest for
Pro2,500Small teams getting started. Includes ~50–250 PR reviews/seat/month depending on check count and tier mix.
Business10,000Teams with heavier check libraries or many active repos.
EnterpriseCustomCustom pool size, custom overage rates, contract pricing.

See cross-check.dev/pricing for current per-seat pricing.

Your credit pool is per organization, scaled by your seat count, and resets monthly on your billing date. Unused credits don't roll over.

Overage

By default, when your monthly pool runs out, new reviews stop firing. You can flip on overage in Settings → Billing to keep reviewing past the included pool:

  • Overage is billed per 1,000 credits used over the included amount. The rate depends on your plan (lower per-credit on Business than Pro).
  • You can set a monthly overage cap in USD. Past the cap, overage stops and reviews fall back to the "quota exhausted" behavior below.

The cap is a hard ceiling on overage spend only; credits included with your plan don't count toward it.

When the pool is exhausted

If overage is off (or has hit your USD cap), CrossCheck stops enqueuing new reviews. On the next PR webhook, CrossCheck posts a one-time comment on the PR:

Review skipped: your CrossCheck plan's monthly credit quota is exhausted. Enable overage in your org settings to continue.

The comment is deduped per (repo, PR, reason) for 30 days, so a stuck-exhausted org doesn't spam every push. To resume reviews mid-cycle, either enable overage or upgrade your plan.

The Re-review button on a PR also returns a 402 in this state — clicking it surfaces the same message in the UI.

Where to see your usage

Four views, each scoped to a different surface:

PageShows
Org overviewPool used vs. included for the current month; per-repo breakdown.
Repo overviewCredits spent this billing cycle on this repo; per-PR breakdown.
PR detail (/<org>/<repo>/pr/<n>)Credits for every run on this PR; per-check breakdown for the latest run.
Run detail (/<org>/<repo>/runs/<id>)Per-check credit cost for that single run; useful when tuning tier_hint.

Usage is reported as credits — not as USD or input/output tokens. The model and provider behind each tier are CrossCheck implementation details; we change them as cheaper, better models ship without changing what you pay.

Trial

New orgs get a 7-day trial with full Pro features and no overage. You add a card at sign-up via Stripe Checkout; the card isn't charged until the trial ends. Cancel from the Stripe portal before then to avoid being billed.

Managing your subscription

Settings → Billing → Manage billing opens the Stripe Customer Portal for your org. From there you can:

  • Update your card.
  • Download past invoices.
  • Change seat count.
  • Cancel your subscription.

To change plan tier (Pro ↔ Business), use the Change plan button on the same page — that flow runs through CrossCheck so your credit pool resets correctly. Tier changes mid-cycle are prorated by Stripe.

Cancelling your subscription stops billing at the end of the current period. Your data (runs, check groups, cross-check.yaml cache) is retained for 30 days after cancellation in case you reactivate; after that it is deleted.

Seats

A seat is a user with a membership in your CrossCheck org. Invite users from Settings → Members.

  • Removing a user from the org frees their seat at the end of the current billing cycle.
  • A user can be a member of multiple orgs; each org pays for its own seat.

The org's credit pool is plan_credits_per_seat × seat_count. Adding seats increases your monthly pool proportionally and is prorated by Stripe within the cycle.

FAQ

Why credits instead of dollars or tokens? Because the actual cost of an evaluation depends on which model we route to under the hood, and we change that as the model landscape shifts. Credits give you a stable unit so your monthly bill stays predictable even when we switch providers.

Are failed runs billed? Statements that completed before a failure are billed (you got the work). Statements that didn't run aren't.

Do needs_review results still cost credits? Yes — the agent still did the work to produce that verdict.

What if a worker times out mid-statement? That statement isn't billed; the partial run is marked failed and you can re-review.

Can I export usage data? Yes — the per-run, per-repo, and per-org credit summaries are also available via the admin API.