🔓 Unlock all 10,000+ workflows & prompts free Join Newsletter →
✅ Full access unlocked — explore all 10,000 AI workflow and prompt templates Browse Templates →
Home n8n Workflow
January 22, 2026

Meta Ads to Google Sheets, reports that stay clean

Lisa Granqvist Partner Workflow Automation Expert

Your Meta Ads reporting probably isn’t hard. It’s just constant. Logging in, exporting, fixing columns, hunting down “why does ROAS look weird today,” then pasting everything into a sheet that slowly turns into a Frankenstein spreadsheet.

This is the kind of Meta Sheets automation performance marketers feel every morning. Agency owners run into it when clients ask for “daily numbers.” And operators inside small teams get stuck maintaining the sheet instead of improving the campaigns.

This workflow pulls yesterday’s results automatically, calculates the KPIs you actually report on, and appends one clean row per campaign per day. You’ll also learn how the built-in backfill works, so you can rebuild history when you onboard a new account.

How This Automation Works

Here’s the complete workflow you’ll be setting up:

n8n Workflow Template: Meta Ads to Google Sheets, reports that stay clean

Why This Matters: Clean Meta reporting without daily cleanup

Meta Ads data is useful, but it’s messy the moment you try to operationalize it. One day you export “yesterday,” the next day someone pulls “last 7 days,” and suddenly your sheet has duplicates, mismatched date columns, and calculations that break when Meta changes a field name. Even when nothing breaks, the mental load is real: you still have to remember to pull the data, you still have to format it, and you still have to explain gaps to your team or clients. After a few weeks, the spreadsheet becomes the bottleneck, not the ads.

It adds up fast. Here’s where it usually breaks down in real life.

  • Exporting results and reformatting columns can easily take about 20 minutes a day, even before you do any analysis.
  • Manual copy-paste introduces silent errors, like ROAS calculated off the wrong spend column or dates shifted by a timezone.
  • When you onboard a new ad account, rebuilding the last 12 months of performance becomes a half-day project.
  • Your dashboards in Looker Studio or Power BI stop being “source of truth” because the underlying sheet is inconsistent.

What You’ll Build: A daily Meta Ads → Google Sheets KPI pipeline

This workflow runs on a daily schedule and pulls yesterday’s campaign performance from the Meta Ads Insights API. It takes the raw response (which is rarely spreadsheet-friendly), flattens it into clean columns, and calculates KPIs you’d normally compute by hand like CPL, CPA, ROAS, CTR, CPC, CPM, and frequency. Then it appends the results into a Google Sheet as a tidy “one row per campaign per day” table, ready for pivots, dashboards, and client reporting. When you need history, you can switch to the manual backfill flow and import a specific date range using a time_range parameter, without rebuilding the workflow.

The workflow starts with a daily cron run at 05:00 that targets yesterday’s results. After the data is transformed, Google Sheets receives appended rows into your chosen tab (often called Meta_Daily_Data). For historical onboarding, the manual trigger runs the same logic across a wider window, then writes into the same dataset.

What You’re Building

Expected Results

Say you manage 25 active campaigns and you refresh reporting every weekday. Manually, pulling yesterday’s numbers, cleaning columns, and pasting into Sheets can take about 20 minutes a day, plus another 10 minutes when something doesn’t line up. With this automation, the daily trigger runs at 05:00, the workflow processes the data in the background, and your sheet is updated by the time you open your laptop. That’s roughly 2 hours back each week, and your table stays consistent for dashboards.

Before You Start

  • n8n instance (try n8n Cloud free)
  • Self-hosting option if you prefer (Hostinger works well)
  • Meta Business account with access to the ad account.
  • Facebook Graph API access to read Insights data.
  • Google Sheets where the daily table will live.
  • Long-lived access token (create a system user in Meta Business Manager, then generate a token with ads_read / read_insights permissions).

Skill level: Intermediate. You won’t write “code from scratch,” but you will edit a few config fields, connect credentials, and validate the sheet headers match the mapped columns.

Want someone to build this for you? Talk to an automation expert (free 15-minute consultation).

Step by Step

A daily schedule kicks everything off. The workflow runs every day at 05:00 and targets “yesterday,” so you don’t have to remember to export anything.

Your settings get applied first. In a simple configuration step, you define the Meta ad account ID (the act_… format), plus your Google Sheet ID and sheet name where rows should be appended.

