Audit recurring revenue bridge integrity
Audit recurring revenue as a continuous stock/flow ledger: reconcile opening revenue through new, expansion, reactivation, contraction, churn, FX and acquisition/divestiture movements to closing revenue; require each next opening to equal the prior close; and recompute GRR and NRR on an organic existing-customer perimeter that cannot be inflated by new business, reactivation, FX or M&A.
What it's for
Gives CEOs and investors a revenue bridge they can actually trust: every dollar from opening to closing ARR is classified, NRR cannot hide behind new sales or FX, and broken continuity is visible before board metrics are published.
What you give it
Inputs split into evidence read from your connected systems, calibration your team owns, and numerical controls that affect precision but never the result's meaning.
| Field | Type | Role | Required |
|---|---|---|---|
| max_detail_rows | integer ≥ 1, ≤ 500 | Numerical control | Optional |
| maximum_absolute_reconciliation_error | number ≥ 0 | Your calibration | Optional |
| maximum_relative_reconciliation_error | number ≥ 0, ≤ 1 | Your calibration | Optional |
| revenue_periods | array of objects (15 fields) ≥ 1 item | Evidence | Yes |
Each revenue_periods
record
| Field | Type | Required |
|---|---|---|
| acquisition_divestiture_adjustment | number | Yes |
| churned_recurring_revenue | number (≥ 0) | Yes |
| contraction_recurring_revenue | number (≥ 0) | Yes |
| evidence_verified | boolean | Yes |
| expansion_recurring_revenue | number (≥ 0) | Yes |
| fx_translation_adjustment | number | Yes |
| id | string (non-empty) | Yes |
| new_recurring_revenue | number (≥ 0) | Yes |
| opening_recurring_revenue | number (≥ 0) | Yes |
| period_index | integer (≥ 0) | Yes |
| reactivation_recurring_revenue | number (≥ 0) | Yes |
| reported_closing_recurring_revenue | number (≥ 0) | Yes |
| reported_gross_revenue_retention | number (≥ 0, ≤ 1) | Yes |
| reported_net_revenue_retention | number (≥ 0, ≤ 10) | Yes |
| stream_id | string (non-empty) | Yes |
{
"revenue_periods": [
{
"acquisition_divestiture_adjustment": 0,
"churned_recurring_revenue": 3,
"contraction_recurring_revenue": 2,
"evidence_verified": true,
"expansion_recurring_revenue": 5,
"fx_translation_adjustment": 1,
"id": "arr-usd-0",
"new_recurring_revenue": 10,
"opening_recurring_revenue": 100,
"period_index": 0,
"reactivation_recurring_revenue": 0,
"reported_closing_recurring_revenue": 111,
"reported_gross_revenue_retention": 0.95,
"reported_net_revenue_retention": 1,
"stream_id": "usd-saas"
},
{
"acquisition_divestiture_adjustment": 0,
"churned_recurring_revenue": 3,
"contraction_recurring_revenue": 2,
"evidence_verified": true,
"expansion_recurring_revenue": 5,
"fx_translation_adjustment": 1,
"id": "arr-usd-1",
"new_recurring_revenue": 10,
"opening_recurring_revenue": 111,
"period_index": 1,
"reactivation_recurring_revenue": 0,
"reported_closing_recurring_revenue": 122,
"reported_gross_revenue_retention": 0.954954954954955,
"reported_net_revenue_retention": 1,
"stream_id": "usd-saas"
}
]
} What you get back
This is the actual output of running the example above — computed by the same function the platform calls, not an illustration.
{
"configuration": {
"maximum_absolute_reconciliation_error": 0.01,
"maximum_relative_reconciliation_error": 0.001,
"nrr_perimeter": "opening_minus_contraction_minus_churn_plus_expansion"
},
"decision": "recurring_revenue_bridge_integrity_supported",
"guardrails": [
"New business, reactivation, FX and acquisitions/divestitures reconcile closing recurring revenue but do not enter organic existing-customer NRR. GRR excludes expansion and cannot be repaired by upsell.",
"Every stream is audited as a consecutive stock/flow ledger whose next opening must equal the prior reported close. Evidence failures and discontinuities remain visible rather than being backfilled from current totals.",
"Recurring-revenue definitions, currency, contract eligibility and accounting perimeter require finance approval. A discrepancy diagnoses aggregate reporting, never an employee, customer or executive's intent or conduct."
],
"method": "recurring_revenue_stock_flow_grr_nrr_continuity_audit",
"period_diagnostics": [
{
"computed_closing_recurring_revenue": 111,
"computed_gross_revenue_retention": 0.95,
"computed_net_revenue_retention": 1,
"decision": "recurring_revenue_period_reconciled",
"failed_checks": [],
"new_and_reactivation_revenue": 10,
"nonorganic_and_fx_adjustment": 1,
"organic_existing_customer_change": 0,
"period_id": "arr-usd-0",
"period_index": 0,
"stream_id": "usd-saas"
},
{
"computed_closing_recurring_revenue": 122,
"computed_gross_revenue_retention": 0.955,
"computed_net_revenue_retention": 1,
"decision": "recurring_revenue_period_reconciled",
"failed_checks": [],
"new_and_reactivation_revenue": 10,
"nonorganic_and_fx_adjustment": 1,
"organic_existing_customer_change": 0,
"period_id": "arr-usd-1",
"period_index": 1,
"stream_id": "usd-saas"
}
],
"summary": {
"aggregate_gross_revenue_retention": 0.9526,
"aggregate_net_revenue_retention": 1, Truncated for display — the full payload is 53 lines.
How it works
Statistical audit & measurement — Check whether a number is fit to decide on: coverage, timing, reconciliation, and the gaps a dashboard hides.
- 1 Freeze finance-approved recurring-revenue eligibility, currency, stream and period definitions, then retain every signed movement category rather than deriving the bridge from closing totals.
- 2 For each stream and period recompute closing recurring revenue, GRR and NRR, reject impossible existing-customer movements, and reconcile the next opening to the prior reported close with absolute and relative tolerances.
- 3 Aggregate GRR and NRR as opening-revenue-weighted identities, expose organic existing-customer change separately from new/reactivated and nonorganic/FX movement, and withhold integrity when evidence or continuity fails.
Before you trust it
Every tool in the catalog ships with the conditions under which its answer is meaningful — and the conditions under which it should abstain instead of guessing.
Assumptions & guardrails
- Metric definitions, weights, aggregate grain, sampling, missingness, dependence, and comparison windows correspond to the management claim being audited.
- Recurring-revenue contracts, eligibility, period cadence, currency translation, stream perimeter and movement taxonomy are stable; new, expansion, reactivation, contraction, churn, M&A and FX are mutually exclusive and finance-reconciled.
- Association, instability, or measurement quality is not a causal effect and must not be converted directly into an individual employment decision.
- This is a management-ledger integrity check, not GAAP/IFRS accounting, audit, valuation, customer-health, sales-performance or personnel attribution. Discrepancies never establish intent or misconduct.
Minimum evidence
- revenue_periods: at least 1 rows/items
How to validate it
Validate on future periods or held-out aggregate units, compare with a simple baseline, and require stability across plausible metric definitions and decision thresholds.
Calibrating it to your org
Same for everyone
The mathematical kernel, validation rules, method version, and JSON output semantics are organization-independent; no tenant-trained coefficients or company benchmark is embedded in the function.
Specific to you
- finance-approved contract-ledger period aggregate that retains every stock-flow movement and reported KPI rather than inferring revenue from engineering activity
- recurring-revenue eligibility, stream and period grain, currency and FX policy, movement taxonomy, acquisition/divestiture perimeter, GRR/NRR definitions, restatement handling, reconciliation tolerances, evidence and review ownership
Calibration workflow
- 1 Define the management decision, target outcome, aggregate unit, privacy boundary, cadence, and prediction/intervention horizon for this organization.
- 2 Build a tenant-scoped historical cohort using only information available before each prediction or decision; preserve zero periods, censoring, assignment probabilities, and unresolved outcomes when the method requires them.
- 3 Estimate statistical parameters on training history, but obtain costs, utilities, risk tolerance, practical-effect thresholds, capacity, and policy constraints from accountable decision owners.
- 4 Validate on later time windows or held-out aggregate units at the deployment grain, against a simple baseline and the function-specific validation strategy.
- 5 Deploy only if the returned decision clears evidence, overlap, calibration, robustness, and guardrail checks; warning, unsupported, schema-gap, and fallback decisions are abstentions.
- 6 Monitor realized outcomes, data drift, coverage, and decision regret; recalibrate at a governed cadence or after a detected regime/definition change, never merely because a stakeholder dislikes the result.
Call it from your AI
You don't wire up 388 tools in your MCP client. The GitRevio MCP server exposes 18 tools, three of which let an agent search the catalog, read a tool's schema, and run it — so the assistant finds this one on its own.
gitrevio_capabilities_search
{ "q": "audit recurring revenue as a continuous" }
→ finds "audit_recurring_revenue_bridge_integrity"
gitrevio_capability_describe
{ "capability_id": "audit_recurring_revenue_bridge_integrity" }
→ returns the input schema and agent guidance shown on this page
gitrevio_capability_run
{ "capability_id": "audit_recurring_revenue_bridge_integrity", "arguments": { ... } }
→ returns the result shown above Works in Claude Desktop, Claude Code, Cursor, Cline, Continue.dev, Goose and Aider. See the MCP server.
Related tools
Forecast recurring revenue regimes
Fit a diagonal-Gaussian hidden Markov model to consecutive organic ARR growth, GRR, gross margin and cash-burn intensity, order latent regimes by growth rather than arbitrary labels, test effective regime support and improvement over a single-state model, then simulate ARR and unrestricted cash through fitted transitions, within-regime variation and coherent common market scenarios.
Optimize regime contingent growth capital policy
Choose one action for each observable recurring-revenue regime and reuse it on every matching future, charging unique commitment resources once; evaluate every policy on coherent regime paths with multiplicative ARR, cash-burn and full action cost, then maximize expected terminal ARR value plus cash minus CVaR shortfall subject to liquidity, target-ARR, dependencies, exclusions, budget and capacity.
Calculate churn prevention break even
Calculate the absolute churn reduction an intervention must cause to break even, then test aligned baseline/treated scenarios against probability-of-positive-value and portfolio CVaR gates.
Calculate procurement negotiation range
Calculate an uncertainty-aware procurement bargaining zone from independently governed buyer and supplier BATNA economics; protect both reservation prices at explicit confidence levels, derive a bargaining-weight target, quantify ZOPA probability and tail overpayment, and abstain when evidence cannot support an overlap.
Estimate cannibalization adjusted feature value
Estimate feature value after posterior cannibalization of legacy contribution, using aligned adoption scenarios, beta-binomial substitution uncertainty, and value plus substitution-risk gates.
Estimate feature incremental value
Estimate rollout value from segment-level treated/control outcomes with beta-binomial uplift posteriors, finance-owned contribution economics, and a probability-of-positive-value gate.