← LeadfeederCONTENT HISTORY

Update to Leadfeeder

Snapshot Sep 30, 2026 · 22:54 UTC · version 2.0.0

Collection source: not recorded for this historical snapshot.

WHAT CHANGED · RULE-BASED ANALYSIS

First saved snapshot

No earlier snapshot is available to establish a change.

Compare saved observations

Download comparison JSON
Full technical diff · 0 changed fields
Full snapshot data
{
  "name": "visitor-company-brief",
  "description": "Produce a deep, structured company brief on a single named company from Leadfeeder — firmographics, engagement history, contacts on file, recent intent signals, and a recommended next move. Use this skill when the user names a specific company and asks for research, such as \"tell me about [company]\", \"brief me on [company]\", \"deep dive on [company]\", \"company brief for [company]\", \"account brief for [company]\", \"research [company]\", \"everything you have on [company]\", \"give me a profile of [company]\", or asks for a full read on a single company they want to action.\n",
  "included_files": [],
  "skill_md_contents": "---\nname: visitor-company-brief\ndescription: >\n  Produce a deep, structured company brief on a single named company from Leadfeeder — firmographics, engagement history, contacts on file, recent intent signals, and a recommended next move. Use this skill when the user names a specific company and asks for research, such as \"tell me about [company]\", \"brief me on [company]\", \"deep dive on [company]\", \"company brief for [company]\", \"account brief for [company]\", \"research [company]\", \"everything you have on [company]\", \"give me a profile of [company]\", or asks for a full read on a single company they want to action.\nmetadata:\n  version: \"1.0.0\"\n---\n\n# Visitor Company Brief\n\nProduce a structured deep-dive on a single named company. Anchor every section in real Leadfeeder data. This is the depth complement to the Daily Visitor Brief (which is breadth across many companies in a 24h window).\n\n## Language\n\nProduce the **entire response in the language the user wrote in** — English request → English output, German request → German output, and so on. This applies to everything the skill emits: the summary, all section headings and field labels, reasoning, edge-case messages, and the credit-consumption warning and confirmation. Do **not** translate data values — company names, contact names, URLs, page paths, email addresses, tag names, and ICP names stay verbatim as the tools return them. Copy-paste follow-up prompts should also be written in the user's language (they still trigger the right skill). If the input language is unclear, default to English.\n\n## When this skill triggers\n\nTrigger when the user names ONE specific company and asks for research, a profile, a brief, or a deep dive. Do not trigger if the user is asking about multiple companies or a ranked list across visitors — that is the Daily Visitor Brief skill. Trigger silently. Honor explicit modifiers in the prompt (engagement window, focus area, depth).\n\n## Inputs to determine before executing\n\nIdentify these from the user's prompt. Use defaults if unspecified — do not ask.\n\n- **Company identifier** — the name, domain, or Leadfeeder company ID provided in the prompt. Required. If multiple candidates match, see \"Disambiguation\" below.\n- **Engagement window** — default last 90 days. Honor explicit overrides (\"last 30 days\", \"this quarter\", \"since January\").\n- **Focus area** — default: full brief. If the user is narrow (\"focus on hiring\", \"just engagement\", \"ICP fit only\"), produce a focused version that drops the other sections.\n\n## Workflow\n\nExecute these tool calls. Always re-fetch ICPs/personas (do not cache across runs).\n\n### Step 0 — Resolve the Leadfeeder account (before any other tool call)\n\nDetermine the `account_id` to use for every tool call in this skill, in priority order:\n\n1. **Account named in the request (highest priority).** If the prompt or scheduled-task instruction explicitly names an account — an account ID (e.g. \"account 01234\") or an unambiguous account name — use that account for all tool calls. This overrides every source below and is the recommended way to make an unattended/scheduled task fully self-contained.\n2. **Configured Account ID.** Otherwise, the plugin's configured Leadfeeder Account ID is: `${user_config.account_id}`. If that resolves to a real, non-empty account ID (not blank, and not the literal unsubstituted `${user_config.account_id}` token), use it for all tool calls and do **not** call `get_account_info` or ask the user.\n3. **Already selected this session.** Otherwise, if an account was already chosen earlier in the session, reuse that.\n4. **Fallback.** Otherwise call `get_account_info`. If exactly one account is returned, use it. If several are returned, ask the user to pick. When running unattended (e.g. a scheduled task) asking is impossible — if no account was named and none is configured, stop and report that a **Leadfeeder Account ID** must either be named in the task prompt or set in the plugin configuration for automated runs.\n\n### Step 1 — Resolve the company\n\nDetermine the Leadfeeder `company_id` from the user's input.\n\n- **If the input is already a numeric company ID** (e.g. `228035150`), skip to Step 2.\n- **If the input is a company name or fragment** (e.g. \"Acme Corp\", \"Acme\"), call `search_companies` with the name as the query. Pick the highest-confidence match.\n- **If the input is a domain** (e.g. \"acme.com\"), call `search_companies` with the domain.\n- **If `search_companies` returns multiple plausible matches**, present the top 3 (name, country, employee count, industry) and ask the user to disambiguate before continuing. Never silently pick when there is real ambiguity (e.g. two German companies with similar names).\n- **If `search_companies` returns no matches**, tell the user clearly. Offer to expand the search (e.g. with a broader name fragment) rather than fabricating a profile.\n\n### Step 2 — Load ranking context\n\nCall `get_icps` and `get_buyer_personas`. Always re-fetch on every invocation. The calls are free (no credits). Use the response to score the target company against ICP and persona criteria in Step 5.\n\n### Step 2.5 — Subscription coverage & credit confirmation — before any credit-consuming call\n\n`get_company`, `search_companies_signals`, and `get_company_financials` are credit-consuming — 1 credit per company **unless it was accessed within the last 12 months** (companies in your web-visits feed are inside that free window). First probe coverage for **free**: call `search_web_visits` filtered by `company_id` over the **last 12 months** (reuse it for Step 4 engagement).\n\nThen, before any credit-consuming call, **do not call `get_company` or `search_companies_signals` yet** — flag it and get a single go-ahead. The target isn't guaranteed to be a visitor, so use this **conditional** wording, never the generic \"1 credit per company\" alarm:\n\n> To build this brief I need **{Company}**'s firmographics and signals using `get_company` and `search_companies_signals` — credit-consuming tools. If {Company} is in your Web Visitors feed, its 12-month access window has already started, so no credits are charged for a record already unlocked within the last 12 months. If it hasn't visited in the last 12 months, this will consume about 2 credits (firmographics 1 + signals 1; +1 more only if you later ask for financials). Want me to proceed?\n\nOn a clear **yes** → proceed with Steps 3–6 and report the actual `meta.credits.charged` (0 for a covered/visitor record). On **no** → give only the free basics (name and website from `search_companies`, and \"no visit activity in the last 12 months\") and stop.\n\n### Step 3 — Pull firmographics\n\nOnly proceed here once Step 2.5 is **COVERED** or the user has explicitly consented to the credit cost. Call `get_company` for the resolved `company_id` with `include=crm_connections.crm_record.crm_owner,tags`. Track `meta.credits.charged` (0 = it was in the free 12-month window; 1 = this call charged).\n\nCapture: industry, employee_count and range, location (HQ city and country), B2B/B2C orientation, founded year, revenue/earnings/net_worth where present, **intent score and tier (from `attributes.intent.score` (0–10, may be `null`) and `attributes.intent.score_tier` — nested under `attributes`, not a top-level `intent.score`; if null, show \"not yet scored\"). Prefix the displayed score with a tier dot by `score_tier`: 🟢 high · 🟠 medium · ⚪️ low (omit the dot when \"not yet scored\")**, description, legal form, register status.\n\n**Use one canonical figure per metric across the entire brief.** `get_company` returns both an exact `employee_count` (e.g. 382) and a coarser range/bucket. Treat the **exact `employee_count`** as the single source of truth and use that same number everywhere — the one-sentence intro, the Snapshot, and any reasoning. If you round it in prose, round the *same* number consistently (382 → \"~380\" or \"380+\" — never \"230+\" or a different bucket). Same rule for revenue and any other figure. Two different numbers for the same metric in one brief (e.g. intro says \"230+ employees\", Snapshot says \"382\") is a trust-breaker — the intro and Snapshot must never disagree.\n\n**CRM connections (sideloaded).** Request `include=crm_connections.crm_record.crm_owner` (plain `include=crm_connections` returns only a stub — `crm_record` as `{id, type}` with no name, URL, or owner). A populated `relationships.crm_connections` means the company is in the CRM. Each `crm_record` is JSON:API-shaped and **polymorphic** (`crm_record.type` = `crm_organization` | `crm_contact` | `crm_lead`): read **URL** from `crm_record.attributes.crm_url`; **name** by type (`crm_organization` → `attributes.name`; `crm_contact`/`crm_lead` → `attributes.first_name` + `attributes.last_name`); **owner** from `crm_record.relationships.crm_owner.attributes.name` (say \"owner not set\" if only a stub). **Render as a markdown link** — the record name is the clickable text and `crm_record.attributes.crm_url` is the target; never print the raw URL or leave the name unlinked. This complements the firmographics with the company's status in the user's own CRM — surface it in the Snapshot and factor it into the recommendation.\n\n**Tags (sideloaded via `include=tags`).** Capture each assigned tag's `attributes.name` and `attributes.color`. Note: `color` is an integer palette **index** (0–N), not a hex code — the API doesn't expose the hex, and a plain markdown brief can't render background-filled chips anyway. So surface tags as plain-text chips (backtick `` `Hot Lead` `` style) using their **names**; do not invent a colour. Show them in the Snapshot because customers use tags to prioritise accounts, so they inform the recommended next move.\n\n**Ignore `web_engagement.last_visit_date`** — it lags the real visits stream. Use Step 4 as the source of truth for visit timing.\n\n**Flag register status `out_of_business` or `non_company` immediately** and stop the brief. Tell the user the company is not actionable and skip the rest of the workflow.\n\nDo not call `get_company_financials` by default. It charges per call. Only call it if the user explicitly asks for \"financials\", \"company financials\", \"balance sheet\", or similar.\n\n### Step 4 — Pull engagement history\n\nCall `search_web_visits` with `filters.company_id` set to the resolved company. Use the user's engagement window (default last 90 days).\n\nAggregate the response to produce:\n\n- **Total sessions** in the window\n- **First seen** and **last seen** timestamps in the window\n- **Top landing pages** by visit count (deduplicate paths, show top 5)\n- **Top traffic sources** (Direct, Google organic, Bing organic, Google CPC, LinkedIn, etc.)\n- **Trend** — qualitative read: accelerating, stable, declining, dormant. Compare the most recent 30 days vs the 30 days before.\n- **Identified visits** — count only. Do NOT expose contact names or emails. Note the number of distinct identified contacts.\n- **Deep visits** — flag any session with `page_depth >= 3` or `visit_length >= 60s` as a \"deep visit\" worth calling out. **In the output use plain language** (this brief is read by sales reps too): \"viewed 3 pages\", \"spent 71 seconds\" — never \"page depth 3\" or \"dwell\". `page_depth`/`visit_length` are internal API fields; translate them into plain page counts and seconds, never print the field name or the word \"depth\".\n\n### Step 5 — Pull contacts on file\n\nCall `search_contacts` filtered by the company ID. Use the response to produce a **non-PII summary**:\n\n- **Total contacts** on file (count)\n- **Department breakdown** (e.g. 12 in Engineering, 8 in Sales, 5 in Marketing)\n- **Seniority breakdown** (e.g. 2 C-level, 4 VPs, 10 managers, 15 ICs)\n- **Buyer Persona matches** — for each configured persona, count how many contacts match; flag ✅ when ≥1 and ❌ when zero (an honest gap callout — surface the empty personas, don't hide them)\n- **Decision-maker availability** — ✅ Yes / ⚠️ Limited / ❌ No: are there senior-enough contacts (top management, VP/Director level, etc.) on file to make outreach worth doing?\n\n**Do NOT list individual contact names, emails, phone numbers, or LinkedIn URLs** in the brief output. Contact detail belongs in the separate Find My Buyer skill, which is invoked explicitly. This brief is a research overview, not a contact list.\n\n### Step 6 — Pull recent signals\n\nFor a **COVERED** company (visited in the last 12 months) this is free — always run it; do not gate or skip it on cost grounds. For an **UNCOVERED** company it charges 1 credit (if the company has signals), so only run it under the consent obtained in Step 2.5. Call `search_companies_signals` for the single `company_id`. Apply the same default filters as the Daily Visitor Brief:\n\n- **Recency window:** `event_date.from` = today minus 90 days (or override the user's engagement window if longer).\n- **Exclude regulatory noise:** Pass an explicit `categories` array containing every category EXCEPT `regulatory_compliance_updates`. Full default categories:\n\n```\n[\"business_expansion\", \"competitive_landscape\", \"event_participation\", \"industry_recognition\", \"leadership_changes\", \"corporate_challenges\", \"mergers_and_acquisitions\", \"customer_acquisition\", \"investment_activity\", \"product_and_service_development\", \"partnerships_and_collaborations\", \"financial_struggles\", \"job_ads\", \"register_updates\"]\n```\n\nGroup the returned signals by category. Highlight the ones that move the recommended action (hiring spikes, funding events, leadership changes, M&A activity, financial stress).\n\n**Signal language — plain, and always explain relevance.** The category filtering is an internal mechanic — **never surface it in the output** (no \"non-job-ad\", no category names, no \"excluding regulatory\", no \"90-day window\" jargon). When nothing relevant is found, say exactly **\"No notable signals in the last 90 days.\"** When a signal *is* present, pair it with a short plain-language reason it matters in this context — a raw event with no \"so what\" isn't useful (e.g. \"Hiring 3 SDRs in EMEA — a growing outbound team, a fit for visitor intelligence\"; \"Raised Series B — fresh budget, likely expanding tooling\").\n\n### Step 7 — Compute ICP match and synthesise recommendation\n\nScore the company against each configured ICP from Step 2:\n\n- **Full match** — all filters satisfied (location, employee count, industry, B2B/B2C orientation as applicable).\n- **Partial match** — some filters satisfied. Call out which dimensions match and which don't (e.g. \"DE + Pro Services match, employee count under threshold\").\n- **No match** — none of the configured ICPs apply.\n\nThen synthesise a **Recommended next move** section. This is the one part of the brief where the skill takes a position. Base the recommendation on:\n- ICP fit (sales-worthy or not)\n- Engagement signal strength\n- Recent signals that suggest a moment of opportunity (hiring HR roles, raised funding, lost a key exec, etc.)\n- Decision-maker availability\n- **CRM status** — this changes the action:\n  - *Connected with an owner* → do not recommend cold outreach; recommend coordinating with / looping in the owner and checking their pipeline first.\n  - *Connected but no owner (orphaned)* → flag it as a routing gap worth resolving.\n  - *Not in CRM* → flag it as a missed-routing gap; consider adding it (via `add-to-pipeline`) before outreach.\n\nSurface 1–3 next-step actions. **Phrase each in plain language, outcome first — describe what it does for the user, then the copy-paste prompt. Never a bare \"Run `skill`\".** The follow-ons and their honest outcomes:\n\n- **Find who to contact** — a ranked shortlist of the right people with names, titles, and emails. (`find-my-buyer`)\n- **Prep outreach** — visit-grounded talking points for a personalised opener. (`outreach-companion`)\n- **Add to your pipeline** — tags the company and adds it to a Leadfeeder list so it's tracked. (`add-to-pipeline`) Say exactly that — it writes tags and lists **inside Leadfeeder**; it does **not** create a CRM record or assign a CRM owner. (If the company should also live in the user's CRM, that's a separate manual step — don't imply `add-to-pipeline` does it.)\n\nPick the 1–3 most relevant given the ICP verdict, engagement signal, and available contacts. This is what makes the brief actionable.\n\n## Output format\n\n**Output contract — identical every run.** Reproduce the structure below **exactly**, on every invocation, regardless of anything earlier in this thread. If you've already run this skill in the conversation, do not vary, restyle, or \"improve\" the format next time — output the same template verbatim; this template is the single source of truth. Keep the exact headings, field labels, and order; don't invent new sections or tiers, don't renumber, don't rename fields, and add no decorative emoji beyond those the template already uses (✅ ❌ ⚠️ ↩ and the 🟢 / 🟠 / ⚪️ intent dots).\n\n**Status flags — be honest about gaps.** On coverage/availability/status lines use ✅ (present/strong), ⚠️ (partial/thin), ❌ (gap/missing), and surface gaps as prominently as strengths — an honest ❌ (\"no contacts on file for this persona\") builds trust more than only showing wins. One flag per line; don't over-decorate.\n\n**Stamp the brief with a generation timestamp.** The line directly under the title is `*Generated {current date} · engagement window: last {N} days*` — use the **current date** (the brief is a point-in-time snapshot). This is the *generation* timestamp (\"as of\" date); it is distinct from visit dates and must always be present, even when visit data is sparse. Do not substitute a visit date for it.\n\nRender as a single structured brief. Use this exact structure (the outer block is shown with four backticks so the copy blocks nest correctly — your actual output is plain markdown):\n\n````markdown\n# Company Brief — {Company Name}\n*Generated {current date} · engagement window: last {N} days*\n\n{One-sentence positioning: what they do, key size signal, ICP verdict in one line. The size signal must use the SAME exact employee_count/revenue shown in the Snapshot below — never a different figure or bucket.}\n\n## Snapshot\n- **Industry:** {primary + secondary industries}\n- **Size:** {employee count} · {revenue if present}\n- **Location:** {city, country} (HQ)\n- **Legal form / founded:** {legal form} · founded {year}\n- **Intent score:** {🟢 high / 🟠 medium / ⚪️ low} {score} ({tier})\n- **ICP match:** {✅ Full / ⚠️ Partial / ❌ No match} — {one-line reason}\n- **Tags:** {Assigned tags as plain-text chips by name — e.g. `` `Hot Lead` ``, `` `DACH` ``. Omit the line if none. Tag colours are configured in Leadfeeder but can't render as background-filled chips in this markdown brief, so show names only.}\n- **CRM:** {If connected: \"[{record name}]({crm_record.attributes.crm_url}) · Owner: {owner name — or 'owner not set'}\" (record name derived by type per the capture rules) — one line per record if more than one is linked. If not: \"Not found in your CRM\".}\n\n## Engagement (last {N} days)\n- **Total sessions:** {N}\n- **First seen / Last seen:** {date} / {date}\n- **Top landing pages:** {/path1, /path2, /path3}\n- **Top sources:** {Direct, Google CPC, Bing organic}\n- **Deep visits:** {count and short description of the deepest one, e.g. \"1 deep visit yesterday — 3 pages, 71s, hit /pricing\"}\n- **Trend:** {accelerating / stable / declining / dormant} — {one-line interpretation}\n- **Identified visits:** {N sessions from {M} distinct identified contacts} (names withheld; see Find My Buyer skill)\n\n## People on file ({N} contacts)\n- **Departments:** {top 3 departments with counts}\n- **Seniority:** {C-level: X, VP/Director: Y, Manager: Z, IC: W}\n- **Buyer Persona matches:** (flag each — ✅ if ≥1 match, ❌ if zero)\n  - ✅ \"{Persona name}\" → {N matching contacts}\n  - ❌ \"{Persona name}\" → 0 (gap: no contacts on file)\n- **Decision-maker availability:** {✅ Yes / ⚠️ Limited / ❌ No} — {one-line on what's there}\n\n## Recent signals (last 90 days)\n{Group by category. Use a sub-heading per non-empty category. Omit empty categories entirely. Each grouping's cluster gets a one-line \"why it matters\"; never expose filter mechanics. If nothing relevant: replace this whole section with the single line \"No notable signals in the last 90 days.\"}\n\n### Hiring ({N} ads)\n- {Role 1} — {date}\n- {Role 2} — {date}\n- ... (cap at 5, summarise the rest as \"+N more\")\n*Why it matters: {one plain line, e.g. \"hiring across HR + IT Security suggests an org rebuild — a fit for our RevOps narrative\"}.*\n\n### Leadership changes ({N})\n- {Event} — {date}\n*Why it matters: {e.g. \"new decision-maker settling in — a natural moment to introduce a new approach\"}.*\n\n### Funding / Investment ({N})\n- {Event} — {date}\n*Why it matters: {e.g. \"fresh capital — expansion mode, likely evaluating new tooling\"}.*\n\n(Other categories as relevant, each with its own \"why it matters\" line.)\n\n## Recommended next move\n\n{One short paragraph synthesising the read. Then 1–3 actions, formatted as a list.}\n\n- **{Action 1}** — {short rationale, e.g. \"Find who to contact — a ranked shortlist of the right people.\"}\n- **{Action 2}** — {short rationale}\n- **{Action 3}** — {short rationale}\n\nCopy any of these to run the next step (each is a ready-to-send prompt with a one-click copy button):\n\n```\nWho should I reach out to at {Company Name}?\n```\n\n```\nPrep me for outreach to {Company Name}\n```\n\n---\n\n**Company website:** {company.url from get_company}\n````\n\n**Copy-block convention.** Emit one fenced code block per recommended action above — fenced blocks give the user a one-click **Copy** button. Map each action to its ready-to-send prompt: `find-my-buyer` → `Who should I reach out to at {Company Name}?`; `outreach-companion` → `Prep me for outreach to {Company Name}`; `add-to-pipeline` → `Add {Company Name} to a list in Leadfeeder`. Only include the blocks for the actions you actually recommended.\n\n## Edge cases\n\n- **Company not found by `search_companies`.** Tell the user clearly. Offer to expand search (\"try a different name fragment or a domain\"). Do not fabricate a profile.\n- **Multiple plausible matches.** Present top 3 with disambiguation criteria (country, employee count, industry). Wait for user input before continuing.\n- **Register status is `out_of_business` or `non_company`.** Stop the brief immediately. Tell the user and offer an alternative (\"Did you mean a different entity?\"). Do not waste tokens on a dead company.\n- **No web visits in the engagement window.** Say so clearly. Optionally offer to expand the window. Do not invent visits.\n- **No contacts on file.** Say so. Flag this as a gap — recommend running enrichment (\"Want me to find contacts via the Find Contact Data job?\") but do not auto-trigger it (cost).\n- **No signals in the 90d window.** Say \"No notable signals in the last 90 days.\" Move on. This is not unusual for smaller or quieter companies.\n- **ICP mismatch.** Surface the verdict honestly. Do not pad with \"but they could still be interesting\" unless the engagement signal is unusually strong (e.g. deep pricing visits).\n- **User asks for financials.** Then and only then call `get_company_financials`. Quote the credit cost in the response.\n- **Tool errors.** Report transparently. Do not silently substitute stale data.\n\n## Source citation rule\n\nEvery claim in the brief must be grounded in data returned by the Leadfeeder MCP tools. Use the company's website (`company.url` field from `get_company`) as the actionable link in the footer. CRM record name, URL, and owner must come from the sideloaded `crm_record` (and its `crm_owner`) under `relationships.crm_connections` — `crm_record.attributes.crm_url`, the name from `crm_record.attributes` per record type, and `crm_record.relationships.crm_owner.attributes.name` — never infer that a company is (or isn't) in the CRM without that data; if no connection is returned, treat it as \"Not found in your CRM\". Do not invent URLs.\n\n**Internal consistency (trust).** Beyond the canonical-figure rule in Step 3, every fact restated across sections — counts, country/city lists, dates, page paths — must match exactly. A stated count must equal the items you list, and a location set must be the same set wherever it appears (cities and countries resolving to the same places). The intro, Snapshot, Engagement, People, and Recommended-next-move sections must never disagree about the same fact. Re-check before finishing.\n\n**Known gap (same as Daily Visitor Brief):** The MCP `get_company` response does not currently include a Leadfeeder app deeplink. Until the MCP adds this, the brief footer links out to the prospect's own website only. If a future MCP version returns an app URL field, update this skill to add an \"Open in Leadfeeder\" line below the \"Company website\" line.\n\n## What NOT to do\n\n- **Do not call a visitor an \"account\" or a \"hot/warm lead.\"** A website visitor is a **company** — \"account\" implies a CRM relationship this data doesn't carry. Reserve \"account\" for the user's Leadfeeder account (workspace/ID) or a genuine CRM record; use \"high-intent\", \"active\", \"engaged\", or \"returning\" instead of \"hot\"/\"warm\".\n\n- **Do not expose individual contact PII** (names, emails, phone numbers, LinkedIn URLs). Counts, departments, seniority levels, and persona-match counts are fine. Identifying detail is not.\n- **Do not trigger enrichment jobs** (`create_company_enrichment_job`, `create_find_contact_data_job`). This brief is research, not action. Offer to invoke them as a \"Recommended next move\" only.\n- **Do not call `get_company_financials` by default.** It charges per call. Only on explicit request.\n- **Do not invent data.** ICP match, signal counts, page views, contact counts — only report what the tools return.\n- **Do not chain to outreach drafting, CRM writes, or list management** on direct user invocation without explicit opt-in. Recommend them as next moves using the skill names above. Exception: if invoked by the Leadfeeder Agent as part of a declared multi-step chain, the agent may proceed with `find-my-buyer`, `outreach-companion`, or `add-to-pipeline` without waiting for confirmation.\n- **Do not produce a brief for an `out_of_business` company.** Stop and notify the user instead.\n\n## Example: good output\n\n````markdown\n# Company Brief — Acme Corp\n*Generated 2026-05-29 · engagement window: last 90 days*\n\nEuropean technical inspection, testing, certification, and training group. €1.58B revenue, 14,271 employees across 70+ countries. ✅ Full ICP match — DE · Pro Services · enterprise size · B2B.\n\n## Snapshot\n- **Industry:** Technical Testing & Analysis · Management Consultancy · Educational Support\n- **Size:** 14,271 employees · €1.58B revenue (2023)\n- **Location:** Hannover, DE (HQ) · 70+ country presence\n- **Legal form / founded:** GmbH\n- **Intent score:** 🟢 10 (HIGH)\n- **ICP match:** ✅ Full — DE location, Pro Services industry, 10000+ employee bucket, B2B\n- **Tags:** `Tier-1 Pro Services` · `DACH`\n- **CRM:** Not found in your CRM\n\n## Engagement (last 90 days)\n- **Total sessions:** 4\n- **First seen / Last seen:** 2026-03-12 / 2026-05-29\n- **Top landing pages:** /\n- **Top sources:** Bing organic, Direct\n- **Deep visits:** None — all sessions were single-page\n- **Trend:** Stable, single visits across the window. Today's visit is the first in 2 weeks.\n- **Identified visits:** 1 session from 1 distinct identified contact (names withheld; see Find My Buyer skill)\n\n## People on file (2,838 contacts)\n- **Departments:** Engineering (612), IT (487), Operations (340), HR (210)\n- **Seniority:** C-level: 14 · VP/Director: 87 · Manager: 412 · IC: 2,325\n- **Buyer Persona matches:**\n  - ✅ \"Head of Marketing\" → 6 matching contacts\n  - ✅ \"Sales Director\" → 11 matching contacts\n  - ✅ \"Revenue Operations Manager\" → 4 matching contacts\n  - ❌ \"IT Security Lead\" → 0 (gap: no contacts on file)\n- **Decision-maker availability:** ✅ Yes — strong senior coverage across HR, IT, Sales\n\n## Recent signals (last 90 days)\n\n### Hiring (13 ads)\n- Strategic HR Business Partner — 2026-04-22\n- IT Security Specialist (Cloud & Web) — 2026-04-08\n- SAP Frontend Engineer — 2026-05-20\n- HR Controlling / People Analytics Manager — 2026-05-06\n- Working Student Finance — 2026-05-26\n- +8 more across HR, Engineering, IT Security\n*Why it matters: hiring is concentrated in strategic HR functions, IT Security, and SAP front-end — an org rebuild that aligns with our visitor-intent / RevOps narrative.*\n\n## Recommended next move\n\nActive expansion signal: 13 open roles in 90 days concentrated in HR strategic functions, IT Security, and SAP front-end. Combined with full ICP fit and 2,800+ contacts on file, this is a Tier-1 outbound target. The hiring pattern suggests org-design or function-rebuild work that aligns with our visitor-intent / RevOps narrative.\n\n- **`find-my-buyer`** — surface the Strategic HR Business Partner and Head of Marketing contacts to lead with\n- **`outreach-companion`** — draft a personalised opener grounded in the hiring spike + today's visit\n- **Add to your pipeline** — not in your CRM yet (missed-routing gap): tag it \"Tier-1 Pro Services\" and add it to your DACH enterprise list in Leadfeeder so it's tracked. (`add-to-pipeline` — writes tags/lists in Leadfeeder; getting it into your CRM is a separate manual step.)\n\nCopy any of these to run the next step:\n\n```\nWho should I reach out to at Acme Corp?\n```\n\n```\nPrep me for outreach to Acme Corp\n```\n\n---\n\n**Company website:** http://www.acme.com\n````\n\nKeep briefs tight and actionable. The reader is deciding \"do I open this company today or not.\" The Recommended next move section is what converts the brief into work.\n"
}

SHA-256: 83dd6a3b318189dada9cf29b5a32c1f75ec1d3052139c687cbaac139d6941dbb