If you run LinkedIn Ads, your weekly reporting routine probably looks like this: open Campaign Manager, switch to the right ad account, set the date range, customize columns, click Export, download CSV, paste into the Sheet, fix the headers. Twenty minutes per account on a good week. For agencies or in-house teams managing three or four LinkedIn ad accounts, that is most of a Monday morning gone before any analysis happens.
This guide compares the three ways to connect LinkedIn Ads to Google Sheets in 2026: the free manual CSV export, the Google Apps Script + LinkedIn Marketing API route for developers, and Dataslayer for scheduled no-code reporting. Compare setup time, refresh options, and scheduling, and pick the one that matches your workload.
Which method should you choose?
Before we dive into each method, here is the decision matrix. Pick the row that matches your constraints.
Rule of thumb: if you have one or two LinkedIn ad accounts and you refresh weekly, the manual CSV export is fine. If you manage multiple ad accounts, need daily refresh, or combine LinkedIn with Google Ads, Meta, and GA4 in a single view, a scheduled connector removes the recurring manual work.
Method 1: Manual CSV export from LinkedIn Campaign Manager
This is the free option that comes with LinkedIn Campaign Manager. No setup, no code, no third-party tools.
Setup
- Open LinkedIn Campaign Manager.
- Pick the ad account from the account selector.
- Choose the level you want to report on: Account, Campaign Group, Campaign, or Ad.
- Set the date range from the date picker.
- Click the Export button (top right).
- Pick a report type: Performance, Conversion, Audience, Content, or Lead Gen.
- LinkedIn generates a CSV and emails you a download link (or downloads directly for smaller reports).
- In Google Sheets, go to File → Import → Upload, select the CSV, and choose "Replace current sheet" or "Insert new sheet".
What it does well
- Zero cost. No account linking, no developer tokens.
- Works with every metric Campaign Manager exposes in the UI.
- Lead Gen Form responses can be exported the same way (separate report type).
Where it breaks
- No scheduling. Every weekly report repeats the same 8 steps per account.
- One account at a time. Reporting on three clients means three exports, three downloads, three imports.
- Email-based delivery for large reports. Reports with long date ranges or many breakdowns arrive by email, which fragments the workflow.
- Column drift. If you change the columns customization between exports, the Sheets template you built breaks silently.
- Lead Gen exports are separate from performance exports. Combining lead volume with cost data means reconciling two CSVs by hand.
If those constraints describe your week, methods 2 and 3 address them from different angles. Method 2 needs JavaScript and a LinkedIn Developer App. Method 3 is an add-on designed for recurring multi-account reporting (mirroring the workflow we documented for Meta Ads to Google Sheets and GA4 to Google Sheets).
Method 2: Google Apps Script + LinkedIn Marketing API
If you are comfortable with JavaScript and OAuth, Apps Script gives you full control. You call the LinkedIn Marketing API directly, decide exactly which fields to pull, apply your own transformations, and schedule the script to run automatically.
Setup outline
- Create a LinkedIn Developer App at developers.linkedin.com and request the Marketing Developer Platform access for the right scopes (
r_ads,r_ads_reporting,r_ads_leadgen_automationif you need lead gen data). LinkedIn requires app review before granting Marketing API access; this typically takes a few business days. - From your app, get the Client ID and Client Secret.
- Run an OAuth 2.0 flow once to get an access token. Tokens expire after 60 days; build a refresh flow if you want long-term automation.
- In Google Sheets, open Extensions → Apps Script.
- Write a function that calls
UrlFetchApp.fetch()against theadAnalyticsendpoint with your sponsored account ID, fields, date range, and access token. - Parse the JSON response and write rows to the sheet.
- Add an installable time-driven trigger to run it daily or weekly.
Minimal example
function pullLinkedInAds() {
const ACCESS_TOKEN = 'YOUR_ACCESS_TOKEN';
const SPONSORED_ACCOUNT = 'urn:li:sponsoredAccount:1234567890';
const VERSION = '202604'; // check developer.linkedin.com for the current version
const url = 'https://api.linkedin.com/rest/adAnalytics' +
'?q=analytics' +
'&pivot=CAMPAIGN' +
'&dateRange=(start:(year:2026,month:4,day:1),end:(year:2026,month:4,day:29))' +
'&accounts=List(' + encodeURIComponent(SPONSORED_ACCOUNT) + ')' +
'&fields=externalWebsiteConversions,impressions,clicks,costInUsd,leadGenerationMailContactInfoShares';
const response = UrlFetchApp.fetch(url, {
headers: {
'Authorization': 'Bearer ' + ACCESS_TOKEN,
'LinkedIn-Version': VERSION,
'X-Restli-Protocol-Version': '2.0.0'
},
muteHttpExceptions: true
});
const data = JSON.parse(response.getContentText());
const sheet = SpreadsheetApp.getActiveSheet();
sheet.clear();
sheet.appendRow(['Impressions', 'Clicks', 'Spend USD', 'Conversions']);
data.elements.forEach(row => {
sheet.appendRow([
row.impressions,
row.clicks,
row.costInUsd,
row.externalWebsiteConversions
]);
});
}
When this makes sense
- You need a transformation no add-on supports, like joining LinkedIn ad spend with custom CRM stage data and recomputing pipeline value per impression.
- You are building an internal tool and code ownership matters.
- You want zero recurring cost.
The tradeoff
You own the code, which means you also own the breakage. LinkedIn version the API every quarter (the LinkedIn-Version header is mandatory), tokens expire every 60 days, rate limits are tighter than Meta or Google, and the r_ads_reporting scope requires LinkedIn to approve your app before you can use it in production. Most marketing teams do not have time to maintain this long-term.
Method 3: Dataslayer for Google Sheets
Dataslayer is a Google Sheets add-on built for marketers and agencies who pull from many sources, not just LinkedIn. The point is scheduled, multi-account, multi-source reporting without writing code.
We built Dataslayer partly to solve this for ourselves. We track our own LinkedIn Ads campaigns through the add-on, in a single workbook alongside Google Ads, Meta, GA4, and Stripe. The setup below is the same one we document for our users.
Setup
- In Google Sheets, open Extensions → Add-ons → Get add-ons.
- Search for Dataslayer and install it.
- Open Extensions → Dataslayer → Launch.
- Click "Add data source" and pick LinkedIn Ads. Authenticate with the LinkedIn account that has access to the ad accounts you need.
- Build a query: pick ad accounts, date range, dimensions (Campaign Group, Campaign, Ad, plus audience breakdowns by Country, Industry, Job Function, Seniority, or Company Size), and metrics (Impressions, Clicks, Spend, CTR, CPC, Conversions, Lead Gen form submits).
- Click Run. The data lands in your sheet.
- Set a refresh schedule (hourly, daily, weekly, or custom) from the same panel.
What Dataslayer does well
- 50+ data sources beyond LinkedIn (Google Ads, Meta, GA4, TikTok, Search Console, Shopify, HubSpot, Klaviyo) so you can pull cross-channel reports into the same sheet.
- Multi-account in a single query: pull 5 LinkedIn ad accounts at once with one query block.
- Lead Gen forms are first-class. Pull form responses, contact info shares, and conversion attribution into Sheets without juggling multiple exports.
- Pre-built Looker Studio templates for LinkedIn Ads if you want to escalate from Sheets to a visual dashboard later.
- AI Insights and MCP integration for Claude and ChatGPT from the Advanced tier (ask Claude "what changed in our LinkedIn Ads CPL last week?" and it queries the connector live).

