---
title: "Attribution Reconciliation for Marketing Ops | Kylon"
description: "How marketing operations reconciles attribution rows with Google Analytics and Meta Ads, reviews exceptions and restates rows in one Kylon room, with a person approving."
url: "https://kylon.io/use-cases/attribution-reconciliation"
language: "en"
---

[HOME](https://kylon.io/)\>[Use Cases](https://kylon.io/use-cases)\>Attribution Reconciliation: A Month-End Report That Matches the Ad Platforms

Use Case8 min read

# Attribution Reconciliation: A Month-End Report That Matches the Ad Platforms

Thirty campaign rows are reconciled against Google Analytics and Meta Ads, cost per acquisition is checked against each channel's ceiling, and every restatement is written as a full row after the analytics lead approves it.

[Get started](https://app.kylon.io/sign-up)

Kylon TeamProduct

November 6, 2026

## The month-end report says one thing, the platforms say another

The attribution report is a Google Sheet with one row per campaign and twelve columns, from spend and conversions to cost per acquisition, the channel, the source of each figure, the channel ceiling and the flag. Thirty rows across six channels. Every figure is meant to agree with Google Analytics for conversions and with Meta Ads for paid social spend, within a tolerance the analytics lead sets.

It rarely agrees on the first try. Meta counts conversions on its own attribution window and Google Analytics on another, and a mis-tagged UTM puts a campaign in the wrong channel. The analyst's exceptions memo lists the rows they noticed, not every row that misses. Then the data refreshes, the tolerance changes, a UTM fix moves a campaign, and someone updates three cells in a row that has twelve.

## Who works in the room

People

-   Analytics lead
    
    Sets the tolerance and channel ceilings, approves every restated row and signs off the month
    
-   Marketing analyst
    
    Writes the exceptions memo and revises it after review
    
-   Channel owners
    
    Explain mismatches in their channel and confirm tagging fixes
    

Agents

-   FinReconciler
    
    Pulls each campaign's figures from Google Analytics and Meta Ads, checks CPA against the ceiling and proposes complete restated rows
    
    Google AnalyticsMeta AdsGoogle Sheets
    
-   NovaMemo reviewer
    
    Walks the exceptions memo line by line, lists what it left out and drafts questions to channel owners
    
    Google DriveGoogle Sheets[Gmail](https://kylon.io/integrations/gmail) [Slack](https://kylon.io/integrations/slack)
    

Month-end reconciliation happens in one Kylon room. Fin is the room's default agent because the numbers are its job, so a question about why a campaign's CPA moved reaches Fin without a mention. Nova reviews memos and writes to channel owners. Fin reads Google Analytics and Meta Ads through grants the analytics lead approved for the room, and splits the thirty rows across parallel helpers that each pull one campaign's figures and return one reconciled set. When a row will not reconcile from the data alone, Fin hands it to Nova with each source's figure side by side.

## Month-end, row by row

Tolerance, channel CPA ceilings and column rules come from the report folder in Google Drive. One more rule lives in the room guidelines: a restated row is written whole, all twelve columns, never cell by cell.

```mermaid
flowchart TD
  reconcile["<b>Fin</b> reconciles every row and<br>checks CPA against the ceiling"]
  approve["<b>Analytics lead</b> approves restated<br>rows before they reach the sheet"]
  memo["<b>Nova</b> checks the analyst's memo<br>and lists campaigns it left out"]
  revise["<b>Marketing analyst</b><br>revises the memo"]
  refresh([Late conversions arrive<br>in Google Analytics])
  tol["<b>Analytics lead</b> sets<br>a new tolerance"]
  moves["<b>Fin</b> re-derives both channels<br>a UTM fix changes"]
  rederive["<b>Fin</b> re-derives the rows they<br>touch, reports every row"]
  recheck["<b>Fin</b> checks every row again<br>against the new tolerance"]
  owners["<b>Channel owners</b><br>confirm the tagging"]
  restate["<b>Analytics lead</b> approves each<br>complete restated row"]
  summary["<b>Fin</b> proposes every channel row,<br>even where nothing is flagged"]
  sign["<b>Analytics lead</b> approves the<br>rows and signs off the month"]
  reconcile --> approve --> memo --> revise
  revise --> refresh & tol & moves
  refresh --> rederive
  tol --> recheck
  moves --> owners
  rederive & recheck & owners --> restate
  restate --> summary --> sign
  class reconcile,memo,moves,rederive,recheck,summary agent
  class approve,revise,tol,owners,restate,sign person
  class refresh event
  classDef agent fill:#FFFFFF,stroke:#DCD3C8,color:#1B1712
  classDef person fill:#EEF0E3,stroke:#6E7447,color:#1B1712
  classDef event fill:#F4ECDD,stroke:#F4ECDD,color:#564C42
```

| Stage | What happens | Who acts | Who decides |
| --- | --- | --- | --- |
| Reconcile | All 30 rows compared with Google Analytics and Meta Ads, with CPA worked out and checked against each channel's ceiling | Fin | The analytics lead approves restated rows before they reach the sheet |
| Exceptions memo | Each printed line of the analyst's memo is checked, then campaigns the memo left out that also miss are listed | Nova | The analyst revises the memo, and the sheet is not touched |
| Data refresh | Late conversions in Google Analytics re-derive the rows they touch, and all 30 rows are reported again | Fin | The analytics lead approves the restatements |
| Tolerance change | Every row is checked again against the new tolerance, not only the rows flagged before | Fin | The analytics lead sets the tolerance |
| UTM fix | Campaigns that change channel are re-derived, and both channels' figures move | Fin, then Nova for the channel owners | Channel owners confirm the tagging; a person sends each note |
| Channel summary | Six channel rows are written, including any channel with nothing flagged | Fin | The analytics lead approves the six rows and signs off the month |

Stages of a monthly attribution reconciliation. Campaigns, channels and thresholds in this example are illustrative.

## When the data refreshes after the report is out

Google Analytics keeps attributing conversions for days after a campaign's spend has landed. When the refresh arrives, Fin re-derives only the rows the new data touches, twelve this month, but reports all thirty, so the analytics lead sees the restated rows next to the ones that held. A report that lists only what changed cannot show that the rest were checked.

A tolerance change or a UTM fix reaches further. A tighter tolerance can flag a row that passed last week, so every row is checked again. A UTM fix that moves a campaign from display to paid social changes two channels at once. In each case Fin proposes the complete row with every column filled from the current figures, because a row with a new CPA and last week's flag tells two different stories.

## What the checks catch

-   A restated row with new spend but last week's CPA and flag left in the other columns
-   Campaigns that miss tolerance but were left out of the exceptions memo
-   A refresh report that lists only the restated rows instead of all thirty
-   A channel summary with five rows because one channel had nothing flagged
-   A campaign moved to a new channel by a UTM fix but still counted in the old one

## What stays with people

-   Setting the tolerance and each channel's CPA ceiling
-   Approving every restated row before it is written to the sheet
-   Deciding with the channel owner whether a mismatch is a tagging problem or a real gap
-   Signing off the month's channel summary

## Integrations in this workflow

Kylon is not an analytics tool or an attribution product, and it does not replace either. It sits across Google Analytics, Meta Ads and the report sheet and holds the reconciliation between them.

-   [Gmail](https://kylon.io/integrations/gmail)
-   Google Analytics
    
-   Google Drive
    
-   Google Sheets
    
-   Meta Ads
    
-   [Slack](https://kylon.io/integrations/slack)

-   **Google Analytics** supplies conversions by source, medium and campaign
-   **Meta Ads** supplies spend and platform-reported conversions for paid social
-   **Google Sheets** holds the attribution report, written one full row at a time
-   **Google Drive** keeps the tolerance, the channel ceilings and the analyst's exceptions memo
-   **Gmail** carries questions to channel owners, sent by a person from Nova's drafts
-   **Slack** is where channel owners answer quick questions about a campaign's tagging

## Where to start

Reconcile last month's report before this month's. Connect Google Analytics and Meta Ads to the room, share the report sheet, and make this the rule in the room guidelines: a restated row is written in full, and only after the analytics lead approves it.

> “Twelve rows changed. All thirty were checked, and the report shows it.”

## Set it up with your agent

Open a new Room, add your agent and paste this prompt. It connects the tools, builds the App with you and asks for your rules one step at a time, and nothing goes out until a person approves it.

Set-up prompt

Set up our attribution reconciliation desk in this Room. Take it one step at a time and wait for my OK before you move on.

1. Connect Gmail, Google Analytics, Google Drive, Google Sheets, Meta Ads and Slack. Tell me which ones still need connecting.
2. Ask me who works this desk: the analytics lead, the marketing analyst and the channel owners. Help me invite them to this Room.
3. Build an Attribution Review App with Campaign, Channel, Against ceiling and Status columns, one record per campaign. Pull in the rows from the report sheet.
4. Pull each campaign's figures from Google Analytics and Meta Ads, work out the CPA, check it against the threshold we set and propose a complete restated row with all columns filled. Show me every row that misses tolerance, including any our checks left out.
5. Draft questions to channel owners about mismatches and tagging fixes. Hold every draft until a person sends it. Write nothing to the sheet until the analytics lead approves each restated row and signs off the channel summary.
6. Write into this Room's guideline that a restated row is written whole across all columns, that the analytics lead approves every restatement and signs off the month, and that every note to a channel owner goes out from a person.
7. After one clean month-end, offer to turn the data refresh check into an Automation.

Before you start, ask me for our rules one at a time.

[Get started](https://app.kylon.io/sign-up)

Your first company harness. Where humans and agents run your business together.

[Get started](https://app.kylon.io/sign-up)

## More Use Cases

[View all](https://kylon.io/use-cases)

[

### Ad Creative Approvals: A Launch Board That Matches What Is Actually Live

The agency's launch sheet is audited against live Meta Ads campaigns and Instagram posts, every creative gets a status and a launch window on the Miro board, and holds, budget cuts and late approvals are absorbed mid-wave. The desk lead approves every board change.

Media, publishing & agenciesApprovals & reviewsMarketing operations

](https://kylon.io/use-cases/ad-creative-approvals)[

### Ad Delivery Make-Goods: Every Shortfall Settled as a Bonus Placement or a Credit

Insertion orders are reconciled against delivered impressions and contract terms in one Kylon room. Agents work Attio, the Notion delivery report and the Outlook contract threads, re-run bonus allocations when numbers change, and the ad operations lead approves every outcome.

Media, publishing & agenciesMarketing operations

](https://kylon.io/use-cases/ad-delivery-makegoods)
