§00

Reach Ledger is a LinkedIn advertising service that tells your sales team which companies watched your video to the end.

I build and run the campaigns inside your LinkedIn ad account. LinkedIn reports which organisations engaged; Reach Ledger ranks them by how far they actually watched and hands your team a list worth ringing.

No pixelNo script on your websiteNo data brokerNo individual is named in the data

§01

The evidence

Almost everything you pay for is noise. The end of the funnel is the pipeline.

One account, every campaign it has run. LinkedIn attributed the delivery to 2,776 named organisations. It counts a “video view” at two seconds of autoplay, and video autoplays in the feed — so a view records that an ad passed through somebody’s scroll. Watch depth is the only number here that records a decision.

ImpressionThe ad was served
2,776
Video view · 2sAutoplay passed two seconds
506
Watched 50%Deliberate attention
191
Watched to the endSustained interest
68
Video view · 2s
506
Watched 50%
191
Watched to the end
68

The same three numbers, rescaled so the last bar is visible. Ranking this account by video views would have put 315 companies that never reached halfway above the 68 that finished.

What is not covered

Roughly a fifth of delivered impressions can be attributed to a named company. LinkedIn withholds organisations with very little activity — from everyone, me included. Stated plainly rather than buried: this is a subset, not total reach.

Roughly 21 impressions in every 100 are attributed to a named company.

Attributed to a named company · ≈21% of delivery

Why clicks mislead here

Most of a LinkedIn ad’s effect is view-through: somebody sees it, absorbs it, and never clicks. Judged on clicks, a campaign that reached exactly the right companies looks like a failure — and gets switched off.

The 68 are not a report. They are the call list.

§02

The ledger

Your sales team opens this, sorted by who watched most of the video.

Every organisation LinkedIn reports for the campaign, ranked by watch depth and scored against the account’s own baseline — so a company with 20 impressions and a finished video outranks one with 600 impressions and none. Sort it below; the table is live.

Reach Ledger — Analytics Sample

Sorted by companies that completed the video.

A sample of the Reach Ledger company table, sortable by column.
Organisation Impressions Share of impressions Started 50% Completed Lift
The sample table needs JavaScript. The figures it shows are the ones in §01 above: 2,776 organisations reached, 506 registering a two-second view, 191 watching half, 68 watching to the end.

A simplified view of the real table: company names redacted, row values illustrative, and the roles, outreach and blocking columns left out. Real names and figures appear only inside your own account.

Ranked, not listed

Lift scores each company against that account’s own engagement rate, so small companies that watched are not buried under big ones that were merely served.

Roles, per campaign

Seniority and job function for the people who watched a given ad — enough to know who to look for, never enough to name them.

A record of who was contacted

Log the person, the status and the message thread against the company. Follow-ups sort oldest first, so anything left a week surfaces itself.

§03

How it runs

Four weeks from a call to a list of companies that watched.

Nothing is installed. You grant me a role on your LinkedIn ad account in Campaign Manager, exactly as you would add a colleague. The first nightly collection pulls everything the account has run since the collection start date, so there is something to read on day one.

Week 0Call

Who you want to reach, and what you already know works.

Week 1List

Audience built, creative agreed, access granted.

Week 2Live

Campaigns running, one ad set per seniority tier.

Week 3Companies

The ledger fills. Your team starts ringing.

The campaigns

One ad set per seniority tier — executive, senior leadership, managers — sharing the same company list and rotating evenly, with audience expansion and the Audience Network switched off, because both of them wreck a company report.

The collection

A job runs every night at 06:00 and snapshots cumulative totals per company. Day-on-day movement is derived by comparing consecutive snapshots, never by asking LinkedIn for a single day — that quietly drops half the companies.

§04

The operator

You are hiring a person, not a login.

Every campaign behind this is built and run by me. Not a team, not a self-serve dashboard you are left to work out alone. I write the targeting, run the tests, watch what actually gets watched, and hand your sales team the companies. LinkedIn’s Development Tier caps this application at five ad accounts, so there is a real limit on how many I take on at once.

I do

  • Build the audience and the company list
  • Write and run the campaigns in your ad account
  • Rotate creative and read what watch depth says about it
  • Keep the nightly collection and the ledger honest

You do

  • Tell me who you want to reach
  • Ring the companies that watched

Niklas AnderssonPromtech Systems Ltd · United Kingdom

§05

Limits

What it cannot tell you, and why that is the right answer.

You can learn that a named company engaged. You can learn, separately, how completion rates differ between seniority tiers. You can never learn that a specific owner at that company did — LinkedIn rejects the request outright.

GET /rest/adAnalytics?pivots=List(MEMBER_COMPANY,MEMBER_SENIORITY) 400 — rejected by LinkedIn GET /rest/adAnalytics?pivot=MEMBER_COMPANY 200 2,776 organisations, watch depth per organisation GET /rest/adAnalytics?pivot=MEMBER_SENIORITY 200 completion rate per seniority, no company attached

