Which companies your LinkedIn ads reach, matched to your CRM

Open one board to see every company your LinkedIn ads reached, whether they are already in HubSpot, and hand the best ones straight to a rep.

App
LinkedIn AdsHubSpotSlack BotMarketingSalesLead EnrichmentResearch & Monitoring
PromptCreate

Build me an app that my demand generation team and the SDRs they hand accounts to can open to see which companies our LinkedIn ads are actually reaching, and whether any of those companies are in our CRM yet. This is a browsing and working surface rather than a scheduled report: a person opens it, picks a date range, and works the resulting list of companies like a queue.

The main view is a single board. At the top let me pick the LinkedIn ad account (use Search Ad Accounts to populate that picker) and a date range, defaulting to the last 30 days. When I apply it, pull company level engagement from LinkedIn Ads using Get Ad Analytics pivoted by member company, covering the whole date range in one request with timeGranularity rather than looping day by day. LinkedIn throttles its analytics endpoints far more aggressively than its regular CRUD endpoints, so batch the range into a single call and back off and retry on 429 responses.

List one row per company showing impressions, clicks, click through rate calculated from those two, and attributed spend for the period. Sort by clicks descending by default and let me sort on any column. Use Search Campaigns to resolve which campaigns are running on the account so the board can show which campaigns the engagement and spend came from.

Match every row against HubSpot. For each company use Search Companies to look for an existing record, matching on website domain wherever a domain is available, because company name variants (Acme, Acme Inc, Acme Corporation) will not line up cleanly and name only matching produces false positives. Then use Search Deals to find deals on the matched company. Label each row with one of four states: not in the CRM at all, open deal (show the stage name and the deal amount), existing customer (a closed won deal exists), or closed lost. When a match is uncertain, prefer labeling the row as not in the CRM and let the user decide, rather than silently attaching engagement to the wrong account.

Give me three filters I can toggle: companies above a click threshold I can set myself, companies with no CRM record at all, and companies with an open deal. These filters are how a rep turns the board into a work queue, so make them prominent and combinable, and update the visible row count as they change.

From any row I want to act without leaving the board. Add the company to HubSpot with Create Company, filling name and domain from the row. File the engagement as a note on the company record with Create Note, capturing impressions, clicks, click through rate, spend and the date range so the CRM record shows why that account surfaced. Create a follow up task for the owning rep with Create Task, using List Owners to choose the assignee and defaulting to the existing company owner where there is one. And let me select several rows and push a shortlist to our sales channel using the Slack Bot Send a Message operation, formatted as a readable list with the engagement numbers and CRM status for each company.

Add a Research this account button on each row that starts a background agent. The agent should pull that single company's fuller engagement history from LinkedIn Ads with Get Ad Analytics over a wider date range than the board is showing, pivoted so it can see which campaigns and creatives the company touched, using Search Campaigns and Search Creatives to turn IDs into readable names. It should then read whatever history already exists in HubSpot (Get Company for the record, Search Deals for past and present deals, and List Notes for prior activity), research the company on the open web using built in research, and write a short brief covering what the company does, which campaigns and creatives they engaged with, and the specific angle a rep should lead with. Write that brief back onto the row so the board shows it inline, and also file it into HubSpot as a note on the company record with Create Note. Persist the brief so it survives a reload and so the rest of the team sees it too, show a clear pending state while the research runs, and let the person navigate away and come back to find it finished.

Be explicit in the interface about what this data is and is not. LinkedIn suppresses audience counts below 300 members to protect privacy and returns them as zero, so smaller companies are missing or under reported by design. Put a short, plainly worded note on screen saying the company list is directional rather than a complete lead list, and that it shows which companies our ads reached, not which individuals clicked. Do not design the app in a way that implies it is an exhaustive account list or a list of identified people.

What does this prompt do?

  • Pulls company level engagement from your LinkedIn ad account for any date range you pick, so you see impressions, clicks, click through rate and spend per company instead of per campaign.
  • Matches every company against HubSpot and labels the row as not in your CRM, an open deal with its stage and value, an existing customer, or closed lost.
  • Filters for companies above a click threshold, companies with no CRM record at all, and companies with a deal already open, so a rep can work the list like a queue.
  • From any row, add the company to HubSpot, file the engagement as a note, create a follow up task for the owning rep, or push a shortlist to your sales channel in Slack.
  • A Research this account button sends an assistant off to pull the full engagement history, read what HubSpot already knows, search the web, and write a short brief back onto the row and into HubSpot.

What do I need to use this?

  • A LinkedIn Ads account with campaigns that have delivered enough impressions to report on, and admin access to it in Campaign Manager
  • A HubSpot login that can read companies and deals and create companies, notes and tasks
  • Website domains filled in on your HubSpot company records, since that is what the matching leans on
  • A Slack workspace, if you want to push shortlists to a sales channel

How can I customize it?

  • Change the default date range and the click threshold that decides which companies count as genuinely engaged
  • Point the shortlist at whichever Slack channel your reps actually watch, and change who follow up tasks get assigned to
  • Adjust which of your deal stages count as an existing customer versus a closed lost account

FAQs

Why do some companies show nothing, or not appear at all?
LinkedIn hides audience counts below 300 members to protect privacy, and reports them as zero. That means smaller companies are missing or under reported by design. The board says so on screen, because the list is a directional read on the kinds of accounts your ads are landing with, not a complete list.
Is this a lead list I can hand to sales for cold outreach?
Not quite. It tells you which companies your ads reached, not which individual people clicked, because LinkedIn never exposes that. Treat it as an account prioritization signal that tells a rep which companies already have some familiarity with you.
How does it know which HubSpot company a row belongs to?
It matches on website domain first, because company name variants like Acme, Acme Inc and Acme Corporation rarely line up cleanly and name matching alone creates false positives. Anything it cannot match confidently is labeled as not in your CRM so you can decide yourself.
Will this work on HubSpot Free?
Yes for everything the board does. Reading companies and deals, and creating companies, notes and tasks, are all available on free and starter plans.
Do I have to keep the page open while an account is being researched?
No. The research runs in the background, so you can carry on working the list or close the tab. The brief appears on the row when it is finished, and it is also filed as a note on the HubSpot company record.

Related templates

A brand asset library your marketing team actually searches

Every logo, photo, video cut and ad export in one searchable grid, with previews, campaign tags and rights expiry dates at a glance.

General Input Storage
General Input Database
JigsawStack
+1
App
Turn Mailjet email clicks into ranked HubSpot follow-ups

Twice a day we spot the people clicking your pricing and demo pages, create a follow-up task for their owner, and post a ranked recap to Slack.

Mailjet
HubSpot
Slack Bot
Agentic Task
Clean out the Looker dashboards and Looks nobody opens

One board showing every dashboard and Look with its folder, owner and favorite count, so you can find dead content and retire it safely.

Looker
Slack Bot
App
LiveKit live operations console for room moderation

Watch every live room on one screen, remove disruptive guests, start recordings and end stuck sessions without anyone opening a terminal.

LiveKit
Slack Bot
General Input Database
App
Wake up dormant Keap leads with a researched reason

Every Monday we find leads who never bought, research a real reason to reach out, and send a short personal email instead of another check in.

Keap
Slack Bot
Agentic Task
iMessage campaign console with pre-flight checks and delivery board

Build every text campaign in one screen: check who is actually reachable, see a realistic send plan, then watch delivery land row by row.

LoopMessage
Google Sheets
HubSpot
App

Stop guessing which accounts your LinkedIn ads reach.

Put company level ad engagement next to your CRM so your reps spend their time on the accounts that already know who you are.