Meta Ads Insights gets pulled and cleaned. The workflow calls the Facebook Graph API Insights endpoint at the campaign level, then a transform step flattens the response and derives KPIs like CPL, CPA, ROAS, CTR, CPC, CPM, and frequency so the sheet stays consistent.

Google Sheets becomes your reporting table. Each run appends one row per campaign per day into your tab (commonly Meta_Daily_Data), which means your dashboard tools can treat it like a dependable dataset.

You can easily modify the reporting level from campaign to ad set or ad based on your needs. See the full implementation guide below for customization options.

Step-by-Step Implementation Guide

Step 1: Configure the Schedule Trigger

This workflow has two entry points: a daily scheduled run for yesterday’s data and a manual trigger for backfill ranges.

  1. Open Daily Schedule Trigger and set the run time to Trigger At Hour = 6.
  2. Review Manual Backfill Start to confirm it is available for manual executions when you want to backfill historical data.
  3. Confirm the execution flow: Daily Schedule TriggerDefine Meta & Sheet Settings and Manual Backfill StartDefine Backfill Settings.

Tip: Use Manual Backfill Start only for historical pulls so you don’t mix daily and backfill data unintentionally.

Step 2: Connect Meta Ads and Google Sheets

Set your account identifiers and connect the required credentials for Meta Ads (Facebook Graph API) and Google Sheets.

  1. In Define Meta & Sheet Settings, set adAccountId to act_<YOUR_AD_ACCOUNT_ID>, datePreset to yesterday, level to campaign, and timeIncrement to 1.
  2. In Define Meta & Sheet Settings, set sheetId to YOUR_SHEET_ID and sheetNameData to Meta_Daily_Data.
  3. Open Retrieve Meta Insights Yesterday and confirm node is set to {{ $json["adAccountId"] }} and graphApiVersion is v23.0. Credential Required: Connect your facebookGraphApi credentials.
  4. Open Append Daily Rows to Sheet and confirm operation is append, sheetName is {{ $('Define Meta & Sheet Settings').item.json.sheetNameData }}, and documentId is {{ $('Define Meta & Sheet Settings').item.json.sheetId }}. Credential Required: Connect your googleSheetsOAuth2Api credentials.

⚠️ Common Pitfall: The adAccountId must include the act_ prefix or the Meta API will return errors.

Step 3: Set Up the Backfill Path

The backfill path uses a manual trigger and date range settings to retrieve historical insights in bulk.

  1. In Define Backfill Settings, set adAccountId to act_<YOUR_AD_ACCOUNT_ID>, level to campaign, and timeIncrement to 1.
  2. In Define Backfill Settings, set sheetId to YOUR_SHEET_ID and sheetNameData to Meta_Daily_Data.
  3. Set backfillSince to 2024-01-01 and backfillUntil to 2024-03-31.
  4. Open Retrieve Insights by Range and verify time_range is set to {{ '{"since":"' + $json["backfillSince"] + '","until":"' + $json["backfillUntil"] + '"}' }}. Credential Required: Connect your facebookGraphApi credentials.

Step 4: Set Up the Processing Nodes

Both daily and backfill branches transform Meta insights into flat rows suitable for Google Sheets.

  1. In Shape Meta Data for Sheets, keep the JavaScript as-is to parse item.json.data and calculate metrics such as cpl, cpa, and roas.
  2. In Shape Backfill Data, keep the JavaScript as-is so historical data is transformed with the same schema as daily data.
  3. Confirm the execution order for daily processing: Retrieve Meta Insights YesterdayShape Meta Data for SheetsAppend Daily Rows to Sheet.
  4. Confirm the execution order for backfill processing: Retrieve Insights by RangeShape Backfill DataAppend Backfill Rows.

Tip: If your Google Sheet columns differ, update column headers in the sheet to match the output fields (e.g., campaign_name, spend, roas).

Step 5: Configure Output to Google Sheets

Both output nodes append rows into the same sheet, ensuring daily and backfill data share a consistent structure.

  1. Open Append Daily Rows to Sheet and confirm operation is append with mappingMode set to autoMapInputData. Credential Required: Connect your googleSheetsOAuth2Api credentials.
  2. Open Append Backfill Rows and confirm operation is append with mappingMode set to autoMapInputData. Credential Required: Connect your googleSheetsOAuth2Api credentials.
  3. Verify that both nodes point to the same sheet using {{ $('Define Meta & Sheet Settings').item.json.sheetNameData }} and {{ $('Define Backfill Settings').item.json.sheetNameData }}.

