Multi-platform ad spend reconciliation is built on a structural tension that nobody talks about directly: every paid platform produces two different numbers for the same month's spend. The invoice is the finance team's authoritative figure (what the platform actually billed). The performance report is the marketing team's authoritative figure (what the platform's reporting API says was delivered). Reconciliation is the discipline of joining the two per platform and consolidating across platforms into one budget-aligned artifact for the monthly close.
According to Planful's marketing finance research on expense reconciliation cadence, 82% of marketers reconcile expenses at a monthly or slower pace, leaving most marketing teams without a current view of budget availability. The figure is usually quoted as evidence of a measurement problem. It is more useful as evidence that the workflow itself is undocumented. The mechanics of the cross-platform ad spend monthly close — extracting per-platform invoices, joining them to performance reports, resolving timezone variance, writing variance commentary that finance and marketing can both consume — are not difficult. They are just not written down anywhere a practitioner can lift them.
The shape of the operating reality, for most growth-stage advertisers running serious paid media, looks the same. Four to eight active platforms, typically some combination of Google Ads, Meta, LinkedIn, TikTok, Amazon Ads, DV360, and The Trade Desk. A monthly close that takes 5 to 10 hours in spreadsheets and slips by a couple of days every month because per-platform invoices arrive on different schedules, in different timezones, and against a different report grain than the marketing team's performance numbers. A paid media monthly close workflow that exists somewhere between the marketing operations function and FP&A, owned by neither cleanly, that has to consolidate ad spend across platforms before either side can use the result.
The close spreadsheet schema — one row per campaign per platform per month
The marketing close spreadsheet schema that holds up at the campaign grain looks like this:
Platform | Account | Campaign | Channel | Month | Currency | Invoice Amount | Performance Report Amount | Variance | Variance Reason | Budget Amount | Budget Variance | Forecast Amount | Forecast Variance
One row per campaign per platform per month. That grain is the entire point. Aggregate it up via pivot to get platform-level totals and a total paid media number for the FP&A handoff; drill down to a single row when somebody challenges a variance and you need to show your work at the campaign that drove it.
The first four columns are the join keys: Platform identifies the ad network; Account identifies the billing entity within that platform (multi-account advertisers running separate Meta ad accounts per region or per product line need this column to keep reconciliation honest); Campaign is the campaign name as it appears in the platform's reporting interface; Channel is the marketing-side categorization (paid search, paid social, programmatic display, programmatic video, retail media) that FP&A rolls totals up to in the company-wide variance pack. Platform and Channel are the natural pivot dimensions for reporting upward; Campaign is the dimension for variance investigation downward when a platform total is off and one or two campaigns are driving it.
Month anchors to the company's reporting calendar. Currency carries the original invoice currency. Multinational advertisers with EU, US, and APAC accounts produce invoices in multiple currencies; for the close, apply month-end FX rates uniformly to convert to the reporting currency, holding the original currency in the column so the conversion is reviewable. Per-day FX conversion is an audit-grade workflow that belongs to a different process, not to a marketing close that ships by the 7th.
The reconciliation pair sits in the two amount columns. Invoice Amount is the platform's invoice (finance source of truth, what the company actually owes). Performance Report Amount is the platform's spend report (marketing source of truth, what the team's dashboards show). When the two diverge, the Variance column captures the difference and Variance Reason captures the one-sentence explanation — this is the data-integrity check that must clear before any other variance means anything.
The four budget and forecast columns close the loop with planning. Budget Amount is the planned spend for that campaign that month; Budget Variance is actual minus budget, the over- or under-spend marketing finance owes commentary on. Forecast Amount is the most recent in-month forecast (forecasts get revised through the month as delivery data comes in); Forecast Variance is actual minus forecast, which feeds forecast-accuracy commentary and informs next month's plan.
Per-platform inputs: where every invoice and performance report actually lives
Every platform exposes its invoice and its performance report in a different place, on a different schedule, in a different format. The map below covers where to pull each input per platform; the per-platform articles linked alongside cover the extraction step in depth.
Google Ads. Invoices live in the Billing section, downloadable per billing period as a PDF (or available programmatically via the InvoiceService API for accounts at meaningful scale). Performance reports live in the Reports section at campaign level. Most monthly-invoiced accounts receive the prior-month invoice within the first business week, which is what makes Google one of the cleaner platforms to slot into an early-month close. For the extraction step, see Google Ads invoice extraction including the InvoiceService API.
Meta (Facebook and Instagram). Invoices live in Ads Manager Billing under the transactions view; performance reports come from Ads Manager Reports at campaign level. The complication on Meta is that threshold-billed accounts produce a new invoice every time the spend threshold is hit rather than one consolidated monthly invoice, which means a single ad account can generate a dozen or more invoices per month that all need to be aggregated before they can be joined to the campaign-level report. Threshold invoices that span the month boundary (started on the 28th, billed on the 2nd) are the most common source of a month-end reconciliation surprise. See Meta Ads invoice download and conversion to Excel for the extraction detail.
LinkedIn Ads. Invoices live in Campaign Manager's Billing Center; performance reports come from Campaign Manager Reports. Monthly invoicing is the standard for B2B advertisers, and the typical lower volume per account makes manual reconciliation feasible up to a point — until you are running a dozen LinkedIn ad accounts across regions and the manual workflow stops scaling. The per-platform extraction detail is in LinkedIn Ads invoice extraction for B2B marketing finance.
TikTok Ads. Invoices live in TikTok Ads Manager's Billing area; performance reports come from the Reporting section. Account billing terms vary widely between auction buying (closer to Meta-style threshold or post-pay billing depending on account configuration) and reservation buying (closer to traditional IO billing with monthly or campaign-end statements). The mix matters for the close because the two types arrive on different cadences and need different handling.
Amazon Ads (Sponsored Products, Sponsored Brands, Sponsored Display). Invoices live in the Amazon Ads Billing console, often issued per marketplace; performance reports come from the Reports section, also per marketplace. Multi-marketplace advertisers receive multiple invoices each month — one per marketplace per ad type, in some configurations — that have to be consolidated by marketplace before they can be joined to the marketplace-level performance reports. See Amazon Sponsored Ads invoice reconciliation across marketplaces for the consolidation logic.
DV360 (Display & Video 360). Billing flows through Google's billing platform; performance reports come from DV360's Reports interface at insertion-order or line-item level. Reconciling at IO level rather than line-item is the right default for the monthly close — line-item reconciliation produces row counts that overwhelm the close artifact and rarely surface variances the IO grain misses. The deep dive is in DV360 billing report reconciliation and IO-level join.
The Trade Desk. TTD produces a statement (not a tax invoice in most jurisdictions) per advertiser account; performance reports come from TTD's reporting interface. Agency seats and direct seats produce different statement structures, so the close team needs to know which seat type each statement came from before joining to the report. Verify against current TTD documentation if the seat structure changed recently. The deeper workflow for unpacking the TTD fee stack and computing an effective take-rate from the statement and CSV together is in auditing The Trade Desk fee stack and reconciling statements to platform CSVs.
The platforms above cover most of the spend at most growth-stage advertisers, but the long tail matters. Programmatic seats with smaller publishers, retail media networks beyond Amazon (Walmart Connect, Instacart Ads, Target Roundel), and self-serve ad accounts on niche platforms all vary more in their billing structure than the Google or Meta baseline. For each of those, the per-platform article is the right place to handle the specifics — the close-side workflow is the same, but the input map is platform-by-platform.
Resolving the timezone gap across platforms
Each ad platform bills against its own timezone convention. "What we spent on August 15" is not a single answer across Google, Meta, LinkedIn, TikTok, and DV360 — it depends on which timezone each platform's billing engine is using, which can be different from the timezone its reporting interface displays. For the monthly close, this means the cutoff for what counts as in-month spend can drift by a day or more across platforms, which is enough to misallocate a meaningful chunk of spend at month-end if the close team is not converting deliberately.
For platforms not listed below, or for any entry the close team is not certain of, verify against current platform documentation rather than carrying an outdated assumption forward — billing timezone defaults change occasionally and this is the kind of detail that gets quoted once and survives in spreadsheets long after the platform has changed.
| Platform | Billing timezone | Performance report timezone | Notes for the close |
|---|---|---|---|
| Google Ads | Account timezone | Account timezone | Internally consistent; may not match the company's reporting timezone if the account was set up in a different region. |
| Meta | Ad-account timezone (set at account creation) | Ad-account timezone | Difficult to change post-setup. Multiple ad accounts in different timezones produce timezone-fragmented totals that need conversion before consolidation. |
| LinkedIn Ads | UTC for billing | Account timezone for reporting | The billing-vs-reporting asymmetry within a single platform is itself a reconciliation source. |
| TikTok Ads | Account timezone (verify against current platform documentation) | Account timezone for reports; transaction reports may surface in UTC | Cross-check both views during reconciliation. |
| Amazon Ads | Marketplace-local timezone | Marketplace-local timezone | Per-marketplace alignment internally; multi-marketplace closes need conversion at the consolidation step. |
| DV360 | Advertiser timezone | Advertiser timezone | Multi-advertiser setups carry the same fragmentation pattern as multi-account Meta. |
| The Trade Desk | UTC for statements (verify against current documentation) | Configurable per partner | Statement and report timezone can differ; check the partner configuration. |
The resolution rule is straightforward enough that it deserves to be stated plainly: standardize the close on the company's reporting timezone — typically the parent entity's local timezone or whichever timezone FP&A uses for the consolidated monthly variance pack. Convert each platform's spend to that timezone before joining, and document the conversion explicitly in the schema. The cleanest way to do this is a Source Timezone column or a Notes field on the schema's Month column that records what was converted from where, so anyone reading the close artifact a quarter later can trace exactly which conversion was applied.
Most monthly closes resolve at the day level — a campaign that ran on August 15 in Pacific time and August 16 in UTC still falls inside August in both views, so the consolidated month-end totals match. The boundary effects bite hardest on quarterly closes (where misclassifying a few hours of spend across the quarter cutoff matters more) and on audit-ready closes (where the conversion logic itself has to be reviewable). For both of those cases, the conversion needs to be in the schema, not in someone's head.
Three nested variances — invoice vs report, budget vs actual, forecast vs actual
The close produces three distinct variances per row, and they nest in a specific order: invoice-versus-performance-report (a data-integrity check), budget-versus-actual (the over- or under-spend marketing finance is accountable for explaining), and forecast-versus-actual (the in-month forecast accuracy that informs next month's plan). The order matters because a failing data-integrity check invalidates everything downstream of it. There is no point analyzing why marketing overspent budget by 12% on a campaign if the underlying actuals number is wrong — the budget variance is meaningless until the data-integrity variance has cleared.
Invoice-versus-performance-report variance. This is the per-row gap between the platform's invoice (finance authoritative) and the platform's performance report (marketing authoritative) for the same campaign for the same month. Small variances are normal and explainable: platform fee handling that surfaces differently on the invoice than on the report, currency-conversion timing differences when invoices are issued mid-month, in-flight refund credits posted to the invoice but not yet reflected in the campaign report. A per-campaign variance under about 1% of campaign spend rarely needs deeper investigation — note the reason in the Variance Reason column and move on. Larger variances (over 2-3% per campaign) usually trace to one of three structural problems: misaligned account mappings (the campaign rolled up to the wrong account in the schema), threshold-billed Meta invoices that span the month boundary (some of the spend is on this month's invoice and some is on next month's), or campaigns running on accounts that have not yet been added to the close schema. Close out the data-integrity variance row by row before touching the others. This is the marketing-side analogue of the broader invoice reconciliation methodology and three-way matching that AP applies to vendor invoices: match what was billed to what was delivered, explain the gap, then move to the budget question.
Budget-versus-actual variance. This is what marketing finance is genuinely accountable for. It is also where ad spend variance differs most from the variance work an FP&A reader has done on other expense lines, so the section spends the most time here. The marketing-specific variance reasons that come up over and over in commentary:
- Campaign budget reallocations. A brand-awareness budget got pulled mid-month into a performance push because attribution data shifted, or a paused campaign got reactivated against unspent budget on day 25. These reallocations are usually intentional and need to be explained, not flagged as a problem.
- Platform algorithm changes that shifted delivery against the same daily budget. Meta's auction dynamics, Google's smart bidding, TikTok's optimization model, and DV360's optimized buying all routinely deliver more or less than the daily budget cap on any given day, and the monthly total can drift by single-digit percentages even when nothing changed on the marketing team's side.
- Attribution-window adjustments that recategorised spend between channels in the report. A switch from 28-day click to 7-day click attribution on Meta will move conversions (and the spend attributed to them) between campaigns; the spend itself did not change but its allocation across the budget structure did.
- Unspent reserve budgets that finance is going to roll forward or claw back. A campaign that was budgeted at $50K and spent $32K because it hit pacing limits or audience exhaustion produces an under-spend variance that needs commentary on whether the $18K rolls into next month or returns to the budget pool.
Forecast-versus-actual variance. This is forecast accuracy, and it is the input to the next month's planning cycle rather than to any current-month decision. A line that consistently runs under forecast usually means the forecasting model is missing a recurring driver — seasonal lift on retail-adjacent campaigns, promotional cadence on D2C, agency-led bid changes that the in-house team did not model. A line that consistently runs over forecast usually means delivery is hitting platform pacing limits or audience exhaustion that the forecast did not anticipate. The right framing for forecast variance commentary is as a learning loop, not a finger-pointing exercise; surfacing the recurring driver is what improves next month's forecast.
Writing the variance commentary. Marketing and finance read different things from the same number, and the commentary has to land for both. A paragraph that works for both starts with the figure and the direction (positive or negative variance), names the campaign or platform driving it, explains what changed operationally, and ends with the implication for next month or the rest of the quarter. Two or three sentences per material variance — not a treatise, not a one-line "over budget due to performance." The close should carry one commentary line per platform's budget variance and one per platform's forecast variance, plus a paragraph for the consolidated total paid media variance that covers what FP&A will read first.
Cadence compression — from a six-week lag to a one-week close
The Planful research that opened this article also describes a worst-case marketing reconciliation lag of six weeks. That is not a measurement of how long the join itself takes; it is a measurement of how long the workflow takes when nobody has staged it. A close that ships by the 7th of the month for the prior month — a one-week paid media monthly close workflow — runs against the same input data; what changes is the staging.
The cadence that works for most growth-stage advertisers running 4 to 8 platforms looks like this. On the 1st of the month, pull every platform's performance report for the prior month and pre-load them into the close schema's Performance Report Amount column. Performance reports are immediately available at month-end on every major platform, so day-one staging is realistic for everyone. Invoices arrive across the 1st through the 5th depending on platform — Google and most monthly-invoiced LinkedIn and Amazon accounts land in the first business week; threshold-billed Meta accounts and DSP statements (DV360, TTD) arrive on a more variable schedule but typically by the 5th. Run reconciliation at the row level as each platform's invoice lands rather than waiting for the last one; by the 5th, the data-integrity variance should be cleared on every platform whose invoice has arrived. The 6th is for variance commentary on the budget and forecast lines. The 7th is the deliverable date — the close artifact and the one-page commentary deck go to FP&A.
The reason this cadence works is structural. The bottleneck in the close is not the join logic, which is mostly mechanical; it is invoice availability per platform. Staging the workflow so performance reports load on day one and reconciliation runs rolling per platform as each invoice arrives turns the close into a series of overlapping per-platform reconciliations rather than a single end-of-month batch. The artifact closes when the last invoice clears, not when the team starts the work — which usually means the only platforms gating the close are the ones with naturally late invoices, not the ones the team has not gotten to yet.
Pacing data fits the same workflow as the leading indicator. Pacing is what the marketing team sees daily through each platform's pacing UI or a budget pacer tool — in-flight delivery against the daily or campaign budget, projected to month-end. Invoices are the lagging indicator that closes the period. The gap between in-flight pacing and post-close actuals should narrow as the month closes; a persistent gap (pacing consistently under-reads actuals by 3-5%, for example) usually signals a measurement problem in the pacing tool — fees not modeled, refund credits unaccounted for, attribution lag that hides spend from the pacing view — rather than a delivery problem. Worth investigating once and then treating as a known offset rather than re-investigating every month.
Two realistic exceptions are worth naming. Threshold-billed Meta accounts that produce multiple invoices through the month can (and should) be reconciled rolling, not held for end-of-month batch processing — each invoice that arrives mid-month is reconcilable against the corresponding slice of the campaign report immediately, which spreads the workload and shrinks the end-of-month batch. DSP statements that arrive on a 10th or 15th cadence (some TTD seat configurations, some DV360 setups) push the close artifact for those platforms to the corresponding day; a 10th-of-month deliverable on the DSP slice that shipped on the 7th for everything else still beats the six-week worst case by a wide margin. All of which assumes invoice extraction itself is not the bottleneck — manual download and reformatting across 4 to 8 platforms is what historically pushed the close into week three at advertisers running real volume.
Where performance aggregators end and invoice extraction begins
The two-source-of-truth structure that opened this article is also the cleanest way to read the tooling landscape. The marketing source of truth — performance reports across platforms — is what the campaign aggregator category was built to consolidate. The finance source of truth — per-platform invoices — is what the invoice extraction category covers. A complete monthly close needs both halves; a stack with only one is the reason most close teams still spend 5 to 10 hours per month on the workflow.
Performance aggregators (Funnel.io, Supermetrics, TapClicks, Improvado, and similar). This category does the marketing side genuinely well. Each tool pulls performance metrics from each platform's reporting API — spend, impressions, clicks, conversions, attributed revenue — normalizes them into a unified schema, and pushes the result into a warehouse, BI tool, or shared spreadsheet. For the close schema's Performance Report Amount column, an aggregator that already has the API connections wired up is the right input source.
What this category does not do, and is not built to do, is extract invoices. The performance numbers these tools expose are the reporting API's view of spend (delivered media as the platform's reporting endpoint reports it), not the invoiced amount the platform actually billed. The two diverge for entirely legitimate reasons — platform fees that surface on the invoice but not in the report, currency conversions handled differently between billing and reporting, refund credits issued post-period, threshold-billed invoices that span the report period boundary. A reader evaluating the Funnel.io vs invoice extraction question is really asking whether one tool can cover both sources of truth, and the honest answer is that the aggregators cover the marketing side cleanly and leave the finance side to a separate workflow.
Tool-led ad reconciliation products (Flyweel and similar). This is a smaller and newer category that attempts invoice matching directly, usually at narrower scope — a subset of supported platforms, often without the multi-page PDF statement handling that DSP statements and threshold-billed Meta accounts require at scale. Worth evaluating for the specific platforms the tool covers; not a complete-stack answer for an advertiser running 4 to 8 platforms with mixed billing structures.
Invoice extraction as the missing half. This is the category that takes per-platform PDF or downloaded invoice files (Google Ads invoices, Meta threshold-billed invoices, LinkedIn Campaign Manager invoices, TikTok Billing exports, Amazon Ads marketplace invoices, DV360 billing reports, TTD statements) and converts them into structured rows ready for the close schema's Invoice Amount column. This is where automated invoice data extraction fits in the stack — alongside the campaign aggregator that handles the performance side, not as a replacement for it. The complete close stack is one tool covering the marketing side and one covering the finance side; trying to make either tool cover both is what produces the operational gaps a 5-hour close exposes.
In practical terms, that means uploading the batch of monthly invoice files (a Google PDF, the stack of Meta threshold-billed PDFs, the LinkedIn invoice, the DV360 billing report, the TTD statement) with one prompt defining the columns the close schema needs and any per-document rules (one row per invoice, or one row per line item where DSP statements need line-item grain). Batch processing handles the 50 to 200 invoice files a serious advertiser produces per month in a single job, including multi-page DSP statements that run dozens of pages.
The agency case is the same problem at greater scale. Agencies running paid media for multiple clients produce a separate close artifact per client, each built from the same set of platform invoices apportioned per client account. The same tooling map applies — performance aggregator on one side, invoice extraction on the other — multiplied by client count. The deeper agency-side workflow is in advertising agency invoice reconciliation for media buying.
Handing the close to FP&A's company-wide variance analysis
The marketing close is not the end of the workflow. It feeds the company-wide monthly close that FP&A owns, where total paid media becomes one operating expense line in the corporate variance pack alongside payroll, software, agency fees, content production, and the rest of marketing operating expense. The handoff is what makes the marketing close useful upward; without it, the close artifact lives only on marketing's drive and never lands in the place finance actually reads.
The FP&A marketing close bridge is delivered as a Marketing Monthly Close artifact — the close spreadsheet plus a one-page commentary deck — by the 7th of the month. The commentary deck is what FP&A and the controller actually read first; the spreadsheet is the backup they consult when they challenge a variance. A commentary deck that lands cleanly carries four short sections:
- Total paid media for the month, with prior-month comparison and prior-year comparison. The FP&A team needs the absolute number and the trend in one glance before drilling in.
- Budget-versus-actual at the platform level, with the variance commentary lifted directly from the schema. One line per platform, two or three sentences each for material variances, lifted not rewritten.
- Forecast-versus-actual at the platform level, with the in-month forecast revision history. Forecast accuracy is what FP&A uses to weight the marketing line in the next planning cycle, and the revision history is what justifies any large gap between the original and final forecast.
- Top campaign-level variances, typically the top three movers per direction (three over-spends and three under-spends). The campaign grain is what answers the "why" question the platform totals raise; FP&A rarely needs more than the top movers but always needs them.
The same data-integrity-first, budget-second, forecast-third discipline applies to every other line marketing AP reconciles each month — paid media is usually the largest and the most platform-fragmented, but the framework is the same operational pattern. The accounts payable month-end close process and checklist covers the broader framework that the paid-media close slots into.
For agencies producing the marketing close on behalf of clients, the same artifact gets delivered upstream to the client's FP&A team, often with markup or pass-through line items that need to reconcile to the underlying platform invoices the client never sees. The reconciliation discipline on the agency side is the same as the in-house side, applied to the agency-client billing layer; see agency client billing reconciliation against platform invoices for that variant.
Extract invoice data to Excel with natural language prompts
Upload your invoices, describe what you need in plain language, and download clean, structured spreadsheets. No templates, no complex configuration.
Related Articles
Explore adjacent guides and reference articles on this topic.
Construction Supplier Statement Reconciliation at Month-End
Walk the month-end supplier statement reconciliation for US construction — variance patterns, investigation order, credit memos, restocking fees, and cutoff.
Reconcile Merchant Card Deposits to Bank at Month-End
Tie merchant card processor deposits to your bank at month-end. Walk gross-vs-net, settlement timing, multi-processor splits, and a variance decision tree.
Reconcile Malta ARMS Bills Across Property Entities
Build an Excel close workflow for Malta ARMS bills across properties, owner entities, tariffs, accruals, and tenant recharge tie-outs.