Sign in

Blog · Board and management reporting · Software

SaaS sales revenue analysis: reconcile bookings and ARR

Reconcile signed bookings, net billings, recognized revenue and recurring-revenue movements from SaaS exports. Follow a worked contract example, spreadsheet formulas and checks that explain why the totals differ.

The short answerSaaS sales revenue analysis compares signed contract value, invoices, recognized revenue and recurring-revenue movements without treating them as interchangeable. Start with contract, billing, accounting and subscription exports for a common period. Reconcile each total to its source, bridge the timing differences, and explain new business, expansion and losses only after the figures tie.

SaaS sales revenue analysis separates bookings, billings, recognized revenue and ARR, then reconciles the differences using contract dates and approved finance schedules. Start with totals that tie to their source exports. Only then explain whether new customers, expansion or losses changed the business.

Set the scope before combining files

Use September 2026 for a fictional US software company, Alder Software. All amounts are USD. Bookings mean incremental signed contract value during September, including a signed expansion; billings mean net invoices posted during September; revenue means the accounting team's recognized amount for September.

ARR is the annualized recurring amount active at each reporting date: August 31 for opening ARR and September 30 for closing ARR. The lost subscription is active through August 31, with cancellation effective September 1. This example excludes future starts, implementation fees and uncommitted usage. A multi-year contract's total booking value is therefore different from its annual recurring amount.

The existing bookings, billings and revenue reconciliation explains the general definitions. Here the job is to apply them to SaaS contract movements without joining every invoice to every revenue row and multiplying both. The broader SaaS analytics guide covers the surrounding business questions.

Prepare separate tabs:

Tab Row grain Required fields
Contracts Signed contract or amendment Contract ID, signed date, incremental booked value, service dates
Invoices Invoice or credit line Contract ID, posting date, signed net amount, invoice ID, line ID
Revenue Contract and accounting month Contract ID, period date, approved recognized amount
Subscriptions Subscription and reporting date Contract ID, active recurring amount, effective date, status

Keep credits negative. Keep taxes outside the revenue amount. Preserve the original source identifiers so a reviewer can inspect the rows behind any difference. Export the approved accounting schedule; do not infer recognition from invoice dates.

Work the same contracts three ways

The core subscription began August 1 with annual billing of $120,000 and monthly recognized revenue of $10,000. Its September expansion adds $24,000 of annual recurring revenue, billed in advance, and $2,000 of September revenue. The other rows show a cancellation, an unchanged monthly customer, a new annual customer and a future start.

Contract movement September bookings (USD) September billings (USD) September revenue (USD)
Core: expansion effective September 1 24,000 24,000 12,000
Lost: cancellation effective September 1 0 0 0
Existing: unchanged monthly billing 0 8,000 8,000
New: annual service starts September 1 72,000 72,000 6,000
Future: two-year contract starts October 1 120,000 60,000 0
Total 216,000 164,000 26,000

The future contract bills annually at $60,000. Its second annual invoice is outside September. The core customer's original annual invoice was issued in August, so September billings contain only the expansion invoice.

To rebuild the table in Google Sheets, put contract IDs in summary column A, bookings in B, billings in C and revenue in D. Put September 1, 2026 in H1 and October 1, 2026 in I1 as actual dates. In each source tab, A is contract ID, B is the relevant date, and C is the amount.

In B2, then copy down:

=SUMIFS(Contracts!C:C,Contracts!A:A,$A2,Contracts!B:B,">="&$H$1,Contracts!B:B,"<"&$I$1)

In C2 and D2:

=SUMIFS(Invoices!C:C,Invoices!A:A,$A2,Invoices!B:B,">="&$H$1,Invoices!B:B,"<"&$I$1)
=SUMIFS(Revenue!C:C,Revenue!A:A,$A2,Revenue!B:B,">="&$H$1,Revenue!B:B,"<"&$I$1)

Google's SUMIFS documentation describes summing a range against multiple criteria. The date condition uses the first day of the next month as an exclusive boundary, which also handles posting timestamps on the last day.