Step 6: Test and Activate Your Workflow

Run manual tests for both branches and then activate the schedule for daily reporting.

  1. Click Execute Workflow on Manual Backfill Start to test the backfill path and confirm rows are appended in Meta_Daily_Data.
  2. Manually execute Daily Schedule Trigger to simulate a daily run and confirm new rows appear for yesterday’s date.
  3. Verify that the output contains expected columns such as date, campaign_name, spend, and roas.
  4. Toggle the workflow to Active so Daily Schedule Trigger runs automatically at the configured hour.
🔒

Unlock Full Step-by-Step Guide

Get the complete implementation guide + downloadable template

Troubleshooting Tips

  • Facebook Graph API credentials can expire or lack the right scopes. If the pull fails, check your Meta system user token and confirm ads_read / read_insights permissions in Business Manager first.
  • If you’re using backfills across large time ranges, processing times vary and Meta can rate limit the Insights endpoint. Shorten the date range (monthly or quarterly chunks) if you see incomplete results.
  • Google Sheets appends will quietly misalign if your header row doesn’t match the mapped fields. Make sure the destination sheet has the exact expected columns before your first run.

Quick Answers

What’s the setup time for this Meta Sheets automation automation?

About 30 minutes if your Meta token and Google Sheet are ready.

Is coding required for this task/outcome from focus keyword?

No. You’ll connect credentials, paste your ad account ID, and confirm your sheet headers match what gets appended.

Is n8n free to use for this Meta Sheets automation workflow?

Yes. n8n has a free self-hosted option and a free trial on n8n Cloud. Cloud plans start at $20/month for higher volume. You’ll also need to factor in Meta API usage (usually no direct cost) and any optional AI nodes you add later.

Where can I host n8n to run this automation?

Two options: n8n Cloud (managed, easiest setup) or self-hosting on a VPS. For self-hosting, Hostinger VPS is affordable and handles n8n well. Self-hosting gives you unlimited executions but requires basic server management.

Can I modify this Meta Sheets automation workflow for different use cases?

Yes, pretty easily. You can change the Insights pull from campaign level to ad set or ad by adjusting the settings in the Meta Insights request node, then update the transform step to match the new fields. Common tweaks include adding breakdowns like placement, splitting by platform, or writing into a separate “raw” tab while your dashboard reads from a cleaned view.

Why is my Facebook Graph API connection failing in this workflow?

Usually it’s an expired or under-permissioned access token. Regenerate a long-lived token for your Meta system user, confirm the app/ad account permissions include ads_read and read_insights, then update the credential in n8n. If it works for small pulls but fails on backfills, it can also be rate limiting, so run shorter ranges.

What volume can this Meta Sheets automation workflow process?

For daily pulls, most accounts are fine even on small n8n plans because it’s one execution per day plus rows for each campaign. If you self-host, there’s no execution cap (your server is the limit). Backfills are the heavy part, so run them in chunks if you’re importing a year or more.

Is this Meta Sheets automation automation better than using Zapier or Make?

Often, yes. Meta Insights data needs cleaning and KPI math, and n8n handles that kind of transform logic without you stacking a bunch of paid steps. Self-hosting is also a big deal if you want unlimited runs and tighter control. Zapier or Make can be simpler for very basic exports, but they get awkward once you need backfills, deduping, or custom calculations. If you’re torn, map your “must-have fields” first, then pick the tool that won’t fight you every week. Talk to an automation expert if you’re not sure which fits.

Once this is running, your Meta reporting turns into a habitless system. The sheet stays clean, the KPIs stay consistent, and you get your mornings back.

Need Help Setting This Up?

Our automation experts can build and customize this workflow for your specific needs. Free 15-minute consultation—no commitment required.

Lisa Granqvist

Workflow Automation Expert

Expert in workflow automation and no-code tools.

×

Use template

Get instant access to this n8n workflow Json file

💬
Get a free quote today!
Get a free quote today!

Tell us what you need and we'll get back to you within one working day.

Get a free quote today!
Get a free quote today!

Tell us what you need and we'll get back to you within one working day.

Launch login modal Launch register modal