L

LinkedIn Outreach Platform Agentic Workflow

Build Profile Brief — LinkedIn Outreach Platform Agentic Workflow

Opens a profile, triggers lazy-loaded sections, and returns a compact JSON brief: current role, career arc, posting language and topics, contact-type guess, and tailoring hooks for a first message

Available free v1.1.0 Browser LLM
$ sidebutton install linkedin
Download ZIP

The lightweight research pass that runs before writing to someone. Where linkedin_lead_health produces a full ICP scorecard for batch enrichment, this returns just what message-tailoring needs, fast: who the person is TODAY (headlines go stale — a 2019-era developer contact may be a business angel now), what they post about and in which language, and two or three concrete hooks worth referencing.

The contact_type guess matters most: writing buyer copy to an investor, conference organizer, or agency owner is the classic mistake this step exists to catch.

Read-only; extraction plus one LLM pass, no interaction with the profile.

Steps

  1. 1.
    Navigate to a URL
    url
    {{profile_url}}
    browser.navigate
  2. 2.
    Wait
    selector
    main
    timeout
    12000
    browser.wait
  3. 3.
    Scroll the page
    direction
    down
    amount
    1400
    browser.scroll
  4. 4.
    Wait
    ms
    800
    browser.wait
  5. 5.
    Scroll the page
    direction
    down
    amount
    1400
    browser.scroll
  6. 6.
    Wait
    ms
    800
    browser.wait
  7. 7.
    Scroll the page
    direction
    down
    amount
    1400
    browser.scroll
  8. 8.
    Wait
    ms
    800
    browser.wait
  9. 9.
    Scroll the page
    direction
    down
    amount
    1400
    browser.scroll
  10. 10.
    Wait
    ms
    800
    browser.wait
  11. 11.
    Extract text from a selector
    selector
    main
    as
    profile_blob
    browser.extract
  12. 12.
    llm generate
    as
    brief
    prompt
    >
    llm.generate
  13. 13.
    control stop
    message
    {{brief}}
    control.stop

Workflow definition

schema_version: 1
version: "1.0.0"
last_verified: "2026-08-25"
id: linkedin_profile_brief
title: "Build Profile Brief"
description: "Opens a profile, triggers lazy-loaded sections, and returns a compact JSON brief: current role, career arc, posting language and topics, contact-type guess, and tailoring hooks for a first message"
overview: |
  The lightweight research pass that runs before writing to someone. Where
  `linkedin_lead_health` produces a full ICP scorecard for batch enrichment, this returns
  just what message-tailoring needs, fast: who the person is TODAY (headlines go stale —
  a 2019-era developer contact may be a business angel now), what they post about and in
  which language, and two or three concrete hooks worth referencing.

  The `contact_type` guess matters most: writing buyer copy to an investor, conference
  organizer, or agency owner is the classic mistake this step exists to catch.

  Read-only; extraction plus one LLM pass, no interaction with the profile.
category:
  level: task
  domain: sales
  reusable: true
params:
  profile_url:
    type: string
    description: Full LinkedIn profile URL (e.g. https://www.linkedin.com/in/username/)
    required: true
policies:
  allowed_domains:
    - "*.linkedin.com"
steps:
  - type: browser.navigate
    url: "{{profile_url}}"
  - type: browser.wait
    selector: main
    timeout: 12000
  - type: browser.scroll
    direction: down
    amount: 1400
  - type: browser.wait
    ms: 800
  - type: browser.scroll
    direction: down
    amount: 1400
  - type: browser.wait
    ms: 800
  - type: browser.scroll
    direction: down
    amount: 1400
  - type: browser.wait
    ms: 800
  - type: browser.scroll
    direction: down
    amount: 1400
  - type: browser.wait
    ms: 800
  - type: browser.extract
    selector: main
    as: profile_blob
  - type: llm.generate
    as: brief
    prompt: >
      You are preparing a compact briefing on a LinkedIn profile so a founder can write
      one well-tailored first message. Parse the raw profile text below.


      Respond with RAW JSON ONLY — no prose, no markdown fences. Leave a field null
      rather than guessing. Schema:


      {
        "profile_url": "{{profile_url}}",
        "name": "string",
        "headline": "string",
        "location": "string | null",
        "current_role": {
          "title": "string",
          "company": "string",
          "since": "YYYY-MM | null",
          "what_the_company_does": "one sentence, plain words"
        },
        "other_current_hats": ["side ventures, board seats, portfolios, newsletters, events they run"],
        "career_arc": "one sentence: where they came from and what changed",
        "posting": {
          "language": "en | de | mixed | unknown",
          "cadence": "daily | weekly | sporadic | dormant | unknown",
          "topics": ["string", "..."]
        },
        "contact_type": "buyer | operator | channel | multiplier | organizer | peer | unclear",
        "contact_type_reason": "one sentence",
        "tailoring_hooks": ["2-3 concrete, current facts worth referencing in a message — never generic"],
        "watchouts": ["things that would make a standard pitch land badly, e.g. anti-sales posts, investor role, stale headline"]
      }


      contact_type definitions: buyer = owns a queue/budget at an operating company;
      operator = product/PM person who would run the tool; channel = agency, consultancy,
      dev shop, fractional exec who could resell or white-label; multiplier = investor,
      analyst, coach, community owner with reach; organizer = runs conferences or events;
      peer = builds a competing or adjacent product.


      ## Raw profile text

      ---

      {{profile_blob}}

      ---
  - type: control.stop
    message: "{{brief}}"