← Back to the platform

🧲 Prospecting

Cold outbound pipeline — LinkedIn pain signals to booked calls
SOP v1.3 · Page v1.3 · Owner: Kevin (review), AI agent (execution)

1. What this system does

A daily AI agent finds founder-led UK micro and small business owners who post about being overloaded — wearing every hat, no time, drowning in admin. It locates their company website and a published contact email, checks Companies House to classify the legal entity, and queues each prospect in the Prospecting tab. Kevin approves or rejects. Approving a Limited Company syncs it to GoHighLevel and sends the opening email there and then; the agent writes and sends the two follow-ups itself. The goal metric is calls booked.

LinkedIn pain signal
Website + email
Companies House gate
Kevin reviews
GHL + nurture
Call booked

When a call is booked, a separate pre-call research agent compiles the full dossier — research spend lands only on people worth calendar time.

2. Daily agent run

  1. Scheduled task fires every day at 09:00, seven days a week (Claude Code scheduled task prospect-daily-run; the Mac must be awake with Chrome open). Target: 5 qualified prospects a day.
  2. The agent reads the active keywords from the Prospect Keywords table and searches LinkedIn posts through Kevin’s logged-in Chrome at human pace — capped at 20 profile views a run.
  3. Qualified authors (founder-led, UK, micro/small business, genuine pain post) are researched on the open web for a website and a published contact email. No guessed addresses.
  4. Companies House search classifies each prospect: Limited Company (with company number), Sole Trader / Partnership, or Unknown.
  5. Each prospect lands in the Prospects table as Ready for Review with the pain quote, links, email, confidence, and entity type.
  6. Previously Approved prospects are pushed to GoHighLevel and move to Synced to GHL.
  7. Kevin gets a Slack summary: found, synced, keywords used, any warnings.
LinkedIn safety: the agent browses only through Kevin’s real Chrome session, never with scrapers, and stops for the day at the first captcha or unusual-activity warning. Automated activity on LinkedIn sits outside their User Agreement — low volume and human pacing keep the risk small, but the kill-switch rule is absolute.

3. Reviewing the queue (Kevin, ~5 min/day)

  • Open Marketing → Prospecting. The sidebar badge shows how many are waiting.
  • Each card shows the pain quote, entity chip, email and confidence. Click the name for their LinkedIn, or the website link.
  • Each card carries a Contact Route chip, an editable opening message drafted by the agent, and a Process line spelling out exactly what happens after you approve. Tweak the wording, then approve; the edited text is what gets used. The Copy button is for LinkedIn connects you send personally.
  • Conversation first (the rule for everyone with an email): the first touch is always a personal message, sent through GoHighLevel the moment you approve. Since 21 Aug 2026 the first touch carries NO booking link — it is four lines in Kevin's own shape and ends with a question the reader can answer in one line, because 137 people were asked to book a slot before exchanging a word and none did. The booking link moves to the day-7 or day-14 touch, after they have replied. If a draft still shows a [BOOKING-LINK] placeholder, remove it or replace it — the system refuses to send while it remains. Replies land in GHL, never in the team-managed Gmail inbox; any stray that does reach Gmail gets the "17: OD Prospects" label so Inbound Comms leaves it alone. The label is applied only when the sender matches a prospect's email exactly — GHL system notifications and tenant SMS threads are never labelled. Claude watches for replies and drafts every response. After 7 silent days a Limited Company gets a personal follow-up, and a second one on day 14; then the record goes to No Response and stops. Three touches in total, every one of them written and sent by the agent. There is no automated nurture sequence — that was retired. Manual-track prospects get at most one follow-up.
  • Approve = right person, right pain. Emailed prospects sync to GoHighLevel instantly as CRM contacts (tag od-prospect, plus od-prospect-manual on anything that is not a Limited Company). Reject = bad fit; also deactivate a keyword if it keeps producing rejects.
  • Both actions have an 8-second Undo.
  • Cards marked manual track (PECR) still sync to GHL when approved but are tagged od-prospect-manual and never enter the email sequence — contact them personally on LinkedIn instead.

4. Compliance — legitimate interest assessment (UK GDPR + PECR)

Lawful basis