When Dataslayer isn't the right fit
- If you only run LinkedIn Ads on one tiny account and refresh once a month, the free CSV export is enough.
- If you need to write data back to LinkedIn (pause campaigns, edit budgets), Dataslayer is read-only. Use the Campaign Manager UI or the LinkedIn API directly.
- If you have a niche compliance requirement that prohibits third-party connectors, Apps Script with your own LinkedIn app is the cleaner path.
Pricing
Free forever for 1 connector and 1 user. Starter $35/month annual ($39/month billed monthly) covers 3 connectors and 1 destination. Advanced $115/month annual adds hourly schedule, AI Insights, and MCP integration. Pro $345/month annual covers up to 100 accounts per connector with unlimited users. See dataslayer.ai/pricing for full plan details.
Common LinkedIn Ads reports you can build in Google Sheets
Once the data is flowing, these are the reports marketing teams and agencies build most often.
Campaign performance summary
A weekly view across campaigns showing Impressions, Clicks, CTR, Spend, Cost per Click, Conversions, and Cost per Conversion. Filter by date range and campaign group. This replaces the "screenshot from Campaign Manager" your account managers send to clients.
Lead Gen funnel by campaign
LinkedIn Lead Gen Forms produce structured responses that you can pull into Sheets and combine with cost data. Build a funnel: Impressions → Clicks → Form Opens → Form Submits → qualified leads (joined from your CRM). In our experience, teams often see significant variance here between campaigns, and visualizing it weekly catches the misallocation early.
Cost per qualified lead by industry or audience
Pull spend by audience segment (industry, job function, company size), then join against your CRM lead-stage data on email domain or company name. The output is a table of "segment → spend → leads → qualified leads → cost per qualified lead." This is the report sales teams typically ask for and that marketing teams typically struggle to produce without manual work.
Audience overlap and saturation
LinkedIn ad audiences tend to be narrow by definition. Track frequency per campaign and audience breakdown. When frequency climbs into the high single digits per week with no change in CTR, you may have hit saturation; rotate creative or expand the audience.
Pipeline or revenue attribution
Pull last-touch conversions from LinkedIn (externalWebsiteConversions) and join with deal value or LTV from your CRM (HubSpot, Salesforce, Pipedrive). Compute LinkedIn-attributed pipeline or revenue monthly. This is the report that often decides whether the LinkedIn budget gets renewed or cut at the next quarterly review.
Multi-channel paid view
For teams or agencies running LinkedIn alongside Google Ads and Meta, build a single Sheet pulling all three with one query block per source, normalized to common metrics (spend, impressions, clicks, conversions). The cross-channel CPA comparison is the conversation your stakeholder or client wants.
Troubleshooting: the four errors you will hit
"INVALID_TOKEN" or 401 Unauthorized
Your LinkedIn access token has expired. LinkedIn's standard token lifetime is 60 days. Either run the OAuth flow again to refresh, or use a refresh token if you implemented one. In Dataslayer, click the LinkedIn account in the connection panel and re-authenticate.
Rate limit hit (429 Too Many Requests)
LinkedIn rate limits are stricter than Meta or Google. They vary by endpoint and partnership tier (typically a few hundred to a few thousand adAnalytics requests per day for standard apps, higher for Marketing Developer Platform partners). Verify your app's limits in the LinkedIn developer dashboard before scaling production pulls. Fix: batch requests across multiple campaigns into one call where possible, or stagger pulls across the day.
Empty rows for Lead Gen data
Lead Gen Form responses require the r_ads_leadgen_automation scope on top of r_ads_reporting. If you only authorized r_ads_reporting, the form fields come back empty. Re-authenticate with the right scope set. Dataslayer handles this prompt automatically; Apps Script users need to update the OAuth scopes in their app config.
Conversions count mismatch with Campaign Manager UI
The LinkedIn UI shows conversions counted with attribution windows (last-touch, post-click 30 days, view-through 7 days by default). The Marketing API returns the same counts but the windows are configurable per call. If your Sheet shows different numbers than the UI, check the dateRange and conversion window in your query versus what the UI is set to. For more on attribution windows, see our LinkedIn Ads reporting best practices.
LinkedIn Ads in Sheets vs Looker Studio: when to use each
Both tools pull from the same LinkedIn Marketing API. Pick based on the end use, not the data source.
The honest answer: most teams need both. Sheets for ad-hoc analysis and CRM joins, Looker Studio for live dashboards. Dataslayer supports both without rewriting queries.
FAQ
Is it free to connect LinkedIn Ads to Google Sheets?
The manual CSV export is free forever. Apps Script is free as long as you stay within the daily execution quotas. Dataslayer has a free tier for 1 connector and 1 user, plus paid tiers for higher volume and more sources.
How often does the data refresh?
Manual CSV refreshes only when you re-export. Apps Script refreshes on whatever schedule you code. Dataslayer supports hourly, daily, weekly, or every X hours at document level, depending on your plan.
Can I connect multiple LinkedIn ad accounts to one sheet?
Not natively with the manual CSV export, since each download is per-account. Apps Script can loop over account IDs if you write the code. Dataslayer supports multiple LinkedIn ad accounts in the same workbook out of the box, which is why agencies and in-house teams use it for multi-account reporting.
Does it work with Lead Gen forms?
All three methods can pull Lead Gen data. The CSV export has a separate report type for it. Apps Script needs the r_ads_leadgen_automation scope. Dataslayer handles the scope automatically during authentication.
Can I use LinkedIn Ads in Google Sheets for client or stakeholder reporting?
Yes, and it is one of the most common use cases. Agencies build a master template in Sheets, connect each client's LinkedIn ad account, and duplicate the sheet per client. In-house teams do the same with multiple business units or regional accounts. Dataslayer speeds this up because the same query definition can point at different accounts.
Why is my LinkedIn data different in Sheets than in the Campaign Manager UI?
Three common causes. First, the UI uses default attribution windows (post-click 30 days, view-through 7 days) while the API lets you specify the window in the query. Second, the UI auto-applies a recent-data refresh delay; the API returns whatever has been processed at query time. Third, some custom metrics in the UI are computed views that the API exposes as separate fields, so reconciling means combining two API fields manually.
Does Dataslayer cover LinkedIn Insight Tag conversions?
Yes. The Insight Tag conversions show up under the same externalWebsiteConversions field exposed by the Marketing API. Dataslayer pulls them in the standard LinkedIn Ads connector, no extra setup.
Conclusion
The decision is mostly about how often you pull data and how many accounts feed into it. Manual CSV export covers solo advertisers with one LinkedIn account and patience to re-download weekly. Apps Script is for analysts who want full control and can deal with LinkedIn's app review and 60-day token rotation. Dataslayer fits teams, agencies, and anyone who needs LinkedIn data in Google Sheets on a schedule, alongside Google Ads, Meta, GA4, and the rest of the stack.
The real question is which method matches your recurring workload. If you pull LinkedIn data more than once a week, the time you spend on manual exports has a cost that is easy to underestimate.
Track LinkedIn, Google Ads, Meta, and the rest of your marketing stack in one Google Sheet, on a schedule. Try Dataslayer free for 15 days. No credit card required.
If you want the strategy side as well, our guide on how to automate marketing agency reporting across all your clients covers the multi-client workflow that turns this Sheets setup into a delivery system.







