A Facebook Ads export reports spend inside the date range selected in Meta Ads Manager. Your monthly client billing record may use a different service period, a separate management fee, and one line for several campaigns. The totals will not match until both files describe the same accounts, dates, currencies, and level of detail.

This is a billing reconciliation problem. It is not an attribution problem. Conversion counts, attribution windows, and return on ad spend do not prove what the agency should invoice. The comparison needs to answer a narrower question: does the media spend and fee recorded for the client agree with the spend covered by the Facebook Ads export?

Start with the two files at their actual level of detail

The Facebook Ads CSV and the client billing file usually describe the same month at different levels.

An Ads Manager export commonly contains fields such as:

Facebook Ads export fieldExampleWhat it identifies
Account ID123456789012345The ad account that incurred the spend
Account nameNorthstar USA readable label that can change
Campaign ID2385190041201A stable campaign reference
Campaign nameJune RetargetingA label that may be edited
Reporting starts2026-06-01First date included in the exported row
Reporting ends2026-06-30Last date included in the exported row
Amount spent8,420.37Spend reported for that row
CurrencyUSDCurrency assigned to the ad account

The monthly client billing file often looks more like this:

Client billing fieldExampleWhat it identifies
ClientNorthstar RetailThe customer being billed
Billing period start2026-06-01Contract or invoice period
Billing period end2026-06-30Contract or invoice period
Ad account referenceNorthstar USInternal account label
Media spend8,420.37Pass-through platform spend
Management fee1,263.06Separate fixed or percentage fee
Adjustment-150.00Credit, correction, or prior-period item
Invoice total9,533.43Amount billed to the client
Invoice numberINV-2026-0618Billing record reference

The export may contain hundreds of campaign or daily rows. The billing file may contain one row per client. A row-by-row lookup cannot resolve that difference. You need to aggregate the Facebook data to the same grain as the billing record before comparing the amounts.

Separate reported spend from Meta's payment charges

Facebook Ads spend and Meta billing charges are related, but they are not interchangeable.

Ads Manager reports spend for the selected reporting dates. Meta may charge a payment method when an account reaches its billing threshold, on its monthly bill date, or under a monthly invoicing arrangement. One card charge can cover spend from several days. A calendar month can contain several charges. A charge near month end can also settle in the following month.

If the client invoice passes through ad spend for June 1 through June 30, the primary source is the spend export for that exact period. Meta payment transactions are a control for proving that the agency was charged, not a row-level substitute for the reporting export.

Keep these comparisons separate:

ComparisonQuestion answered
Ads export vs client billing recordDid the agency bill the correct reported spend for the agreed period?
Meta payment transactions vs card or bank statementDid the platform charges reach the agency's payment account?
Client invoice vs client paymentDid the client pay the amount invoiced?

Mixing all three into one lookup creates false discrepancies. A June campaign can be correctly included in the June client invoice even when the corresponding Meta charge reaches the agency's card statement in July.

Fix the scope before comparing any totals

Most unexplained differences come from scope. Lock the following fields before touching formulas.

Ad accounts

Identify every ad account included in the client's billing. Use Account ID as the match key where possible. Account names are weak keys because they can be renamed, abbreviated, or reused in internal billing records.

Create a small crosswalk if the billing file does not contain Meta Account IDs:

Meta Account IDMeta account nameClient billing nameClient
123456789012345Northstar USNorthstar - Paid SocialNorthstar Retail
987654321098765Northstar CANorthstar CanadaNorthstar Retail

This crosswalk should be maintained separately from the monthly transaction data. It turns inconsistent labels into a repeatable account mapping without editing either source file.

Date range

Use explicit start and end dates. “June billing” is not precise enough if the contract runs from May 26 through June 25 or if the agency closes invoices before the calendar month ends.

Export Facebook Ads data using the same inclusive date range used by the client billing record. If the reporting period crosses two calendar months, export daily data so the correct dates can be selected without estimating a split.

Check the ad account timezone as well. Meta assigns spend to reporting dates using the account's timezone. An agency billing file built in another timezone can move late-night activity across the period boundary. Do not shift dates unless the client agreement defines billing in a different timezone. If it does, document the conversion rule and apply it consistently.

Currency

Do not add spend across currencies. A USD ad account and a GBP ad account cannot be combined into one comparison total without a documented conversion rule.

Match each account in its source currency first. If the client invoice is issued in another currency, keep these fields:

  • Source spend amount
  • Source currency
  • Exchange rate used
  • Rate date or contractual rate basis
  • Converted billing amount
  • Billing currency

The converted amount should be reproducible. A total in the billing currency with no retained source amount or rate is not enough for review.

Billing components

Keep media spend, management fees, taxes, credits, and prior-period adjustments in separate columns. The Facebook export can support the media spend line. It cannot support an agency fee or a manual client credit unless that item is calculated and documented separately.

