Three sources cover most seed and Series A updates. Each has its own trap.
Stripe. Do not count charges and call the total revenue. Stripe creates a balance transaction for every movement of money into or out of your account, and Stripe's own documentation calls balance transactions the recommended starting point for reporting on balance activity (Stripe). The processing fee is not a separate transaction; it is a field on the charge's balance transaction, with amount, fee and net on the same row (Acodei). That has a consequence for the update: if you report gross revenue and fee expense on separate lines, one charge becomes two rows in your ledger, which is why a count roughly double your payment count is healthy rather than a duplication bug.
Worked example. Suppose the Payments view shows 412 successful charges for the month. Your revenue line should come from the sum of amount across the relevant balance transactions, not from multiplying 412 by an average price. If the 412 charges carry 412 balance transactions and a monthly Radar or Billing charge adds one more row of type stripe_fee, your gross figure and your fee figure come from different rows and must never be summed together (Acodei). A reconciliation check that compares your Stripe-derived MRR against your bank deposit will fail for entirely correct reasons; compare gross to gross and net to net instead.
Also filter by status. Funds arrive as pending and become available on a schedule that depends on market and payment method (Stripe). An update that closes on the last day of the month can capture money as pending that settles two days later. Pick one convention, write it in the definitions file, and never mix.
Your production database. Product metrics (active seats, usage, feature adoption) come from here, and this is where a schema change silently renames a column and returns zero rather than an error. Use a read replica, wrap each query so a zero-row result raises rather than passes, and record the maximum updated_at you touched as part of the checksum.
Your CRM. Pipeline and the asks section come from the CRM, and the discipline that makes a CRM worth reading is the same one OpenVC describes for fundraising: a small number of stages, each with a clear gate, rather than many intermediate steps (OpenVC). If your pipeline metric depends on a stage name that a sales lead can rename in settings, your number is downstream of someone else's configuration choice. Pin the stage IDs, not the labels.
Write every result into one table with a fixed shape: metric_key, period, value, unit, source, query_checksum, run_at. The template then reads only from this table. Nothing gets pasted in from a dashboard screenshot, ever.