Prove the timing differences

For bookings to billings, the only adjustments in this example are the future contract's unbilled second year and the existing customer's billing from a previously signed contract:

September billings = September bookings − Current bookings not yet billed + Prior bookings billed now

That is $216,000 − $60,000 + $8,000 = $164,000. This bridge relies on the stated scope; cancellations, credits or amendments would need separate lines when present.

For revenue, reconcile the deferred balances supplied by accounting:

Contract Opening deferred revenue (USD) September billings (USD) September revenue (USD) Closing deferred revenue (USD)
Core 110,000 24,000 12,000 122,000
Lost 0 0 0 0
Existing 0 8,000 8,000 0
New 0 72,000 6,000 66,000
Future 0 60,000 0 60,000
Total 110,000 164,000 26,000 248,000

The opening core balance is $120,000 less August revenue of $10,000. With no unbilled revenue, refunds or other adjustments in these facts, the check is $110,000 + $164,000 − $248,000 = $26,000. A real file with contract assets or other movements needs those additional bridge lines.

Tie the recognized total and closing deferred balance to the relevant ledger accounts. Tie billings to the invoice register separately. Cash collection requires a separate receipts reconciliation and cannot be read from these columns.

Explain the recurring-revenue movement

Subscription Opening ARR (USD) New ARR (USD) Expansion ARR (USD) Lost ARR (USD) Closing ARR (USD)
Core 120,000 0 24,000 0 144,000
Lost 24,000 0 0 24,000 0
Existing 96,000 0 0 0 96,000
New 0 72,000 0 0 72,000
Future 0 0 0 0 0
Total 240,000 72,000 24,000 24,000 312,000

With B through F as these amount columns, the closing check in G2 is:

=B2+C2+D2-E2-F2

Every row and the total should return zero. Closing ARR is $240,000 + $72,000 + $24,000 − $24,000 = $312,000, growth of 30.0%, rounded to one decimal. Monthly recognized recurring revenue is $144,000 / 12 + $96,000 / 12 + $72,000 / 12 = $26,000 because every active subscription covers the full month here. Midmonth starts would break that shortcut.

Use the SaaS sales dashboard to arrange these reconciled measures alongside pipeline. Keep broader financial analysis separate from this timing exercise, and use sales team cost analysis for the expense side.

Where it goes wrong

  • Joining detailed files directly. Aggregate each file to contract and period first. Multiple invoice and schedule rows otherwise multiply amounts.
  • Counting duplicate export lines. In the invoice tab, =COUNTIFS(D:D,D2,E:E,E2) checks the invoice-ID and line-ID pair. Investigate results above one; Google's COUNTIFS reference confirms the multiple-criteria count syntax.
  • Changing the ARR convention. Including signed future starts in one month and only active service in the next creates a false movement.
  • Using invoice value as revenue. Annual advance billing and service delivery have different timing. Accounting owns the recognized schedule.

Covirage is not affiliated with Google.

Reconcile your SaaS exports in Covirage

Bring a sample of your own contract, billing, approved revenue and subscription exports, or a Google Sheet, to Covirage. Covirage maps the columns, and its tools compute and check the totals and movements; the external AI model explains the results with every figure traced to its rows. Create a free Covirage account, then set up your business and bring your files.

See Covirage for SaaS businesses for the industry context.

Questions people ask

Can SaaS bookings exceed recognized revenue?

Yes. A contract signed during the month can cover future service periods, while recognized revenue follows the accounting schedule. Compare the signed contract value with the approved revenue schedule and explain the service dates before treating the gap as a reporting error.

Should future contracts be included in ARR?

Define the convention before reporting. This example includes only recurring subscriptions active at the reporting date. A signed contract whose service has not started stays outside active ARR and appears separately as future contracted business, even if its first invoice has been issued.

Which team owns the reconciliation?

Finance should own the combined reconciliation and recognized-revenue tie to the ledger. Sales operations confirms signed bookings, billing operations confirms invoices and credits, and the subscription owner confirms effective dates and recurring amounts. Each team resolves differences in its own source records.