skills/deepline-gtm/SKILL.md
Use to prospect, enrich, qualify, and activate outbound — especially when users mention Deepline, CSV processing, lead/account/contact research, waterfall enrichment, email or LinkedIn lookup, personalization, scoring, or campaign activation. Route CSV-heavy and provider-driven requests here, then rely on linked sub-docs and provider playbooks for execution details. Providers: adyntel, ai_ark, apify, apollo, attio, bettercontact, bloomberry, builtwith, cloudflare, contactout, crustdata, crustdata-v2, customer_db, dataforseo, datagma, deepline_native, deeplineagent, discolike, dropleads, exa, findymail, firecrawl, forager, fullenrich, generic_http, google_ads_audiences, heyreach, hubspot, hunter, icypeas, instantly, ipqs, leadmagic, lemlist, limadata, linkedin_ads_audiences, linkedin_scraper, lusha, meta_audiences, openmart, openwebninja, parallel, peopledatalabs, predictleads, prospeo, rocketreach, salesforce, serper, slack, smartlead, snowflake, theirstack, trestle, upcell, wiza, zerobounce.
npx skillsauth add getaero-io/gtm-eng-skills deepline-gtmInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Use this skill for prospecting, account research, contact enrichment, verification, lead scoring, personalization, and campaign activation.
provider-playbooks/*.md.--rows 0:1 one-row pilots.Customer is generally trying to go from "I have an ICP" to "Here's a list of prospects with email/linkedin and very personalized content or signals". They may be anywhere in this process, but guide them along.
Discovery order: companies first, then people. When the task requires finding contacts at companies matching criteria (portfolio, ICP, hiring signal), discover the company set first, then find people at each company. Do not start with broad people-search queries.
SKILL.md): decision model, guardrails, approval gates, links to sub-docs.prompts.json.recipes/*.md): step-by-step playbooks for specific tasks (email lookup, LinkedIn resolution, waterfall patterns, contact finding, actor contracts). Search like code with Grep.provider-playbooks/*.md): provider-specific quirks, cost/quality notes, and fallback behavior.No-loss rule: moved guidance remains fully documented at its canonical level and is linked from here.
STOP. Do not call any provider, run any deepline tools execute, or write any search command until you have opened the correct sub-doc for your task.
These skill docs and sub-docs are not generic documentation — they are distilled from hundreds of real runs and encode exactly what works, what fails, and why. They contain validated parameter schemas, correct filter syntax, parallel execution patterns, tested sample payloads, and known pitfalls that took many iterations to discover. Think of them as shortcuts: reading a doc for 5 seconds saves you from 10 failed tool calls, wasted credits, and garbage output. Every time an agent skips reading the docs and tries to "figure it out" from first principles, it re-discovers the same failure modes that are already documented and solved.
SKILL.md is the routing layer — it tells you WHERE to go, not HOW to execute. The sub-docs and task-specific skills contain the HOW. Without them you will guess parameters, pick wrong providers, run searches sequentially instead of in parallel, and produce garbage results. This has happened repeatedly.
This is not optional. Read the matching doc. Do not skip this step. Do not "just try Apollo real quick" or "just run one search to see." These docs exist because the correct approach was non-obvious and had to be learned through trial and error — they are shortcuts that let you skip straight to what works.
!important READING MULTIPLE DOCS IS A GREAT IDEA AND OFTEN SUPER ESSENTIAL. JUST READ MORE.
Routing rules — match your task to a doc and READ IT:
| When the task involves... | You MUST read this doc first | What it gives you (that SKILL.md doesn't) |
| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| Finding companies, finding people, building lead lists, prospecting, portfolio/VC sourcing, contact finding at known companies, coverage completion at scale | finding-companies-and-contacts.md | Provider filter schemas, parallel execution patterns, provider mix tables, role-based search rules, subagent orchestration, at-scale coverage completion, portfolio/VC shortcuts, contact finding patterns. |
| Researching companies or people, understanding what they build, figuring out use cases, personalizing based on mission/product/industry, enriching a CSV, adding data columns, waterfall enrichment, finding emails/phones/LinkedIn, coalescing data, custom signals, run_javascript / deeplineagent steps, Apify actors — any task that adds or transforms row-level data | enriching-and-researching.md | deepline enrich syntax and all flags. Waterfall patterns with fallback chains. run_javascript / deeplineagent routing. Multi-pass pipeline patterns (research pass → generation pass). Coalescing patterns. Email/phone/LinkedIn waterfall orders. Custom signal buckets. Apify actor selection. GTM definitions and defaults. |
| Writing cold emails, personalizing outreach, lead scoring, qualification, sequence design, campaign copy, inspecting CSVs in Playground. If the task also requires researching companies/people to inform the writing, read enriching-and-researching.md too — it has the multi-pass pipeline pattern. | writing-outreach.md | Prompt templates from prompts.json. Scoring rubrics. Email length/tone/structure rules. Personalization patterns. Qualification frameworks. Playground inspection commands. |
| Building or modifying a cloud workflow (deepline workflows apply), designing step sequences, data contracts, triggers (webhook/cron/API), waterfall blocks, expectations, deploy/verify cycles, or debugging a failing workflow run. This is NOT the same as a GTM enrichment workflow — cloud workflows are persisted automations with triggers. | references/cloud-workflow-builder.md | Schema for WorkflowApplyInput, Command, and Waterfall blocks. Placeholder resolution rules. run_javascript environment. Spec template. Deploy/verify/iterate loop. Execution modes (smoke_test, dry_run). Disabled steps. Poll+dispatch and fanout patterns. |
If you are hand-authoring enrich columns instead of using a native play, jump straight to the "Handmade step shape quick reference" section in enriching-and-researching.md. That section spells out the exact runtime contract for run_javascript, extract_js, result, and persisted matched_result.
The recipes/ directory contains battle-tested playbooks. Before you start executing, scan this list and read any recipe that matches your task.
When a recipe matches: follow it step-by-step as your execution plan. Recipes encode hard-won sequencing and provider choices — trust them over generic guidance or your own intuition. If the user's request doesn't perfectly fit, adapt the recipe using the phase docs above, but keep the recipe's structure and ordering as your baseline.
| Recipe | Use when... |
| ------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------ |
| account-orgchart.md | Building an org chart around a target person or company - map reporting structures, find decision makers, highlight warm intro paths |
| build-tam.md | Building a total addressable market list or large company list from ICP criteria |
| clay-to-deepline.md | Converting a Clay table into local Deepline enrich scripts (extraction, mapping, parity validation) |
| linkedin-url-lookup.md | Resolving a person's LinkedIn profile URL from their name and company with strict identity validation |
| portfolio-prospecting.md | Finding companies backed by a specific investor or accelerator, then finding contacts and building personalized outbound |
| small-business-prospecting.md | Finding local small businesses or storefront/service-area companies using Maps-style search. Doctors, services business, restaurants, etc. |
| workflows-hello-world.md | Creating a cloud Deepline workflow that runs on a recurring cron schedule or via webhook, then inspecting trigger behavior end to end |
If none match, grep for more specific keywords: Grep pattern="<keyword>" path="<directory containing this SKILL.md>/recipes/" glob="*.md" output_mode="files_with_matches"
deepline csv show --csv <path> --summary first to understand its shape (row count, columns, sample values) before deciding how to process it.deepline enrich for any row-by-row processing (enrichment, rewriting, research, scoring).deepline csv show --csv <path> --rows 0:2 for a two-row sample, or spawn an Explore subagent to answer questions about the data.deepline enrich --input <csv> --output <csv> --rows 0:1 ... for a one-row pilot, then rerun against the full file after inspecting output.For signal-driven discovery (investor, funding, hiring, headcount, industry, geo, tech stack, compliance), start with deepline tools search. Do not guess fields.
Search 2-4 synonyms, execute in parallel:
deepline tools search investor
deepline tools search investor --prefix crustdata
deepline tools search --categories company_search --search_terms "structured filters,icp"
deepline tools search --categories people_search --search_terms "title filters,linkedin"
Use category filters when tool type matters more than provider breadth. Common categories:
company_search: account/company discovery toolspeople_search: people/contact discovery toolscompany_enrich: company enrichment on known companiespeople_enrich: person/contact enrichment on known peopleemail_verify: email verification / deliverabilityemail_finder: email lookup / discoveryphone_finder: phone lookup / discoveryresearch: company research, ad intel, job search, technographics, web researchautomation: workflow-style tools, browser/actor runs, batch automationoutbound_tools: all Lemlist/Smartlead/Instantly/HeyReach style actionsautocomplete: canonical filter value discovery before searchadmin: credits, monitoring, logs, schemas, local/dev utilitiesUse --search_terms for extra ranking hints like structured filters, title filters, api native, autocomplete, or bulk.
Good:
deepline tools search --categories company_search --search_terms "investors,funding"deepline tools search --categories research --search_terms "ads,technographics"Avoid:
deepline tools search stuffdeepline tools search search across filtersWhen doing row by row processing (e.g. per customer, per lead, per linkedin url, etc)
Use deepline enrich as the default path.
Why:
Always publish your execution plan to the Session UI before running any commands. This is not optional — users monitor progress in real time via the Session UI. Without it, the UI shows nothing and users have no visibility.
# Post your plan (accepts JSON array of step labels)
deepline session start --steps '["Inspect CSV and understand shape","Search for email finder tools","Run pilot on rows 0:1","Get approval for full run","Execute full enrichment","Post-run validation and delivery"]' --user-prompt "Original user request"
# As you complete each step, update its status (0-indexed)
deepline session start --update 0 --status completed
deepline session start --update 1 --status running
deepline session start --update 1 --status completed
deepline session start --update 2 --status running
# On error:
deepline session start --update 2 --status error
Valid step statuses: pending, running, completed, error, skipped.
As you work through a running step, send status updates to show what you're currently doing. This is for emergent work the plan couldn't predict upfront (parsing responses, falling back to alternative providers, extracting data, etc.).
# While a step is running, send status updates (attaches to the currently-running step)
deepline session status --message "Extracting company domains from Apollo response"
deepline session status --message "LeadMagic returned no results — falling back to ZeroBounce"
deepline session status --message "Validating 23 catch-all emails"
# Optionally target a specific step by index
deepline session status --message "Retrying with different params" --step-index 2
Each new status message marks the previous one as done and appears as the active sub-step. These are lightweight — use them freely whenever you're doing something the user would want to see.
Rules:
deepline session start call with --user-prompt "...".deepline session start --update 0 --status running.running when starting, completed or error when done.session status messages during step execution to show what you're currently working on.deepline session start --steps ... at the end just to mark completion. --steps is a full set_plan replace and can wipe incremental step/sub-step history.--update (for example, set final running step to completed).--update fails with step_index ... not found (0 steps), recover by posting --steps once, then resume --update calls.--steps mid-run when the plan structure truly changes.deepline enrich, register them: deepline session output --csv <path> --label "Label".deepline session usage [--session-id UUID] [--json] when you need to inspect the current session's credits used, estimated spend, or limit state.GTM time windows, thresholds, and interpretation rules are defined in the Definitions section of enriching-and-researching.md.
Provider-specific playbooks are bundled as separate reference files. Open the relevant playbook when provider-specific behavior, pricing, caveats, or payload conventions matter.
adyntel, ai_ark, apify, apollo, attio, bettercontact, bloomberry, builtwith, cloudflare, contactout, crustdata, crustdata-v2, dataforseo, datagma, deepline_native, deeplineagent, discolike, dropleads, exa, findymail, firecrawl, forager, fullenrich, generic_http, google_ads_audiences, heyreach, hubspot, hunter, icypeas, instantly, ipqs, leadmagic, lemlist, limadata, linkedin_ads_audiences, lusha, meta_audiences, openmart, openwebninja, parallel, peopledatalabs, predictleads, prospeo, salesforce, serper, smartlead, snowflake, theirstack, trestle, upcell, wiza, zerobounce
NEVER write files to /tmp/ or any absolute temp directory. Files in system /tmp/ are wiped on reboot — users permanently lose enriched CSVs, research outputs, and hours of paid enrichment work. This is a critical data-loss risk.
Set up a descriptive project-local working directory as your first action:
WORKDIR="deepline/data/<descriptive-task-slug>" && mkdir -p "$WORKDIR" && echo "$WORKDIR"
The slug must describe the task (e.g. deepline/data/yc-cmo-outbound, deepline/data/acme-email-waterfall). Do NOT use random names like mktemp generates — the user needs to find these files later. See enriching-and-researching.md for full details.
deepline enrich for list enrichment or discovery at scale (>5 rows). It auto-opens a visual playground sheet so user can inspect rows, re-run blocks, and iterate.deepline tools execute is short sighted.run_javascript in deepline enrich, put JS in payload.code; the current row is auto-injected as row at runtime, so you usually should not pass row yourself.deepline session output --csv <csv_path> --label "My Results". This is the lightweight alternative to deepline enrich for surfacing output in the Session UI.deepline backend stop --just-backend unless the user asked to keep it running._metadata) end-to-end. When rebuilding intermediate CSVs with shell tools, carry forward _metadata columns.--output to write to your working directory on the first pass, then --in-place on that output for subsequent passes. --in-place is for iterating on your own prior outputs — never on source files.--with-force <alias> only for targeted recompute.See enriching-and-researching.md for deepline csv commands, pre-flight/post-run script templates, and inspection details.
FINAL_CSV="${OUTPUT_DIR:-$WORKDIR}/<requested_filename>.csv"FINAL_CSV and exact Playground URL.--rows 0:1 for one row).When the user asks for N rows, start with ~1.4×N (e.g., 35 for 25). Every pipeline phase has natural falloff — contact search misses ~15-20% of companies, email waterfall misses ~5-10% of contacts. Fighting to complete the hard rows is almost always a waste: the companies that providers can't find contacts for are the same ones that won't have email coverage either.
Do this:
Do NOT do this:
deeplineagent research passes, or manual patching.deeplineagent research passes).Provider coverage is a property of the company, not something you can overcome with more effort. Tiny startups with 5 people will have zero coverage across all providers — no amount of retrying changes that. Over-provision at the top and let incomplete rows fall off naturally.
Include all of:
deepline enrich --rows 0:1 one-row pilotApprove full run?Note: deepline enrich already prints the ASCII preview by default, so use that output directly.
Strict format contract (blocking):
AWAIT_APPROVAL and do not run paid/cost-unknown actions.FULL_RUN after an explicit user confirmation to the approval question.run_javascript is the non-AI path. aiinference is for general classification/structured reasoning, and deeplineagent is for context gathering / web research / signal extraction.Approval template:
Assumptions
- <intent assumption 1>
- <intent assumption 2>
CSV Preview (ASCII)
<paste verbatim output from deepline enrich --rows 0:1>
Credits + Scope + Cap
- Provider: <name>
- Estimated credits: <value or range>
- Full-run scope: <rows/items>
- Spend cap: <cap>
- Pilot summary: <one short paragraph>
Approval Question
Approve full run?
--rows 0:1, end exclusive).deepline session alert --message "Approval needed: run enrichment on N rows (~X credits)"
deepline billing balance # Show current credit balance
deepline billing usage # Show recent billing activity and grouped recent usage
deepline billing limit # Show the current monthly billing cap
When credits at zero, link to https://code.deepline.com/dashboard/billing to top up. 10 credits == 1 USD
Reminder: you should have already read the relevant sub-doc from Section 2 before reaching this point. If you haven't, go back and read it now. This section is a quick-reference summary, NOT a substitute for the sub-docs.
deepline tools search <intent> and execute field-matched provider calls in parallel; when the deepline-list-builder subagent is available, use subagent-based parallel search orchestration as the preferred pattern. Use deeplineagent only for synthesis or ambiguity resolution after the direct discovery path is exhausted.deepline enrich syntax, play routing guidance, waterfall column patterns, and coalescing logic. Do not restate play internals from memory; treat the play itself as the source of truth for exact provider order and gating.run_javascript for deterministic transforms/template logic and deeplineagent for AI work. Start from prompts.json.leadmagic_email_validation first, then enrich corroboration.Provider path heuristics:
crustdata_person_enrichment, peopledatalabs_*) before leadmagic_* fallbacks.Critical: keep writing-outreach.md workflow context active when running any sequence task. It is not optional for ICP-driven messaging.
deepline enrich for heavy row-by-row work whenever possible. It has built-in rate-limit handling (adaptive retries/backoff) for standard upstream limits. If you are building a homegrown script, assume it does not include the same automatic protection unless you explicitly implement it.curl -s "https://code.deepline.com/api/v2/cli/install" | bash
Sites requiring auth: Don't use Apify. Tell the user to use Claude in Chrome or guide them through Inspect Element to get a curl command with headers (user is non-technical).
deepline tools get apify_run_actor_sync for the actor id, or try deepline tools search.supreme_coder/linkedin-post for generic posts/search URLs and harvestapi/linkedin-post-reactions when the goal is engagers/reactions. Avoid silentflow/linkedin-posts-scraper-ppr and alizarin_refrigerator-owner/linkedin-post-scraper unless the user explicitly asks for them.operatorNotes over public ratings when conflicting.deepline tools execute apify_list_store_actors --payload '{"search":"linkedin company employees scraper","sortBy":"relevance","limit":20}'
deepline tools execute apify_get_actor_input_schema --payload '{"actorId":"bebity/linkedin-jobs-scraper"}'
Do not wait for the user to ask. If there is a meaningful failure, send feedback proactively using deepline provide-feedback.
Trigger when any of these happen:
Run once per issue cluster (avoid spam), and include:
deepline provide-feedback "Goal: <goal>. Tool/provider/model: <details>. Failure: <what broke>. Error: <exact message>. Repro attempted: <steps>."
At the end of every completed run/session, ask exactly one Yes/No question:
Would you like me to send this session activity to the Deepline team so they can improve the experience? (Yes/No)
If user says:
deepline session send --current-session
Ask once per completed run. Do not nag or re-ask unless the user starts a new run/session.
devops
Use this skill when answering business analytics, RevOps, GTM metric, pipeline, revenue, funnel, customer, or warehouse questions with Deepline. Triggers on phrases like 'query Snowflake', 'analyze pipeline', 'total ACV', 'break down by quarter', 'use the semantic layer', 'run a semantic query', or any use of snowflake_get_semantic_layer / snowflake_run_semantic_query. Skip prospecting, enrichment, contact finding, outbound, or personalization workflows; use deepline-gtm for those.
tools
Use for Deepline SDK/CLI V2 GTM work: route, build, run, debug, and export durable plays; find companies or contacts; enrich email, phone, LinkedIn, or custom signals; migrate Clay-like tables; configure cron/webhook/API plays; control Deepline spend; and recover from play/tool shape failures. Triggers on deepline CLI work, CSV enrichment, prospecting, waterfalls, outbound lists, provider routing, play authoring, SDK V2 syntax, staleAfterSeconds, datasets, and eval-style GTM tasks.
tools
Discover niche first-party signals that differentiate Closed Won vs Closed Lost accounts for ICP analysis. Use when the user provides won/lost customer domain lists and wants differential signals (website content, job listings, tech stack, maturity markers) to build account scoring models and prospecting criteria. Triggers: ICP analysis, niche signals, won vs lost analysis, differential signals, signal discovery, ICP signal report, account scoring signals, lead scoring, first-party signals, buyer signals. Before reading this file, first read deepline-gtm to understand the Deepline CLI tool and how to use it. Then read this file for guidance on the task.
testing
Run a quick Deepline demo recipe to show the user how Deepline works.