Blog · Board and management reporting · Software
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.
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.
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.
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.
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.
| 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.
=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.Covirage is not affiliated with Google.
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.
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.
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.
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.