By KYN AI Advisory Team — AI implementation specialists, Singapore
A marketing reporting agent pulls figures from Google Analytics 4, the ad platforms and the CRM each month and builds one page: spend, leads and closed revenue per channel, with the change from the prior month. The hard part is not drawing the page. It is joining the three sources so a lead in the ad platform and the same lead in the CRM are counted once.
What should the page contain?
One page. One row per channel. Each row has the same columns.
| Column | Source | Note | |---|---|---| | Spend | Ad platform or invoice | In the account currency, converted once | | Sessions | GA4 | Context only | | Leads | CRM | Count from the CRM, not from the ad platform | | Qualified leads | CRM | After a person marks them | | Closed revenue | CRM or ledger | By lead source | | Cost per lead | Spend / leads | | | Cost per qualified lead | Spend / qualified | | | Change vs prior month | Computed | Number and percent |
Lead with the decision. Put the channels in order of cost per qualified lead, and leave out charts that only show volume. The reader should see which channel to cut and which to feed. Add a short list of actions below the table, each with a named owner. Do not add commentary sentences about why numbers moved. Report the figures and the changes.
Where do the numbers come from?
- GA4. The Google Analytics Data API returns sessions, events and key events by source and medium. GA4 can also export to BigQuery for deeper joins.
- Google Ads. The Google Ads API returns cost, clicks and conversions per campaign.
- Meta. The Marketing API returns spend and results per campaign.
- CRM. Leads with source, owner, stage and value. This is the record the page trusts.
Give the agent read-only credentials for each, held in your cloud account's secret store. It should not hold write rights to any ad account.
How do you join them correctly?
The join key decides whether the page is right. Use a source field set at the moment of capture.
- Tag every link. Use consistent UTM parameters on ads and campaign links, with a fixed naming list: source, medium, campaign.
- Store the tag in the CRM. When a form or WhatsApp click creates a lead, write the source, medium and campaign into the lead record.
- Map ad campaigns to channels. Keep a table: campaign name to channel. The agent applies it and reports any campaign it cannot map.
- Count leads in the CRM. Ad platforms and GA4 count conversions in their own ways. Use them for spend and sessions. Use the CRM for leads and revenue.
- Handle unknown sources. Leads with no source go into an "unattributed" row, shown in full, never spread across the other rows.
Expect differences between sources. GA4, an ad platform and the CRM define a conversion differently, so the numbers will not match. Pick the CRM as the record and state that on the page.
What checks should run before the page goes out?
Scripts, not the model, run these:
- total spend on the page matches the sum of ad invoices or platform totals within a set tolerance;
- lead count equals the CRM count for the month;
- no channel has negative or missing values;
- every campaign is mapped;
- the date range is the full calendar month;
- currency conversions use one stated rate per month.
If a check fails, the page does not send. A person sees the failure with the numbers that disagree. A wrong report that arrives on time is worse than a correct one that is a day late.
How should the page be delivered?
As a single link or PDF to a named person, on a fixed day after month end. Allow a few days for ad platforms to finalise their numbers, since late conversions are added after the fact. Version the page and keep every month, so you can see what was reported at the time.
The same agent can produce a shorter weekly view of spend and leads. Keep that internal, and leave the monthly page as the one the owner reads. For daily operations summaries, see what a daily WhatsApp morning report contains.
What does it cost to run?
The data pulls are free or low cost under the platform terms. The model cost to assemble and check a page is small. KYN's morning reports cost about S$0.05 each, which is a fair guide to a narrow report job. Setup effort, tagging discipline and the attribution table are the real cost, and they are one-off.
What does a monthly page look like with numbers?
The example below is illustrative. It uses invented figures for a services firm to show the layout.
| Channel | Spend (S$) | Leads | Qualified | Cost per qualified (S$) | Closed revenue (S$) | |---|---|---|---|---|---| | Google Ads | 3,000 | 60 | 18 | 167 | 24,000 | | Meta Ads | 1,500 | 45 | 6 | 250 | 6,000 | | Organic search | 0 | 30 | 12 | 0 | 18,000 | | Referral | 0 | 10 | 7 | 0 | 14,000 | | Unattributed | 0 | 8 | 1 | 0 | 0 |
The page orders channels by cost per qualified lead. The firm sees at once that Meta costs more per qualified lead than Google, that organic and referral cost no ad spend, and that eight leads have no source. The unattributed row is a to-do for the tagging process. Organic and referral show zero spend, but they are not free: content and relationship time sit outside this table, and the page should say so in a footnote.
What are the common attribution mistakes?
- Counting a lead twice. A person fills a form after clicking an ad and later messages on WhatsApp. Match on email or phone number, and keep one record.
- Crediting the last click only. A buyer who read three articles and then searched your name is credited to branded search. Decide which rule you use, state it on the page, and keep it fixed across months.
- Mixing currencies. Convert at one stated rate per month and show the rate.
- Comparing a month with a part month. Check the date range on every pull.
- Ignoring refunds and cancellations. Closed revenue should come from the ledger, not from the deal value at the time of signing.
How do you roll this out?
- Month 1. Fix the source field in the CRM and the UTM naming list. Report nothing new yet.
- Month 2. Build the page by hand with the agent's help and compare with the platform dashboards. Note every difference.
- Month 3. Run the checks in code and send the page to the owner.
- Month 4 onward. Review thresholds, add channels as they matter.
The first two months are about data quality. A report built on untagged links will show the same gaps no matter how well it is drawn.
Where KYN fits
KYN builds reporting that joins sources into one record, as it did for a manufacturer that moved eleven systems to three on one AWS account and gets a 06:30 morning report to each department on WhatsApp. For marketing, the agent reads GA4, ads and the CRM through read-only accounts, runs the checks above, and sends the page to a named person. Every action is logged with the actor. The system runs in a cloud account in your name.
The first 14 days are a review of your stack and interviews with your team. A full build ships in under 90 days. See marketing, integrations and finance.
Frequently asked questions
Why not use the ad platform's own conversion numbers?
Each platform counts conversions in its own way and takes credit for the same lead. Use platform numbers for spend, and the CRM for leads and revenue.
Can the agent explain why a number moved?
It can show which campaign or channel moved most. It should not claim a cause, since the data rarely proves one. A person adds judgement if needed.
What if my CRM has no source field?
Add one before anything else. Without a source stored at capture, no report can attribute leads reliably.
Checked 30 October 2026.
Curious whether Marketing agents fits your business? Talk to KYN on WhatsApp — no forms, just a conversation.