Processing basis: legitimate interest (Article 6(1)(f) UK GDPR) — B2B direct marketing of a business operations service to businesses showing an active, self-declared need. This section is the documented assessment.

TestAssessment
PurposeIntroduce Operations Director to founder-led UK small businesses whose owners publicly describe the exact problem the service solves. Clear commercial interest; benefit to the recipient is a relevant, non-generic offer.
NecessityData collected is minimal and business-focused: name, role, company, public LinkedIn content, published business contact email. No special category data, no private-life data, no purchased lists.
BalancingRecipients are business owners contacted at business addresses they publish for business contact. Contact volume is low (one sequence, easy opt-out). Reasonable expectation: a business publishing a contact email expects business approaches.

PECR rules (enforced in the pipeline)

  • Corporate subscribers only for email. Only Entity Type = Limited Company is ever emailed. Sole traders and partnerships count as individual subscribers under PECR Reg. 22 and are NEVER cold-emailed — they route to the manual track. Unknown is treated as sole trader. Since 12 Aug 2026 the send itself checks the field: approve a non-Ltd card and the contact still syncs to GoHighLevel, but the email is refused and you get a message telling you to reach them on LinkedIn instead. The health bar re-checks it afterwards as a second line.
  • Every email identifies the sender (Operations Director + postal address) and carries a working unsubscribe. This lives in the GHL sequence templates — Ericamae owns it, Kevin signs it off before the sequence goes live.
  • Suppression is forever. Unsubscribes and removal requests are marked Suppressed in the Prospects table and in GHL; the agent checks the list before every add and never re-adds them.
  • Right to object / erasure: on any request, mark Suppressed, delete the GHL contact, and clear personal fields from the Airtable record within 30 days.
  • Data source is the person’s own public LinkedIn activity plus their company website; the first email states where we found them (transparency, Art. 14).
Hard rule: if entity type is uncertain, the prospect does not get emailed. The gate errs on the side of not sending.

5. Keywords

  • The agent rotates through active keywords, oldest-used first, 2-3 per run.
  • Add pain phrases you hear on calls or see in posts. Phrase them the way founders actually write, not marketing speak.
  • Each keyword tracks how many prospects it has produced — deactivate the duds, keep the producers.

6. GoHighLevel wiring

ItemDetail
AuthPrivate Integration token (scope contacts.write) saved at ~/.config/od/ghl_api_key, Location ID at ~/.config/od/ghl_location_id. Until these exist the agent skips the sync and says so.
Tagsod-prospect (every synced contact, CRM only) · od-prospect-manual (anything that is not a Limited Company — blocks all email workflows). od-prospect-nurture is RETIRED: nothing applies it and nothing may start to.
Follow-upsThere is no automated sequence. The agent writes and sends every touch itself: the opener when you approve, a follow-up on day 7 and another on day 14 if there is still silence, then the record moves to No Response and stops. Three touches in total, Limited Companies only.
Status flowReady for Review → Approved → Synced to GHL → Contacted (1:1) → Replied or No Response → Call Booked. Prospects you reach on LinkedIn instead go to Connect Sent. The filter bar carries all twelve: All, Ready for Review, Approved, Synced to GHL, Contacted (1:1), Connect Sent, In Sequence, Replied, Call Booked, No Response, Rejected, Suppressed — In Sequence is a leftover of the retired sequence and no code writes it.

7. Health checks & troubleshooting

CheckIf it fails
Prospects table reachableAirtable auth or network issue — hit Refresh; check the PAT.
Active search keywords definedAll keywords toggled off — activate at least one.
Daily agent ran recentlyNo new prospects for 3+ days: Mac asleep at run time, Chrome closed, or LinkedIn friction stopped the run. Check the scheduled task log.
Approved synced to GHLBig Approved backlog means GHL token missing/expired — see §6.
Synced records carry GHL IDPartial sync failure — re-run the agent; it retries by email match.
PECR gateRed alert: a non-Ltd prospect has been emailed. Stop, check the record and mark it. A warning instead means the check has nothing to look at — either nobody has been contacted yet, or prospects have moved to a status the check does not inspect, which makes the gate blind rather than clean. Treat a blind gate as a fault.