# LinkedIn Ads Data Export for AI Analysis: What Works and What Breaks

> A LinkedIn ads data export for AI analysis is easy to get and easy to get wrong. You download the CSV, drop it into ChatGPT or Claude, ask what is working, and get a confident answer back. The answer is often wrong, and not because the AI is bad at math.

Author: Emilia Korczynska
Published: 2026-08-20
Updated: 2026-08-28
Categories: For LinkedIn Ads
Source: https://zenabm.com/blog/linkedin-ads-data-export-ai-analysis

---

![LinkedIn Ads Data Export for AI Analysis: What Works and What Breaks](https://cdn.zenabm.com/media/Gemini_Generated_Image_u5yabku5yabku5ya-scaled-e1787909462547.png)

A LinkedIn ads data export for AI analysis is easy to get and easy to get wrong.

You download the CSV, drop it into ChatGPT or Claude, ask what is working, and get a confident answer back.

The answer is often wrong, and not because the AI is bad at math.

It is wrong because the file you gave it is missing the things that decide whether a campaign is actually working, and a few of the numbers inside it are not what they look like.

This post covers what you can actually export, which numbers in that file you cannot trust, how to prep it so the AI stops inventing things, the prompts that work, and the point where you should stop exporting altogether and use a [LinkedIn ads MCP server instead](/mcp).

## LinkedIn ads data export for AI analysis: quick summary

A quick overview:

- [Campaign Manager gives you 11 report](/blog/track-companies-engaging-with-linkedin-ads) types. Which ones you can pick depends on the level you are viewing, so the same export looks different from the account view and the ad view.
- Eight dashboard columns cannot be exported at all, including Key results, [Cost per result](/blog/linkedin-ads-cost-per-result), and Bid. If your prompt asks about cost per result, the AI is guessing.
- LinkedIn deliberately approximates demographic data to protect member privacy. Those rows are close, not exact, so they will not sum to your totals.
- The demographics report has no time breakdown, so you cannot trend it no matter how you prompt.
- Reach is deduplicated per request. Adding reach across campaigns or weeks counts the same person many times.
- Every export is missing the two things that matter most in [ABM](/blog/ai-agents-for-abm): which companies engaged, and which deals they turned into.
- Prep matters. One grain per file, clean headers, no currency symbols, and a short data dictionary at the top of your prompt will remove most hallucinated answers.
- Keep files small. Under roughly 50,000 rows is where these tools stay reliable, and a stratified sample plus a plan beats a giant upload.
- Exports break down at the follow-up question. The moment you ask “why”, the AI needs data that is not in the file.
- The [ZenABM MCP server](/mcp) replaces the export with a live connection, so Claude or ChatGPT queries your real account and can ask its own follow-up questions.
- [ZenABM](/) also fills the gaps the export leaves: [company-level engagement](/companies-engagements), account scores, intent themes, [CRM sync](/crm-sync), and revenue attribution.
- Use the CSV for one-off questions, the API if you are building software, and the [MCP server](/blog/ai-agents-for-linkedin-ads) for everything in between.

## What Campaign Manager actually lets you export

Start with the mechanics, because most guides skip straight to prompting.

In Campaign Manager, you open the reporting view, pick a date range, then choose a report type and a column view before you download the CSV.

![Export linkedin ads performance report from Campaign Manager](https://cdn.zenabm.com/media/Export-linkedin-ads-performance-report-from-Campaign-Manager-ZenABM-scaled.png)

There are 11 report types.

This is the part worth knowing before you export, because picking the wrong one is why people end up with a file that cannot answer their question.

| Report type | What it gives you | Available at |
| **Ad set performance** | Spend, impressions, CTR, engagement rate and more, per ad set | Account, campaign, ad set |
| **Ad performance** | The same metrics, broken down per individual ad | All four levels |
| **Audience network ad set performance** | Splits results between LinkedIn and partner apps and sites | Account, campaign, ad set |
| **Audience network ad performance** | The same platform split, per ad | Campaign, ad set, ad |
| **Professional demographics** | Company name, job seniority and job function of people who interacted | All four levels |
| **Conversion performance** | Conversion types received per ad set | Campaign, ad set |
| **Conversion ad performance** | Conversion data per individual ad | Campaign, ad set, ad |
| **Conversation ad CTA performance** | Button clicks for each action in a conversation ad | Campaign, ad set, ad |
| **Placements ad set performance** | [Performance by placement across LinkedIn](/blog/linkedin-abm-performance-benchmarks-report-2026) and the audience network | Campaign, ad set |
| **Placements ad performance** | Placement metrics per ad | Campaign, ad set, ad |
| **Leads** | Responses to the [lead gen forms](/blog/crm-integrations-linkedin-ad-tracking) attached to your ad sets | Ad set only |

Two practical notes.

The level you are viewing changes both the rows and some of the columns, so exporting “ad performance” from the account view and from the ad view does not give you the same file.

And if you pick demographics, LinkedIn will not let you add a time breakdown at all.

### The columns LinkedIn will not export

This one catches people out, and it matters a lot for AI analysis.

Some columns you can see in the dashboard simply do not come through in the CSV:

- Key results
- Cost per result
- Bid
- MRC net impressions and MRC net clicks
- MRC gross impressions and MRC gross clicks
- Leads (data-driven [attribution](/blog/abm-performance-audit-claude-code))

So if you ask an AI “what is my cost per result by campaign” from a standard export, it has two options.

It can tell you the column is missing, or it can quietly calculate something else and call it cost per result.

In my experience, it often does the second one.

## The five things missing from every export

Now, the part that actually decides whether your analysis is any good.

### 1. Which companies engaged

A standard performance export is aggregated. It tells you a [campaign got 40,000 impressions and 300 clicks](/blog/linkedin-ad-roi-attribution-clicks-vs-impressions).

It does not tell you that 6 of those clicks came from your top [target account](/blog/abm-segmentation).

For [ABM](/blog/signal-based-outbound), that is the whole question, and it is not in the file.

[Campaign Manager does have a companies](/blog/linkedin-ads-impression-capping) view, and the demographics report includes company names, but it is limited and separate from your performance data, so joining the two by hand is slow and lossy.

![Companies tab in LinkedIn campaign manager](https://cdn.zenabm.com/media/linkedin-campaign-manager-companies.png)

[ZenABM pulls the company-level view straight from the LinkedIn Ads API,](/companies-engagements) so engagement is attached to named accounts across every campaign and every person.

![ZenABM Companies view showing target accounts with status and engagement scores for ABM campaigns](https://cdn.zenabm.com/media/Companies-view-ZenABM-demo-account--scaled.png)

### 2. Revenue

Your export has spend, clicks, and maybe conversions. It has no deals.

That gap is how you get a report that looks excellent and means nothing.

An AI reading a spend-and-clicks file will always tell you the cheap campaign is the best one, because cheap is the only quality signal in the data.

Join the ads data to CRM deals, and the ranking usually changes completely.

Kamil Rextin makes the related point in the [ABM Bootcamp](https://www.youtube.com/watch?v=G9nD2udlKOY&list=PLd2UVr6bIOFSPkUso7WJ9SHMVTMyIEA7C&index=18&t=387): you should build targeting from real closed-won and closed-lost records rather than a theoretical persona document.

![Kamil Rextin webinar slide on ABM list building: a wrong list means spray and pray, not ABM](https://cdn.zenabm.com/media/Advice-from-Kamil-Rextin-regarding-list-building-for-ABM.png)

The same logic applies to analysis.

Without outcomes in the file, the AI is grading a test with no answer key.

![ZenABM revenue attribution dashboard tracking ABM ad spend, pipeline and closed revenue by month](https://cdn.zenabm.com/media/ZenABM-abm-revenue-attribution-campaign-dashboard-.png)

### 3. Demographics are approximated on purpose

This is the subtlest trap in the whole article, so read it twice.

LinkedIn approximates professional demographic data to protect member privacy at granular levels.

The numbers are close, usually within a few units of the real figure, but they are not exact.

That means demographic rows will not add up to your campaign totals, and they never were supposed to.

An AI does not know this.

Give it a demographics export and ask it to reconcile job [function totals against campaign impressions](/blog/track-the-roi-of-linkedin-ads), and it will find a discrepancy and then confidently explain it with a story about tracking gaps or attribution windows.

The story will be invented. The discrepancy is by design.

Use demographics exports to compare relative sizes, never to do exact arithmetic.

### 4. Reach cannot be added up

Reach is deduplicated within each request.

If you [pull reach for four campaigns](/blog/linkedin-ads-reporting-api) and add the four numbers, anyone who saw two campaigns is counted twice.

Same problem across weeks.

So “total reach” from a summed export is not a real number, and frequency calculated from it is wrong too.

If you need reach and frequency across a program, they have to be requested at that grain, which is exactly what [ZenABM’s](/blog/what-is-zenabm) reach and frequency option does when you pull metrics.

### 5. Your live delivery settings

A performance export tells you what happened.

It does not tell you what your settings currently are.

Audience [Expansion or the LinkedIn](/blog/linkedin-lookalike-audiences) Audience Network being switched on is one of the most common reasons a campaign underperforms, and neither appears in a results CSV.

![LinkedIn Campaign Manager audience settings with the Enable Audience Expansion checkbox highlighted in red](https://cdn.zenabm.com/media/Audience-expansion-Linkedin-ads.png)

![LinkedIn Campaign Manager placements with LinkedIn Audience Network unchecked, so ads run only on LinkedIn](https://cdn.zenabm.com/media/LAN-LinkedIn-Audience-Network.png)

[ZenABM MCP server’s](/mcp) `get_ad_set_settings` reads budgets, bid, objective, optimization target, Audience Expansion, the Audience Network, and audience size [live from Campaign](/blog/linkedin-campaign-objectives) Manager on every call (more on the MCP server later).

Anything LinkedIn does not return is reported as unknown rather than guessed as off, which matters when an agent is about to tell you why performance dropped.

## How to prep an export so the AI stops inventing numbers

![Preparing LinkedIn export data before using it for AI analysis](https://cdn.zenabm.com/media/zenabm_csv_prep-1.png)

If a CSV is the right tool for your question, prep it properly.

This takes five minutes and removes most bad answers.

- **One grain per file.** Do not mix ad-level rows and campaign-level rows in one upload. The AI will double-count. Export separately and say which is which.
- **Cut the file down.** These tools stay reliable up to roughly 50,000 rows. Past that, trim the date range or the columns rather than uploading everything.
- **Clean the headers.** Rename anything ambiguous before uploading. “Clicks” that means chargeable clicks should say so.
- **Strip currency symbols and thousands separators.** A column of “$1,240.50” is text, not a number, and that alone causes a surprising share of wrong totals.
- **Delete the columns you do not need.** Fewer columns means fewer chances to misread one.
- **Keep one date format,** ideally YYYY-MM-DD.
- **Say what is missing.** Tell the model up front that cost per result and bid are not in the file.

Then open with a data dictionary rather than a question.

This single habit does more for accuracy than any clever prompt:

> Here is a LinkedIn Ads export. Before analyzing anything, read the file and tell me back: the number of rows, the exact column names, the date range covered, and the grain of each row (ad, ad set, or campaign). Flag any column that is stored as text rather than a number. Do not calculate anything yet. If I later ask for a metric that is not in this file, say so instead of estimating it.

That last sentence is the one that stops most hallucinated metrics.

## Three prompts that work on a static export

These assume you have run the data dictionary prompt first.

**Find the wasted spend:**

> Using only the columns in this file, list the 10 ad sets with the highest spend and the lowest click through rate. Show spend, impressions, clicks and CTR for each. Rank them by how much monthly spend is at stake. Do not include any ad set with fewer than 1,000 impressions, since the sample is too small to judge.

**Compare formats fairly:**

> Group [every ad](/blog/types-of-linkedin-ads) in this file by ad format. For each format, give me total spend, total impressions, weighted average CTR, and [cost per click](/blog/linkedin-target-cpc-bidding). Weight the averages by impressions, not by row count. Tell me which formats have too little data to compare.

**Find decay:**

> This file has daily rows per ad. For each ad with at least 1,000 impressions per week, calculate weekly click through rate and tell me which ads declined for two consecutive weeks. Show the weekly numbers so I can check your work.

That last instruction, asking it to show the numbers, is worth adding to every prompt.

If it cannot show the working, it did not do the work.

## Where exports stop working

Run those prompts, and you will get something useful.

Then you will ask the obvious next question, and everything stalls.

You find an ad set burning budget at a poor CTR.

You ask which companies it was reaching. Not in the file.

You find your best campaign by CTR.

You ask whether it influenced any deals. Not in the file.

You spot decay. You ask whether the audience is saturated or the creative is tired.

That needs [reach against audience](/blog/abm-for-hard-to-reach-audiences) size, which is not in the file either.

So you go back to Campaign Manager, run another export, re-upload, and re-explain the context you already explained.

Analysis is a conversation, and a CSV can only answer the first question.

There is also a staleness problem. Your file is a photograph.

By Thursday it describes an account that no longer exists.

## The fix: give the AI a live connection instead

This is where I would spend your five minutes.

Instead of exporting data to the AI, connect the AI to the data.

The [ZenABM MCP server](/mcp) does exactly that. MCP (Model Context Protocol) is the standard that lets an AI client talk to an outside data source, so connecting ZenABM to Claude works like connecting to any other MCP server.

![ZenABM MCP server setup inside Claude Code](https://cdn.zenabm.com/media/zenabm-mcp-server-setup-claude.png)

Once it is connected, Claude Code, Claude Desktop, or ChatGPT queries your live LinkedIn ads and ABM data directly.

No CSV, no re-upload, and follow-up questions just work.

### Connecting it

The endpoint is `https://app.zenabm.com/api/mcp`, authenticated with a Bearer token or OAuth.

In Claude Code, you add it once, then run `/init`, which writes a CLAUDE.md file so the agent keeps standing context about your [account instead of relearning your campaign structure](/blog/linkedin-abm-campaign-strategy-goals-budget-structure) every session.

![ZenABM MCP settings page showing the Claude Code tab with the command to connect the server to Claude Code](https://cdn.zenabm.com/media/How-to-connect-ZenABM-MCP-server-to-Claude-Code.png)

It works in [ChatGPT](/blog/chatgpt-for-abm) too, if that is where your team already is.

![ZenABM MCP setup page showing the ChatGPT tab with steps to add the server URL as a custom connector](https://cdn.zenabm.com/media/How-to-connect-ZenABM-LinkedIn-ads-MCP-server-to-chatGPT.png)

### What the AI gets

Two separate things, and the difference matters:

- **Data tools** for individual questions. Company intelligence, campaign and ad set performance, [ABM stages](/blog/linkedin-abm-nurture-campaigns-sequencing-the-funnel) and revenue, live delivery settings, reach and frequency, and weekly rolling series for real week-over-week decay rather than estimates.
- **Skills**, which are complete analysis workflows exposed as slash commands. There are 15. Four are also installable from GitHub as [Claude Code plugins](/blog/claude-code-for-abm-use-cases-plugins), and the other 11 come with the server.

The 15 group like this: audit and optimization (`/linkedin-abm-audit`, `/budget-wasters`, `/persona-audit`, `/ad-decay`), strategy and planning (`/abm-strategy-planning`, `/abm-campaign-execution`, `/scaling-planner`), reporting (`/linkedin-abm-report`, `/weekly-digest`, `/revenue-attribution`), and account work (`/account-engagement`, `/company-deep-dive`, `/intent-report`, `/funnel-movement`, `/sales-handoff`).

Run `list_skills` or `/overview` to see the catalog.

Writes are deliberately narrow.

Reads change nothing, and only four actions can change your account (pausing an ad, pausing an ad set or campaign, excluding companies, and setting Budget Savers), each behind an explicit confirmation.

If you would rather install the [four packaged skills](https://github.com/ZENABM/linkedin-abm-skills):

```plaintext
/plugin marketplace add ZENABM/linkedin-abm-skills
/plugin install linkedin-abm-skills@zenabm
```

![GitHub repo for ZenABM's LinkedIn ABM Skills package with four AI skills for campaign strategy and reporting](https://cdn.zenabm.com/assets/ZenABM-skills-package-1.gif)

## What becomes possible once it is live

Here is the practical difference, using the questions that stalled earlier.

You can ask about companies, not just campaigns.

> Find the accounts that engaged with my ads in the last 90 days but have no open deal in the CRM. Check each against my ICP (SaaS, 200 to 2000 employees, North America), then [list the top 20 by engagement score](/blog/clay-for-abm-experts-share-it-all) with what they engaged with.

Result of a similar but even more detailed prompt I ran:

![Using ZenABM MCP server in Claude Code to find engaged accounts and analyzing if they match the ICP](https://cdn.zenabm.com/media/Using-ZenABM-MCP-server-in-Claude-Code-for-ABM.png)

You can also build account cohorts.

![Account cohort analysis in Claude Code](https://cdn.zenabm.com/media/Cohort-analysis-in-Caude-Code.png)

You can catch decay with real weekly numbers.

The `/ad-decay` skill (part of the ZenABM MCP server) applies a fixed rule: an ad is decayed when eCTR falls two weeks running with at least 1,000 impressions each week, and at risk after one down week.

![Decaying ads identified with ZenABM LinkedIn Ads MCP server](https://cdn.zenabm.com/media/underperforming-LinkedIn-ads-decaying-ads-identified-with-ZenABMs-LinkedIn-Ads-MCP-server-.png)

It can build the chart instead of just describing it.

![Chart produced by Claude Code showing efficiency of different LinkedIn ads produced by Claude Code](https://cdn.zenabm.com/media/format_efficiency.png)

And you can get the executive summary without building a deck.

![Claude Code terminal using the ZenABM MCP server to pull an executive summary of ABM pipeline data](https://cdn.zenabm.com/assets/Using-ZenABM-MCP-server-in-Claude-Code-to-get-an-executive-summary-of-your-ABM-program.gif)

If you do not want to set anything up at all, [Zena](/linkedin-ads-expert-chat), the AI chatbot built into ZenABM, answers the same kinds of questions in plain English inside the app.

![Zena AI chat in ZenABM ranking top 10 engaged companies for November 2025 with ABM stage and engagements](https://cdn.zenabm.com/media/Zena-ZenABM-top-engaged-companies-in-a-month.png)

## CSV, API, or MCP: which one do you actually need?

All three have a real use.

Pick by the job.

| Route | Best for | Setup | Main limit |
| **Campaign Manager CSV** | A single one-off question, or sharing a file with someone | Minutes, no access needed | Stale, aggregated, no companies or revenue, 8 columns missing |
| **LinkedIn Ads API** | Building your own software or data warehouse | Weeks. Gated approval, then a Standard tier application | You own the auth, versioning, rate limits, and joins |
| [**ZenABM MCP server**](/mcp) | Ongoing analysis in Claude or ChatGPT, with follow-up questions | About five minutes | Needs a ZenABM account |

The API route deserves a warning because people underestimate it.

Access is gated.

You start in a Development tier, build a working integration, then apply for the Standard tier with a video demonstration.

Versions are dated and retired on a schedule, so you inherit ongoing migration work. Reporting endpoints throttle, so large pulls have to be chunked with backoff.

![LinkedIn Marketing API versioning docs showing the LinkedIn-Version header format for LinkedIn Ads API calls](https://cdn.zenabm.com/media/LinkedIn-Marketing-API-versioning-documentation-by-LinkedIn.png)

![LinkedIn ads API versus LinkedIn Ads MCP server](https://cdn.zenabm.com/media/zenabm_api_vs_mcp_v2-1.png)

## LinkedIn ads data export for AI analysis: the takeaway

Exporting [LinkedIn ads data](/blog/automating-linkedin-ad-data-into-crm) for AI analysis is worth doing, as long as you know what you are holding.

Pick the right report type, accept that eight columns will not come through, never do exact math on demographic rows, never add up reach, and tell the model what is missing before you ask it anything.

Do that, and a CSV will answer your first question well.

It is the second question that costs you, because the answer is almost always in data that the export does not contain.

If you find yourself exporting the same report every week, that is the signal to stop.

Connect the account instead, and let the AI go and get what it needs.

The account layer is the part you cannot export your way to, since LinkedIn does not put deals or named accounts in that file.

If you want to see it on your own data, [ZenABM is free for 37 days](https://app.zenabm.com/signup) with full functionality, and you can have company-level engagement, revenue attribution, and the MCP connection running before your next reporting cycle.

[You can also book a demo with us to learn more!](/book-a-demo)

## Frequently asked questions

### How do I export LinkedIn ads data for AI analysis?

Open Campaign Manager, go to the reporting view, set your date range, choose a report type and column view, then [export as CSV](/blog/linkedin-ads-claude-code-integration). Pick ad performance or ad set performance for most analysis questions. Before uploading it to ChatGPT or Claude, remove currency symbols, use one date format, keep a single row grain per file, and tell the model which metrics are absent so it does not estimate them.

### Why does AI give wrong answers about my LinkedIn ads data?

Usually because of the file, not the model. Eight dashboard columns including cost per result and bid cannot be exported, so questions about them get guessed answers. Demographic data is deliberately approximated for privacy, so those rows never reconcile to campaign totals. Reach is deduplicated per request, so summing it double counts people. Numbers stored as text with currency symbols also break totals.

### Can ChatGPT or Claude handle a large ads CSV?

Up to a point. Both stay reliable at around 50,000 rows or under roughly 10 MB, and larger files get truncated, slow down, or hit conversation length limits. If your export is bigger, narrow the date range or drop columns first. Another approach is to send a small representative sample, agree the analysis plan, then apply that plan to the full data.

### What data is missing from a LinkedIn ads export?

Five things that matter: which companies engaged, whether any of it became pipeline or revenue, exact demographic figures (they are approximated), summable reach, and your current delivery settings such as Audience Expansion or the LinkedIn [Audience Network](/blog/linkedin-audience-network).

ZenABM adds the first two through company-level engagement from the Ads API and CRM revenue attribution, and reads live delivery settings on every call.

### Is the LinkedIn Ads API better than exporting CSVs?

Only if you are building software. The API gives you live, granular data, but [access is gated behind a Development](/blog/linkedin-ads-api) tier and a Standard tier application; versions retire monthly, and reporting endpoints throttle large pulls.

For analysis rather than engineering, an [MCP server gives you live data](/blog/linkedin-ads-mcp-server) without the build, since it handles the auth, versioning, and joins for you.

### What is an MCP server, and why does it beat a CSV export?

An MCP server is a standard connector that lets an AI client query an external data source directly. It beats a CSV because analysis is a conversation. When you ask a follow-up question, such as which companies were in that ad set, a live connection can go and get the answer, while a static file cannot.

The ZenABM MCP server connects in about five minutes and adds 15 prebuilt analysis workflows.
