
Alex Black
Co-Founder / CEO
This is a free Facebook Ads report template for Google Sheets: one workbook for all your clients, every formula written out, and a straight answer on which numbers you can’t add up. When a client asks why their cost per purchase jumped, you can click the cell and see where the number came from.
Search for a template and you get Meta’s help page and a row of galleries from paid connectors. None of them shows a formula. Make a copy of ours, or type the formulas below into a new sheet. Fill it with an export from Meta, or let a SyncWith report refill it on a schedule.
Saves the template to your Google Drive, with made-up example rows for two clients.
A client report needs three parts:
Use link clicks, not clicks (all). Meta’s clicks (all) also counts likes, comments, shares and clicks to your Page, so it makes CTR look better than the traffic you sent. Put two sentences above the summary on what happened and what you’ll do next. Clients read those first.
Use one workbook for every client, with three tabs: Data, Reach and Report. Data and Reach hold the numbers, and Report is what your client sees. Make one copy of the Report tab per client.
One row per day, per ad account, per campaign, with these columns:
Every client’s ad accounts go in the same tab, and the Account Name column keeps them apart. Cover at least the last two full months, so the report can compare them. Column A has to hold real dates, not text, or the formulas below won’t find any rows.
Reach gets its own tab, with one row for each ad account and month: Month in column A, Account Name in B and Reach in C.
Type the first day of the report month in B1, for example 9/1/2026. Put =EDATE(B1,-1) in C1 for last month. Type the client’s ad account name in B2, spelled exactly as it is in the Data tab. Then fill column B with these formulas. Every ratio uses Meta’s own definition:
| Row | Metric | Formula in column B |
|---|---|---|
| 4 | Amount spent | =SUMIFS(Data!$D:$D, Data!$B:$B, $B$2, Data!$A:$A, ">="&B$1, Data!$A:$A, "<"&EDATE(B$1,1)) |
| 5 | Impressions | =SUMIFS(Data!$E:$E, Data!$B:$B, $B$2, Data!$A:$A, ">="&B$1, Data!$A:$A, "<"&EDATE(B$1,1)) |
| 6 | Link clicks | =SUMIFS(Data!$F:$F, Data!$B:$B, $B$2, Data!$A:$A, ">="&B$1, Data!$A:$A, "<"&EDATE(B$1,1)) |
| 7 | Purchases | =SUMIFS(Data!$G:$G, Data!$B:$B, $B$2, Data!$A:$A, ">="&B$1, Data!$A:$A, "<"&EDATE(B$1,1)) |
| 8 | Purchase value | =SUMIFS(Data!$H:$H, Data!$B:$B, $B$2, Data!$A:$A, ">="&B$1, Data!$A:$A, "<"&EDATE(B$1,1)) |
| 9 | Reach | =SUMIFS(Reach!$C:$C, Reach!$B:$B, $B$2, Reach!$A:$A, ">="&B$1, Reach!$A:$A, "<"&EDATE(B$1,1)) |
| 10 | Frequency | =IFERROR(B5/B9,"") |
| 11 | CTR (link) | =IFERROR(B6/B5,"") |
| 12 | CPC (link) | =IFERROR(B4/B6,"") |
| 13 | CPM | =IFERROR(B4/B5*1000,"") |
| 14 | Cost per purchase | =IFERROR(B4/B7,"") |
| 15 | ROAS | =IFERROR(B8/B4,"") |
Copy B4:B15 to column C, and the same formulas read last month. In D4, =IFERROR(B4/C4-1,"") gives the change. Format it as a percent and copy it down to D15.
For lead ads, put Leads in Data column G. Row 7 becomes leads, row 14 becomes cost per lead, and you can delete rows 8 and 15.
Put the attribution line near the top of the report. Meta warns that “comparing across different attribution models will lead to inaccurate conclusions”, so keep the attribution model and setting the same every month, and say so when you change them. Our guide to Meta Ads client reports explains how to choose a setting.
Put this QUERY formula in A18. It lists this client’s campaigns for the month, biggest spender first:
=QUERY(Data!A:H, "select C, sum(D), sum(F), sum(G) where B = '"&$B$2&"' and A >= date '"&TEXT(B1,"yyyy-mm-dd")&"' and A < date '"&TEXT(EDATE(B1,1),"yyyy-mm-dd")&"' group by C order by sum(D) desc", 1)It returns campaign name, spend, link clicks and purchases. Next to it, divide spend by purchases for each campaign’s cost per purchase.
Spend, impressions, link clicks, purchases and purchase value add up across days and campaigns. Ratios and reach don’t.
Work out every ratio from the totals. Never average the campaign rows. Say one campaign had 1,000 impressions and 40 link clicks, a 4.0% CTR, and another had 99,000 impressions and 990 link clicks, a 1.0% CTR. Average the two and you get 2.5%. The real CTR for the month is 1,030 link clicks divided by 100,000 impressions: 1.03%. Send a client 2.5% and you’ve more than doubled their CTR on paper.
Meta defines reach as “the number of people who saw your ads at least once”. If one person saw ads from two campaigns, both campaigns count them, so adding up campaign rows or days counts them twice. That’s why reach comes from its own tab, one number per ad account per month. Frequency divides by reach, so adding it up fails for the same reason.
By hand. In Meta’s Ads Reporting, build a report with the Data tab’s columns and a daily breakdown, export it as a .csv or .xlsx file, and paste it over the Data tab every time you report. Do the same for reach. Meta can also email a saved report on a schedule, but only for a single ad account, and only to people with permissions on it.
On a schedule, with SyncWith. Our Facebook Ads connector for Google Sheets fills both tabs and refills them while you sleep. One SyncWith report can hold every ad account your Facebook login can see. Pick Day, Account Name and Campaign Name as dimensions, add the metric columns, and set it to replace the sheet each time. A second report with Month and Account Name brings in reach. Results use the same default attribution window as Ads Manager for each level, or the one you pick in the report’s settings. Facebook Ads was the source our users connected most in Q3 2026, and 15,251 Facebook Ads reports refreshed in SyncWith that quarter.
For a weekly report, type the Monday that starts the week in B1 and put =B1-7 in C1. Change EDATE(B$1,1) to B$1+7 in each SUMIFS, and EDATE(B1,1) to B1+7 in the campaign QUERY. Then make the Reach tab hold one row per ad account per week, not per month.
Two reports cover every client, so your refreshes don’t grow with your client list. Weekly, the pair uses about 9 refreshes a month. Daily, about 62. The Business plan, $24.99 a month for 100 refreshes, covers either. The free Hobby plan gives you 35 refreshes a month, and each Hobby report stops after 35 refreshes. That’s enough to run both reports daily for about 17 days and try the template on a real client.
Yes. If your client would rather open a live dashboard than a sheet, we have a free Facebook Ads template for Looker Studio that runs on our Facebook Ads connector. The connector has a 14-day free trial, then costs $24.99 a month. The template shows how CTR, cost per click and cost per conversion change year over year, and how impressions split across Facebook, Instagram, Audience Network and Messenger. It also compares campaigns, breaks results down by age, gender and region, and totals spend for any date range. Of the 6,409 Looker Studio connector setups SyncWith saw in Q3 2026, 4,924 were for Facebook Ads.
You can add your own formula fields in Looker Studio, such as CTR and cost per purchase. If you’d rather build the dashboard from scratch, follow our Facebook Ads to Looker Studio walkthrough. One naming note: Google renamed Looker Studio to Data Studio in April 2026, so that’s the name you’ll see when you open it.
To check a single number by hand, our CTR, CPM and ROAS calculators use the same math as the template.
Fill this template with Facebook Ads data on a schedule
Start on the free Hobby plan, with 35 refreshes a month.
Set up Facebook Ads in Google Sheets