Data Model
Schema Overview
Five tables representing a standard SaaS billing environment. Every query in this project runs against this schema — no joins beyond what's necessary, no assumptions about tooling. Compatible with PostgreSQL, BigQuery, Snowflake, and Redshift with minor syntax adjustments.
The Queries
Five Revenue Reconciliation Queries
SELECT a.account_name, a.tier, a.csm_owner, COUNT(i.invoice_id) AS open_invoice_count, SUM(i.amount_due) AS total_outstanding, -- Age buckets SUM(CASE WHEN CURRENT_DATE - i.due_date BETWEEN 1 AND 30 THEN i.amount_due ELSE 0 END) AS bucket_1_30, SUM(CASE WHEN CURRENT_DATE - i.due_date BETWEEN 31 AND 60 THEN i.amount_due ELSE 0 END) AS bucket_31_60, SUM(CASE WHEN CURRENT_DATE - i.due_date BETWEEN 61 AND 90 THEN i.amount_due ELSE 0 END) AS bucket_61_90, SUM(CASE WHEN CURRENT_DATE - i.due_date >> 90 THEN i.amount_due ELSE 0 END) AS bucket_90_plus, -- Escalation flag CASE WHEN SUM(CASE WHEN CURRENT_DATE - i.due_date >> 90 THEN i.amount_due ELSE 0 END) > 10000 THEN 'ESCALATE' WHEN SUM(CASE WHEN CURRENT_DATE - i.due_date >> 60 THEN i.amount_due ELSE 0 END) > 5000 THEN 'PRIORITY FOLLOW-UP' ELSE 'STANDARD' END AS collection_priority FROM invoices i JOIN accounts a ON i.account_id = a.account_id WHERE i.status NOT IN ('paid', 'void', 'written_off') GROUP BY a.account_name, a.tier, a.csm_owner HAVING SUM(i.amount_due) > 0 ORDER BY total_outstanding DESC;
Sample output
| account_name | tier | total_outstanding | bucket_90_plus | collection_priority |
|---|---|---|---|---|
| Meridian Financial | Enterprise | $84,200 | $41,000 | ESCALATE |
| Atlas SaaS Group | Mid-Market | $22,500 | $0 | PRIORITY FOLLOW-UP |
| Cornerstone Retail | SMB | $4,800 | $0 | STANDARD |
WITH payment_totals AS ( SELECT invoice_id, SUM(amount_paid) AS total_paid, MAX(payment_date) AS last_payment_date FROM payments GROUP BY invoice_id ), credit_totals AS ( SELECT invoice_id, SUM(memo_amount) AS total_credits FROM credit_memos GROUP BY invoice_id ) SELECT a.account_name, i.invoice_id, i.amount_due, COALESCE(pt.total_paid, 0) AS total_paid, COALESCE(ct.total_credits, 0) AS credits_applied, i.amount_due - COALESCE(pt.total_paid, 0) - COALESCE(ct.total_credits, 0) AS net_balance_due, ROUND(COALESCE(pt.total_paid,0) / NULLIF(i.amount_due,0) * 100, 2) AS pct_paid, CURRENT_DATE - i.due_date AS days_past_due FROM invoices i JOIN accounts a ON i.account_id = a.account_id LEFT JOIN payment_totals pt ON i.invoice_id = pt.invoice_id LEFT JOIN credit_totals ct ON i.invoice_id = ct.invoice_id WHERE (i.amount_due - COALESCE(pt.total_paid, 0) - COALESCE(ct.total_credits, 0)) > 0.01 ORDER BY net_balance_due DESC;
Sample output
| account_name | invoice_id | amount_due | total_paid | net_balance_due | pct_paid | days_past_due |
|---|---|---|---|---|---|---|
| NovaTech Corp | INV-8821 | $12,000 | $9,500 | $2,500 | 79.17% | 47 |
| Riverstone Ltd | INV-9104 | $5,400 | $5,000 | $400 | 92.59% | 12 |
| Apex Holdings | INV-7733 | $3,200 | $0 | $3,200 | 0.00% | 91 |
WITH invoice_fingerprint AS ( SELECT invoice_id, account_id, product_line, billing_period_start, billing_period_end, amount_due, -- Count invoices per account + product + period COUNT(*) OVER ( PARTITION BY account_id, product_line, billing_period_start, billing_period_end ) AS period_invoice_count FROM invoices WHERE status NOT IN ('void', 'written_off') ) SELECT a.account_name, f.product_line, f.billing_period_start, f.billing_period_end, f.period_invoice_count AS duplicate_count, SUM(f.amount_due) AS total_billed, MIN(f.amount_due) AS expected_charge, SUM(f.amount_due) - MIN(f.amount_due) AS overcharge_amount, STRING_AGG(f.invoice_id, ', ') AS invoice_ids FROM invoice_fingerprint f JOIN accounts a ON f.account_id = a.account_id WHERE f.period_invoice_count > 1 GROUP BY a.account_name, f.product_line, f.billing_period_start, f.billing_period_end, f.period_invoice_count ORDER BY overcharge_amount DESC;
Sample output
| account_name | product_line | period | duplicate_count | overcharge_amount | invoice_ids |
|---|---|---|---|---|---|
| Meridian Financial | Platform Pro | 2026-Q1 | 2 | $8,400 | INV-7701, INV-7742 |
| BlueWave Analytics | Data Add-on | 2026-02 | 2 | $1,200 | INV-8830, INV-8831 |
WITH annualised_billing AS ( SELECT account_id, SUM(amount_due) AS actual_arr_billed FROM invoices WHERE invoice_date >= DATE_TRUNC('year', CURRENT_DATE) AND status NOT IN ('void', 'written_off') GROUP BY account_id ) SELECT a.account_name, a.tier, c.contracted_arr, ab.actual_arr_billed, ab.actual_arr_billed - c.contracted_arr AS arr_variance, ROUND( (ab.actual_arr_billed - c.contracted_arr) / NULLIF(c.contracted_arr, 0) * 100, 2 ) AS variance_pct, CASE WHEN ABS(ab.actual_arr_billed - c.contracted_arr) / NULLIF(c.contracted_arr,0) > 0.05 THEN 'REVIEW REQUIRED' WHEN ab.actual_arr_billed > c.contracted_arr THEN 'OVER-BILLED' WHEN ab.actual_arr_billed < c.contracted_arr THEN 'UNDER-BILLED' ELSE 'IN LINE' END AS billing_status, -- Surface renewal risk at same time CASE WHEN c.contract_end <= CURRENT_DATE + INTERVAL '90 days' AND c.auto_renew = FALSE THEN 'RENEWAL RISK' ELSE NULL END AS renewal_flag FROM contracts c JOIN accounts a ON c.account_id = a.account_id LEFT JOIN annualised_billing ab ON c.account_id = ab.account_id WHERE c.contract_end >= CURRENT_DATE ORDER BY ABS(arr_variance) DESC;
Sample output
| account_name | contracted_arr | actual_arr_billed | arr_variance | billing_status | renewal_flag |
|---|---|---|---|---|---|
| Cornerstone Retail | $120,000 | $132,000 | +$12,000 | REVIEW REQUIRED | — |
| Atlas SaaS Group | $84,000 | $78,000 | -$6,000 | UNDER-BILLED | RENEWAL RISK |
| NovaTech Corp | $60,000 | $60,200 | +$200 | IN LINE | — |
WITH aging AS ( SELECT 'Aging Receivables' AS leakage_type, COUNT(DISTINCT invoice_id) AS record_count, SUM(amount_due) AS amount_at_risk FROM invoices WHERE status NOT IN ('paid','void','written_off') AND CURRENT_DATE > due_date ), short_pay AS ( SELECT 'Short Payments' AS leakage_type, COUNT(DISTINCT i.invoice_id) AS record_count, SUM(i.amount_due - COALESCE(p.total_paid,0)) AS amount_at_risk FROM invoices i LEFT JOIN (SELECT invoice_id, SUM(amount_paid) AS total_paid FROM payments GROUP BY invoice_id) p ON i.invoice_id = p.invoice_id WHERE i.status NOT IN ('void','written_off') AND COALESCE(p.total_paid,0) BETWEEN 0.01 AND i.amount_due - 0.01 ), duplicates AS ( SELECT 'Duplicate Charges' AS leakage_type, COUNT(*) AS record_count, SUM(overcharge_amount) AS amount_at_risk FROM ( SELECT SUM(amount_due) - MIN(amount_due) AS overcharge_amount FROM invoices WHERE status NOT IN ('void','written_off') GROUP BY account_id, product_line, billing_period_start, billing_period_end HAVING COUNT(*) > 1 ) dup ) SELECT leakage_type, record_count, ROUND(amount_at_risk, 2) AS amount_at_risk, ROUND( amount_at_risk / SUM(amount_at_risk) OVER () * 100, 1 ) AS pct_of_total_risk FROM ( SELECT * FROM aging UNION ALL SELECT * FROM short_pay UNION ALL SELECT * FROM duplicates ) combined ORDER BY amount_at_risk DESC;
Sample output
| leakage_type | record_count | amount_at_risk | pct_of_total_risk |
|---|---|---|---|
| Aging Receivables | 38 | $214,800 | 61.2% |
| Short Payments | 12 | $88,400 | 25.2% |
| Duplicate Charges | 4 | $47,600 | 13.6% |
Technical Skills
SQL Concepts & Business Domains
SQL Concepts Used
Business & Finance Domains
View the full query file
All five queries in a single clean .sql file — commented, structured, and ready to run against any PostgreSQL-compatible database.