Combining the two would frequently identify one individual. LinkedIn’s reporting thresholds prevent it by design, and no amount of engineering gets around it.

No individual is named

Interest is reported at organisation level. In practice that is the useful framing: you know the interest exists inside the company, which warms the approach even when you reach a different person there.

A fifth of delivery

Only companies clearing LinkedIn’s activity threshold are reported. The tail is invisible to everyone.

Video, specifically

Watch depth only exists where there is video. Single-image ads still report companies and engagement, but the strongest signal on this page needs video.

Price is not published

The campaigns are built and run by hand, so what it costs depends on what running yours takes. Ask, and you will get a straight number rather than a tier.

§06

Status

What is running today, and what is not built yet.

One list, both states in it. Anything marked planned does not exist — no part of what is live depends on it.

CapabilityStatus
Companies that engaged, per campaignRanked by watch depth, scored against the account baselineLive
Seniority and job function per adWho watched, never which individual · refreshed by hand while the nightly job is tunedLive
Nightly collection with full historyDaily snapshots, day-on-day movement by comparisonLive
Outreach logPerson, status, message thread and follow-up age per companyLive
Campaign control and post boostingPause and activate campaigns; build a paused boost for a post, which you approve in Campaign ManagerLive
Daily and weekly email digestNew companies that watched, sent to the sales team without opening the toolPlanned
CRM connectionsPush engaged companies and contacts into your own CRMPlanned

Nothing above this line depends on either of them, and nothing on this page claims they are here.

§07

Open source

Built to be open source. The repository goes public once it is scrubbed.

The collector, the web service, the deploy scripts and the LinkedIn OAuth dance are all in one repository. When it is published you will be able to fork it and run it against your own Google Cloud project and your own LinkedIn app. The service I sell is the campaigns, not the code.

collector/ nightly snapshot job → BigQuery web/ Flask service — the ledger, the CRM, campaign control deploy.sh one command per thing, project and account pinned oauth_manual.py three-legged OAuth, refresh token into Secret Manager resolve_names.py organisation URN → company name, website, location views.sql the snapshot-diffing views

Three things the API does that are not obvious

Never query analytics per day — a three-event threshold per row silently drops about half the companies. Resolve names through adTargetingEntities, because the organisations endpoint is partner-gated. Company and role can never be crossed. All three are documented in the README rather than learned the hard way twice.

Not public yet

The repository is being cleaned of credentials before it goes up. If you want it, say so and I will send the link the day it is published.

Ask for the repository

§08

Questions

Common questions

How does Reach Ledger identify companies?

Through LinkedIn’s own reporting. The Marketing API breaks advertising performance down by MEMBER_COMPANY — the organisation a viewer works for — and Reach Ledger reads that breakdown, then resolves each organisation to a company name. Nothing is inferred from IP addresses, no tracking script is placed on your website, and no third-party data provider is involved.

Can you see which person engaged?

No, and that is deliberate on LinkedIn’s part rather than a gap in the product. Company and role cannot be combined in LinkedIn’s reporting: you can learn how completion rates compare across seniority tiers, and separately that a named company engaged, but never that a specific owner at that company did. Combining the two would frequently identify one individual, which is exactly what LinkedIn’s reporting thresholds prevent.

How is this different from LinkedIn Campaign Manager?

Campaign Manager shows a company engagement report. It does not rank companies by watch depth, score them against an account baseline, retain history beyond its own window, or connect any of it to who your team contacted. And it does not come with somebody running the campaigns.

What do you need to set it up?

A role on the LinkedIn ad account, granted in Campaign Manager the same way you would add a colleague or an agency. That is the whole requirement: no pixel, no DNS change, no code on your website, no CRM integration to configure. The first nightly collection brings in the campaign history already on the account.

How long until there is data?

The first collection runs the night after an account is connected and pulls the history already on the account, so there is usable data on day one. Day-on-day movement appears after the second collection, because it is derived by comparing consecutive snapshots. Only campaigns that actually delivered impressions produce company data.

How much of a campaign does the data cover?

Roughly a fifth of delivered impressions can be attributed to a named company. LinkedIn applies a reporting threshold that excludes organisations with very little activity, so the long tail is not reported to anyone — me included. That subset skews towards companies where several people saw the ad, which is the half worth acting on.

What does it cost?

Pricing is not published. The campaigns are built and run by hand, so what it costs depends on what running yours takes — ad spend is separate and stays in your own account. Ask and you will get a straight number.

§09

Start

Try it on one live account.

If you run LinkedIn video advertising for B2B, the fastest way to judge this is on an account you already have. Grant access, wait one night, and see whether the companies that watched look like the companies you were trying to reach.