Build a comparison that survives next month

To match Facebook Ads export data to monthly client billing records, preserve both raw files and build the comparison in a separate working layer.

1. Export the Facebook data at a usable grain

Use one row per day and ad account if the invoice is billed by account. Add campaign ID only when the client billing record separates campaigns, brands, or cost centers.

Exporting at campaign level when the invoice has one client total creates unnecessary rows. Exporting one account-level total when the billing period crosses a custom cutoff removes the detail needed to allocate dates correctly. Choose the lowest level required to reproduce the invoice, not the lowest level available in Ads Manager.

2. Preserve the raw export

Save the original CSV unchanged. Do not rename columns, replace account names, or paste calculated fees into it.

The raw file is your evidence. Transformations belong in the working file, where each change can be explained. This also prevents a late correction from becoming indistinguishable from the source data originally downloaded.

3. Normalize the comparison fields

Create consistent working columns:

Working fieldDerived from
client_keyAccount ID mapped through the account crosswalk
period_startAgreed client billing start date
period_endAgreed client billing end date
source_currencyCurrency from Facebook Ads
source_spendAmount spent from Facebook Ads
billing_currencyCurrency used on the client invoice
billable_spendSource spend converted under the billing rule, if required
fee_amountFixed fee or billable spend multiplied by the agreed rate
adjustment_amountApproved credit or prior-period correction
expected_invoice_totalBillable spend plus fee, tax, and adjustments

Store Amount spent as a number, not text with a currency symbol. Keep IDs as text so long numeric identifiers are not rounded or converted to scientific notation.

4. Aggregate Facebook spend to the billing grain

Filter the export to the approved accounts and period. Then group by the fields represented in the billing record, usually:

  • Client
  • Billing period
  • Ad account
  • Currency

If the client receives one consolidated media-spend line, sum the approved account totals after each account has passed its own currency and date checks. Do not aggregate first and investigate later. An omitted account can be hidden by an overstatement elsewhere.

5. Recalculate the client billing amount

Apply the contract rule to the reconciled spend. For a 15% management fee:

Billing componentCalculationAmount
Facebook Ads spendReconciled export total$8,420.37
Management fee$8,420.37 × 15%$1,263.06
Approved creditFixed adjustment-$150.00
Expected invoice totalSpend + fee + credit$9,533.43

Compare each component independently. If the invoice total differs, this shows whether the problem is platform spend, fee calculation, currency conversion, or an adjustment.

For agencies running the same workflow across platforms, the Google Ads spend and client invoice comparison follows the same principle: align scope first, then calculate the bill from the reconciled platform amount.

6. Compare expected and recorded billing

Your final comparison should expose the difference rather than returning a generic matched or unmatched label.

ClientPeriodExpected spendBilled spendSpend differenceExpected feeBilled feeFee differenceStatus
Northstar RetailJun 1–30$8,420.37$8,420.37$0.00$1,263.06$1,263.06$0.00Matched
Harbor GoodsJun 1–30$4,905.80$4,805.80-$100.00$735.87$720.87-$15.00Review spend
Cedar LabsMay 26–Jun 25$6,112.40$6,112.40$0.00$900.00$900.00$0.00Matched

Use a small tolerance only for documented rounding. A tolerance should not hide currency conversion differences or omitted spend.

Trace the common mismatch patterns

When the totals differ, check the evidence in this order.

The billing period and export period differ. Compare the exact start and end dates. Re-export daily data if either file uses a custom period.

An ad account is missing or assigned to the wrong client. Compare Account IDs against the crosswalk. Do not rely on similar account names.

The billing file contains a net amount. Separate credits, rebates, or prior-period corrections from current-period media spend.

The management fee was calculated from the wrong base. Confirm whether the contract applies the percentage to gross platform spend, converted spend, spend after credits, or another defined base.

Meta charges were treated as monthly spend. Return to the Ads Manager spend export for the client period. Threshold charges belong in the payment-account reconciliation.

A late edit changed the invoice after review. Retain the reviewed version, invoice number, approval date, and any replacement record. The final report should show the adjustment rather than overwriting the earlier amount.

The finished reconciliation should be reviewable without the workbook

A correct output gives the reviewer enough information to reproduce the client bill:

  • The Meta Account IDs included
  • The exact reporting start and end dates
  • The account timezone used for the period
  • Spend by account and source currency
  • Any exchange rate and converted amount
  • The management-fee rule and calculated fee
  • Credits, taxes, and prior-period adjustments shown separately
  • Expected billing, recorded billing, and the remaining difference
  • A list of records requiring correction

The remaining difference should be zero or attached to a named cause and action. “Facebook does not match the invoice” is not a completed reconciliation. “Account 987654321098765 was omitted from the June billing file, understating media spend by $100 and the 15% fee by $15” is.