Ads performance
Compare a client’s Meta Ads, Google Ads and Google Analytics results month over month in one dashboard.
Ads Performance brings a client’s Meta Ads, Google Ads and Google Analytics results together for one month. Use it to compare periods, inspect campaigns and prepare a client-ready report without combining platform exports by hand.
Connect the client’s accounts
Open Social accounts, choose the client’s workspace and find Ads & analytics. The same section is on the workspace edit page. This is where you link data sources.
- For Meta ad accounts, click Connect Meta, sign in and approve access. Choose the client’s accounts in the list that opens. Use Link accounts to add more later.
- For Google Ads or Google Analytics 4, click Connect Google. One Google sign-in covers both. Use Link accounts for Google Ads and Choose property for Google Analytics 4. A workspace can have one Google Analytics 4 property.
- Open View ads report and choose the Report type: E-commerce for purchases, revenue and ROAS; Lead generation for leads, lead quality and CPL; or Brand awareness for reach, video and engagement.
Each ad account reports in its own currency and gets its own tab in the dashboard. AgencyOS never converts currencies, so you do not need to choose one.
If the client tracks a result in a way the defaults do not cover, change it in Conversion mapping.
Refresh data asks every linked account to update; new numbers normally appear within a few minutes. A manual refresh is limited to once every 10 minutes.
| Status | Meaning | What to do |
|---|---|---|
| Importing | Past data is arriving in the background. | Nothing. |
| Up to date | The account is updating normally. | Nothing. |
| Update failed | The last update didn’t finish, for example because the platform limited requests. | It retries with the next daily update. Retry updates every account in the workspace sooner, once every 10 minutes. |
| Access lost | The sign-in behind this account no longer works. | Use Reconnect, Reconnect Meta or Reconnect Google and sign in as the same person. Its accounts start updating again without losing imported data. |
Unlink an account or remove a sign-in
- Unlink an account: open the account’s menu (the three dots) and choose Unlink. It stops updating for this workspace and its data leaves this workspace’s ads report. Linking it again imports its history again.
- Agency sign-ins are shared by every workspace in your agency. Use Add sign-in when a client’s accounts sit under a different Meta or Google login. With more than one, each account shows which sign-in it uses.
- Remove a sign-in: open its menu and choose Remove sign-in. The dialog shows how many workspaces and accounts use it. Its accounts are unlinked in every one of those workspaces, and signing in again does not relink them. A sign-in used by several workspaces asks you to type a confirmation.
Conversion mapping
Conversion mapping decides which Meta action or Google Ads conversion category counts toward each metric. Most clients can keep the defaults. Change it when a client tracks a result another way, for example with a custom conversion instead of the standard purchase.
- On the Ads Performance page, pick the workspace and click Conversion settings.
- Under Meta action type, enter the one action that should count. Leave the field empty to keep the default shown.
- Under Google Ads conversion categories, select every category that should count. AgencyOS adds them together. Clear the list to stop counting that metric.
- Click Save mapping. To undo your changes, click Reset to defaults and then Save mapping.
For example, enter offsite_conversion.fb_pixel_purchase to count only purchases tracked by the website pixel, or offsite_conversion.custom.<id> for a custom conversion, using its ID from Meta.
| Metric | Default Meta action type | Default Google Ads categories |
|---|---|---|
| Purchases | omni_purchase | Purchase |
| Add to cart | omni_add_to_cart | Add to cart |
| Checkout started | omni_initiated_checkout | Begin checkout |
| Landing page views | landing_page_view | Page view |
| Form submissions | lead | Submit lead form, Imported lead |
| Messaging | Set automatically, and can’t be changed | Message lead |
| Call actions | click_to_call_call_confirm | Phone call lead |
| Booking requests | Not counted | Not counted |
| Appointment requests | schedule_total | Book appointment |
| Qualified leads | Offline import only | Qualified lead |
| Customers | Offline import only | Converted lead |
What to know before you change it
- When it applies: from the next daily update or Refresh data. An update normally rewrites the current and previous months, so older months keep the earlier mapping. To apply it to older months, unlink the account and link it again. Its history is imported again with the current mapping, and the report is incomplete until that finishes.
- Where it applies: every linked account and report type in the workspace. Existing share links keep their snapshot until you create a new link.
- Wrong names: AgencyOS does not check an action type against Meta. If Meta returns nothing under that name, the metric disappears for the updated months instead of showing 0, so copy the exact name.
- Conversion value: on Meta it follows the action chosen for Purchases. On Google Ads it comes only from the Purchase category, even if you select other categories for Purchases.
- Google Ads categories: a category can count toward one metric. If you select it under two metrics, only one of them counts it.
- Messaging on Meta: always uses Meta’s messaging conversations started. Meta does not split this action by app, so WhatsApp, Messenger and Instagram chats can all land here.
- Imported results: an imported value replaces the mapped value for that campaign and month.
Choose the report and period
- Workspace picks the client. You only see workspaces you can access.
- Report type changes the result cards, charts, campaign columns and wording. People with Manage reports or Create & edit workspaces save this choice for the workspace; for everyone else it changes only the current view.
- Month chooses the reporting month. The current month is marked as month to date.
- Compare to uses either the previous month or the same month last year.
- Campaign status shows all, active or paused campaigns. Clear filters returns to the first available workspace, the current month, the previous-month comparison and all campaign statuses.
The page address keeps these choices, so you can bookmark a view or send it to a teammate who has access.
Read the dashboard tabs
- Overview combines the linked ad accounts. Each ad account has its own tab, named after its platform, name and currency, such as Meta: Northwind (EGP); its numbers and money belong to that account only. Google Analytics shows website users and traffic channels. A tab is hidden when its source is not linked.
- When accounts use different currencies, Overview adds up only what can be added, such as purchases and clicks. Money appears in the Accounts table, each account in its own currency. Click an account to open its tab.
- Each result card shows the selected period, its change and the comparison value. Green means better and red means worse; for cost metrics, lower is better.
- The charts show the six-month trend, daily results and the breakdowns that fit the report type. Click a source in Platform summary to open that platform’s first account.
- The supporting-metrics card starts with a shorter list. Use its “Show all … metrics” control to expand it and Show fewer to collapse it.
How the data is shown
AgencyOS stores platform results for each campaign, once per calendar month and once per day. The page reads those stored results, so opening it does not contact Meta or Google. Months follow each ad account’s time zone.
Selected month and comparison month
If you choose October and compare with September, September’s numbers are never added to October’s.
| What you see | Selected month | Comparison month |
|---|---|---|
| Result cards and supporting metrics | The main number | The change and the previous value |
| Campaign table | The value in the cell | The change, and the value when you point to it |
| Six-month chart | Its own bar. The six months end at the selected month | Its own bar |
| Daily chart on an account tab | Solid line | Dashed line, matched by day number |
| Action and platform charts | One bar | A second bar beside it |
The comparison month still affects two things:
- Which campaigns count: a campaign is included if it spent in either month. One that spent only in September appears with — for October and adds nothing to October’s totals.
- Which metrics appear: a metric shows if either month supplied it, so October can read — while September has a value.
The platforms can also place a result in a different month from its cost. Meta reports website purchases on the day they happen and on-Meta actions on the day of the impression. A click on 29 September followed by a website purchase on 2 October counts in October, while the click’s cost stays in September. Google Ads reports conversions on the click date.
Reading the change
The change is (selected month − comparison month) ÷ comparison month × 100. Rates compare the two finished rates.
| Shown | Meaning |
|---|---|
| ▲ or ▼ with a percentage | Both months have a value. Green is better and red is worse, so a cost metric turns red when it goes up. Amount spent and Frequency stay grey. |
| New | The comparison month is exactly 0 and the selected month is not. |
| — | Either month has no value, or both are 0. A campaign that did not exist in the comparison month shows —. |
The current month is compared with a whole month and nothing is adjusted for days. On 3 November, 3 days of November sit against all of October, so most results show a large drop. The page marks this month as month to date.
A campaign that runs across two months
A campaign from 20 October to 10 November is split at the month boundary. October holds 20 to 31 October and November holds 1 to 10 November.
- Days are not adjusted: November compared with October sets 10 days against 12. Start and end dates are not used in any calculation.
- Each rate uses one month: the page has no lifetime figure. For a campaign’s whole-life ROAS, add its conversion value and its spend across both months, then divide.
- Don’t add reach across months: someone who saw the ad in both months counts once in each. Spend, impressions and action counts can be added.
- Results can arrive after it ends: website purchases inside the attribution window land with no new spend, so ROAS can rise after the campaign stops.
- The months around it: October compared with September shows — for the change. December compared with November still lists the campaign, with — for December. After that it is no longer listed.
- Status, budget and dates: these are the campaign’s current settings, not its settings in the month you are viewing.
When numbers change
- Accounts update daily and when someone uses Refresh data. An update normally rewrites the current and previous months, so a finished month can still change during the next month.
- Meta says its results can change for up to 28 days after they are reported. Treat the last few days as provisional.
- A share link keeps the numbers from when it was created. The live page can move away from it.
Other display rules
- Result cards by tab: on Overview the last E-commerce and Lead generation card is Website active users when Google Analytics is linked. On an account tab it becomes Impressions for E-commerce and CTR for Lead generation. Brand awareness uses the same cards on both. Google Analytics shows active, new and returning users and the new-user rate.
- Campaign status: changes only the campaign table and its totals. Cards and charts still count all campaigns.
- Six-month chart: counts every campaign on the platform, including those with no spend in the selected or comparison month, so its bar can differ slightly from the card.
- Daily chart: uses the daily results, which imports do not change. Daily leads can differ from the card, and an imported metric has no daily line.
- Audience and content lists: use the top 50 ad sets and top 50 ads by spend for each account and month. Items with the same name are added together.
- No value: if a platform returns no result for an action, AgencyOS stores nothing, so a month with no purchases can show — or hide the card. ROAS shows — when conversion value is 0. See Why a metric may be missing.
- Rounding: Amount spent and Conversion value show whole currency units. Most cost metrics show 2 decimals, and Cost per video view (3 sec+) and Cost per ThruPlay show 3. Rates show 1 or 2 decimals, and ROAS shows 2 decimals with an x.
How results are calculated
AgencyOS adds base results across campaigns, then calculates each rate from those totals. Campaign rates are never averaged. Rates such as CTR, CPM and ROAS are worked out by AgencyOS and are not copied from the platforms.
The report type changes the layout only. It does not filter campaigns or change what AgencyOS asks the platforms for, so every campaign that spent counts in every report type.
Results that come from the platforms
| Metric | Meta Ads | Google Ads |
|---|---|---|
| Amount spent | spend | Cost |
| Impressions | impressions | Impressions |
| Reach | reach for each campaign and month | Unique users, for some campaign types |
| Clicks | Link clicks (inline_link_clicks). A campaign row without them uses all clicks (clicks) | All clicks |
| Landing page views, Add to cart, Initiated checkout, Purchases, Appointment requests | The action set in Conversion mapping | The categories set in Conversion mapping |
| Conversion value | The value of the action used for Purchases | The value of the Purchase category |
| Form submissions | The mapped action. The default, lead, includes website leads and on-Facebook leads | The mapped categories |
| Messaging conversations | onsite_conversion.messaging_conversation_started_7d, not split by app | The mapped categories |
| Call actions | The mapped action. The default is Meta’s estimated call confirmation clicks, not connected calls | Phone calls plus the mapped categories |
| Video starts | video_play_actions: each time a video starts. The closest figure to all views | Not supplied |
| Video views (3 sec+) | video_view: plays that reached 3 seconds, or 97% of a shorter video. Replay time does not count | TrueView views: 30 seconds or an interaction |
| 25%, 50%, 75% and 100% video views | video_p25_watched_actions to video_p100_watched_actions, including plays that skipped to that point | Quartile rate × Impressions, rounded |
| ThruPlays | Plays to the end or for at least 15 seconds, when Meta returns them | Not supplied |
| Reactions | post_reaction: all reaction types | YouTube likes on Video and Demand Gen campaigns |
| Comments | comment | YouTube comments on Video and Demand Gen campaigns |
| Shares | post | YouTube shares on Video and Demand Gen campaigns |
| Saves | onsite_conversion.post_save | Not supplied |
| Profile visits | instagram_profile_visits, when Meta returns it | Not supplied |
| New Page likes | like: Facebook Page likes credited to ads. Instagram follows are not included | Not supplied |
| New and returning customers and their revenue | Not supplied | Purchase conversions split by customer type |
| Qualified leads, Customers won | Offline import | The mapped categories or offline import |
| Booking requests, Messenger conversations, Leads responded to | Offline import. Booking requests can also be mapped | Offline import. Booking requests can also be mapped |
Website active users, new users and traffic channels come from the linked Google Analytics property. They cover the whole website, not only people who came from these ads.
Results AgencyOS calculates
| Metric | Calculation |
|---|---|
| CTR | Clicks ÷ Impressions × 100 |
| CPC | Amount spent ÷ Clicks |
| CPM | Amount spent ÷ Impressions × 1,000 |
| Frequency | Impressions ÷ Reach |
| ROAS | Conversion value ÷ Amount spent |
| Cost per purchase | Amount spent ÷ Purchases |
| Average order value | Conversion value ÷ Purchases |
| Purchase conversion rate | Purchases ÷ Clicks × 100 |
| Cost per add to cart | Amount spent ÷ Add to cart |
| Cost per checkout | Amount spent ÷ Initiated checkout |
| Cart abandonment rate | (1 − Purchases ÷ Add to cart) × 100 |
| Total leads | Form submissions + Messaging conversations + Call actions + Messenger conversations + Booking requests + Appointment requests, using whichever exist |
| Unqualified leads | Total leads − Qualified leads |
| Cost per lead (CPL) | Amount spent ÷ Total leads |
| Cost per qualified lead | Amount spent ÷ Qualified leads |
| Lead conversion rate | Total leads ÷ Clicks × 100 |
| Lead-to-customer rate | Customers won ÷ Total leads × 100 |
| Customer conversion rate | Customers won ÷ Clicks × 100 |
| Cost per customer | Amount spent ÷ Customers won |
| Lead response rate | Leads responded to ÷ Total leads × 100 |
| Cost per video view (3 sec+) | Amount spent ÷ Video views (3 sec+) |
| Video completion rate | 100% video views ÷ Video starts × 100 |
| Cost per ThruPlay | Amount spent ÷ ThruPlays |
| Post interactions | Reactions + Comments + Shares + Saves, using whichever exist |
| Engagements | Post interactions + Clicks |
| Engagement rate | Engagements ÷ Reach × 100 |
| Audience growth | New Page likes ÷ follower count before the month × 100 |
| Returning users | Website active users − New website users |
| New-user rate | New website users ÷ Website active users × 100 |
What to watch for
- Total reach is a sum: one campaign’s reach is the platform’s own number, but a total adds campaigns together. A person who saw two campaigns counts twice, so total reach can be higher than Ads Manager’s and total Frequency and Engagement rate can be lower.
- Costs use all spend: Cost per purchase, CPL, ROAS and Cost per video view (3 sec+) all use total spend, including campaigns that were not aiming for that result. For example, image campaigns raise Cost per video view (3 sec+).
- Video views are not all plays: Video views (3 sec+) counts only plays that reached the threshold. Use Video starts for every time a video started. On Overview, Meta and Google Ads views are added even though their thresholds differ.
- Two video rates use different bases: Video completion rate divides by Video starts. The client report’s watch chart divides by Video views (3 sec+), so its 100% point is a different number.
- Total leads counts actions, not people: one person who submits a form and sends a message counts twice.
- Engagements is AgencyOS’s own formula: it is not Meta’s Post engagement, so expect a different number in Ads Manager.
- Cart abandonment rate is an estimate: it compares two attributed counts rather than tracking real carts, and it goes negative when purchases exceed adds to cart.
- Audience growth has a broad base: the follower count adds the latest figure before the month from all the workspace’s social accounts, while New Page likes is Facebook only. The comparison month uses the same base.
Find and inspect campaigns
- Use Search campaigns to search by campaign name. The Objective chips narrow the table to objectives found in the current results.
- Each row shows the platform and status. Click a column heading to sort; click it again to reverse the order. The change from the comparison period appears under each value, and the previous value appears when you point to it.
- Click a row or View details to open the details panel. It shows the objective, language, budget, dates, report type, a six-month chart and a metric-by-metric comparison. Where available, you can also open the campaign in its ad platform or open the workspace brief.
- Turn on Highlight this campaign in the client report to mark an important campaign. Highlighted rows show a “★ report” badge and can be included in the report’s campaign section. Changing highlights needs Manage reports.
- Open Export and choose Campaigns (CSV) to download all available campaign columns for the selected and comparison periods. Client report (PDF) opens the report builder and then the browser print dialog.
Build the client report
Click Generate client report to open Client report · customize and preview. The preview uses the same workspace, month and comparison as the dashboard. People with View can preview and download it; Manage reports is needed to change it.
The customize panel includes every part of the report setup:
- Report type: choose E-commerce, Lead generation or Brand awareness.
- Template: choose what to Start from, or enter a name under Save current setup as and click Save.
- Period: change Month and Compare to. These choices also change the dashboard behind the builder.
- Data sources: with more than one ad account, choose the Ad account the report covers. A report opened from an account tab starts on that account. All accounts is offered only when they share a currency, and then you can include Google Ads, Meta Ads or both; at least one must remain selected.
- Cover and branding: change Report title, Prepared by, Accent color and Cover color, including custom colours.
- Sections: show, hide and move the month-at-a-glance, key results, six-month trend, result sources, report-type focus, website, top campaigns, notes and glossary sections.
- Key result cards: turn primary and supporting metrics on or off. At least one card must remain. A metric unavailable from the connected sources is disabled.
- Top campaigns: show the top 3, 5 or 10 and choose the metric used to rank them.
- Notes and next steps: write the client-facing explanation and planned actions.
- Contact: set the Account manager and Email shown in the report.
You can also click a heading, highlight sentence or the client name directly in the preview and edit it in place. Clear text edits removes those direct edits. Reset to template restores the selected template’s sections, result cards, campaign count and ranking while keeping the report’s title, colours, sources, notes and contact details.
Changes autosave shortly after you stop editing. AgencyOS keeps a separate saved report for each workspace and month, so changing one month does not overwrite another client or month. Hide customize panel gives the preview more room; use Show customize panel to bring the controls back.
Use and manage templates
Built-in choices are Standard monthly, Executive summary and Detailed performance. Applying one changes its section visibility, key result cards and number of top campaigns while keeping the report’s own branding and client details.
To make an agency template, finish the setup, enter a name under Save current setup as and click Save. Saved templates appear under Saved templates in Start from and are available across the agency. Applying one uses its full setup and may also switch the report type, but keeps the current report’s account manager and email.
Use Manage templates to rename or delete saved templates. Deleting a template removes it for everyone in the agency; reports already created from it keep their current setup.
Download or share the report
- Click Download PDF. AgencyOS opens the browser print dialog; choose Save as PDF. If the cover or chart colours are missing, enable Background graphics in the print options and try again.
- Click Copy share link to save the report and copy a public link. The client sees a read-only snapshot of the report exactly as it was when the link was created, with its charts and a Download PDF button. They do not need to sign in.
- A share link expires after 90 days. The builder shows when the active link was created, when it expires and how many times it has been viewed.
- Creating another link replaces the active one: the old link stops working and the new snapshot contains the latest saved report. Click Revoke to stop the current link immediately.
Import results tracked outside the ad platforms
Use Import in the campaigns card, then Download template CSV in the Import results dialog. You can upload a CSV or JSON file up to 2 MB and 5,000 rows.
The columns are:
| Column | What to enter |
|---|---|
campaign | The platform campaign ID or exact campaign name. |
platform | meta or google_ads. It can be blank when the campaign name is unique in the workspace. |
month | The result month in YYYY-MM format. |
qualified, customers, responded | Qualified leads, customers won and leads responded to. |
form, wa, calls, msgr, book, appt | Form, messaging, call, Messenger, booking and appointment results. |
Result values must be non-negative whole numbers. Each accepted row replaces the earlier imported row for the same campaign and month; it does not replace the campaign itself or its spend and delivery data. If a later row omits an offline result that was present before, that old imported value is no longer kept. After the import, AgencyOS reports how many rows were imported and lists rejected rows with a reason.
Messaging conversations from Meta already include Messenger chats. If you import msgr, also import wa for the same campaign and month, or Total leads counts those chats twice.
Why a metric may be missing
AgencyOS hides a metric when the linked sources did not supply it. Hidden means “not available”, not zero.
- Form starts appear only when Google Analytics can match the
form_startevent to a Google Ads campaign. - Page visits stay hidden because there is no matching ad action. Instagram follows are not supplied as an ad result either; Meta may separately report Facebook Page likes, shown as New Page likes.
- Lead response rate has no platform result. Import
respondedresults to calculate it. - Qualified leads and Customers won come from an offline import, or from Google Ads when matching qualified-lead or converted-lead conversion categories are available and mapped.
- Google reach is available only for Display, Video, Demand Gen and App campaigns. Search, Shopping and Performance Max campaigns do not add reach.
- Google video quartiles are derived from the quartile rate and impressions, then rounded to a count.
Who can do what
| Privilege | What it allows |
|---|---|
| View | Open Ads Performance, use filters and tabs, inspect campaign details, export campaign CSV files, and preview or download client reports. |
| Manage reports | Customize and autosave reports, change highlights, save and manage templates, create or revoke share links, import offline results, refresh data, and change the report type or conversion mapping. |
| Create & edit workspaces | Connect, choose, reconnect and unlink Meta or Google accounts, and add or remove sign-ins. It also allows the workspace’s report type to be changed. |

