← All skills

List Building and Data Skills for AI Agents

Building the list is where most outbound is won or lost, and it is the part people hand to a tool and stop thinking about. These are the plays I hand an agent when I want a list built from evidence rather than exported from a database.

How to use these

Every skill below is written to be pasted straight into an AI agent. Copy the block, add your own inputs where it asks for them, and run it. They are the plays I use on client work, given away because the play matters far less than knowing when to run it.

Company Size Range Bucketer

Normalize messy headcount and revenue values into consistent size bands for clean segmentation.

Requires LLM, Google Sheets

Purpose

Convert inconsistent headcount and revenue fields into standardized size bands so segmentation and routing rules stay reliable.

Inputs

  • Account list with raw employee count and revenue columns
  • Your defined band thresholds (for example 1 to 10, 11 to 50, 51 to 200)
  • Optional source column noting where each value came from

Steps

  1. Scan the headcount column and flag entries stored as ranges, text, or nulls.
  2. Parse messy values into a single integer, taking the midpoint for any provided range.
  3. Map each cleaned integer to the matching size band using your thresholds.
  4. Repeat the parse and map process for the revenue column into revenue bands.
  5. Cross-check headcount band against revenue band and flag rows where the two disagree sharply.
  6. Fill missing bands using the more complete of the two fields when only one exists.
  7. Tally row counts per band so you can see distribution before targeting.

Output

The list with normalized SizeBand and RevenueBand columns, a mismatch flag column, and a summary count of accounts per band.

Competitor Customer Scraper

Finds companies publicly using a competitor and turns them into an outbound list.

Requires Serper, Apify, Clay, LLM

Purpose

Assemble a list of companies that already use a named competitor so you can pitch a switch.

Inputs

  • Competitor name and product
  • Target buyer titles
  • Signals to search, such as case studies, review sites, or job posts

Steps

  1. Run Serper queries for the competitor name across G2, Capterra, case study pages, and "powered by" mentions to collect candidate company URLs.
  2. Use an Apify site scraper to pull company names and domains from the collected pages.
  3. Load the domains into Clay and dedupe, then enrich each with firmographics like industry, size, and country.
  4. Add an LLM column that reads each source snippet and labels the usage signal as confirmed, likely, or weak.
  5. Keep only confirmed and likely rows, then find contacts at each company matching the target titles with a Clay contact enrichment.
  6. Waterfall verified emails and export.

Output

A list of companies with evidence of competitor usage, matched contacts, verified emails, and a signal strength label for prioritization.

Email Waterfall Deduper

Cleans and enriches a raw list into a deliverable, deduped, verified send list.

Requires Clay, LLM

Purpose

Turn a messy exported list into a clean, deduped, verified send list that will not burn your sending domains.

Inputs

  • A raw CSV with names, companies, and any existing emails
  • Your list of already contacted or suppressed domains

Steps

  1. Load the CSV into Clay and normalize company names and domains to a consistent format.
  2. Dedupe on email first, then on the combination of full name and domain to catch repeats.
  3. Cross reference the suppression list and remove any matching domains or addresses.
  4. Run a verified email waterfall using Prospeo then a fallback provider, filling gaps and replacing catch-all or invalid addresses.
  5. Add a validity column and drop risky, role based, or unverifiable addresses like info@ and sales@.
  6. Use an LLM column to flag rows where the name looks like a team alias rather than a person.
  7. Export only rows marked valid and personal.

Output

A deduped, suppression-safe CSV of verified personal emails ready to upload to a sequencer without inflating bounce rate.

Hiring Signal Account List

Turns open job postings into an account list showing active budget and pain.

Requires Apify, Clay, LLM

Purpose

Build an account list from companies hiring for roles that imply they have the problem your product solves.

Inputs

  • Job titles or keywords that signal your pain, such as "RevOps" or "deliverability"
  • Target locations and company size
  • Freshness window in days

Steps

  1. Run an Apify job board scraper across LinkedIn Jobs and Indeed for the target keywords and locations.
  2. Keep postings inside the freshness window and extract company name, role, and posting date.
  3. Load into Clay and group rows by company, counting how many relevant roles each is hiring for.
  4. Enrich company domain and firmographics, then filter to the target size band.
  5. Use an LLM column to summarize why each hire signals your pain in one sentence.
  6. Find one to two contacts per account above the hiring manager and enrich verified emails.

Output

An account list ranked by number of relevant open roles, with a plain summary of the buying signal and matched contacts.

Intent Keyword Account Filter

Turn a raw account list into a ranked list using public intent signals from search and site behavior.

Requires Serper, LLM

Purpose

Rank a raw account list by public buying signals so reps work the warmest accounts first.

Inputs

  • CSV of company names and domains
  • 5 to 10 intent keywords tied to your problem space
  • Your product one-liner for relevance scoring

Steps

  1. For each account, run Serper searches pairing the company name with each intent keyword.
  2. Capture recent hits like blog posts, press releases, job posts, and forum threads that mention the keywords.
  3. Score each hit for recency, using 90 days or less as strong and older as weak.
  4. Have the LLM read snippets and tag each account as active signal, passive signal, or no signal.
  5. Assign a numeric score combining signal strength, recency, and keyword match count.
  6. Sort accounts high to low and write a one-line reason next to each top account.
  7. Flag accounts with zero public signal for a separate low-priority queue.

Output

A ranked CSV with score, signal tag, source URL, and a short reason per account, plus a low-priority overflow list.

Job Change Trigger List

Builds a warm list of prospects who started a target role in the last 90 days.

Requires LinkedIn Sales Nav, Clay, LLM

Purpose

Build a list of buyers who recently moved into a decision-making role so you reach them during their first-90-days buying window.

Inputs

  • Target job titles and seniority
  • Company size band and target regions
  • Number of prospects wanted

Steps

  1. In LinkedIn Sales Navigator, set the title, seniority, and geography filters, then apply the "Changed jobs in past 90 days" spotlight filter.
  2. Export the matching people into Clay, keeping name, title, company, and start date.
  3. In Clay, enrich each row with a verified work email using a waterfall of Prospeo then a secondary provider, and drop rows with no valid email.
  4. Add a column that calculates days since start date and flag anyone past 90 days for removal.
  5. Use an LLM column to draft a one line "new role" opener referencing their move and prior company.
  6. Filter to valid email plus start date under 90 days and export the final CSV.

Output

A CSV of recently promoted or newly hired buyers with verified emails and a personalized opener line ready for sequencing.

Personal Email Domain Splitter

Separate free webmail contacts from corporate domains so you route enrichment and sending correctly.

Requires Any LLM

Purpose

Split a contact list by email domtype type into corporate versfree webmail addresses so each group gets the right enrichment and outreach path.

Inputs

  • CSV of contacts with an email column
  • Optional list of known free webmail domains

Steps

  1. Parse each email and extract the domain after the at sign.
  2. Match each domain against a maintained list of free webmail providers such as gmail.com, yahoo.com, outlook.com, and icloud.com.
  3. Tag every row as corporate, free webmail, or unknown when the domain looks like a company but is unverified.
  4. Flag role based prefixes like info, sales, and support inside the corporate group for separate handling.
  5. For free webmail rows, note that firmographic enrichment will likely fail and suggest a person level lookup instead.
  6. Count rows per group and report the percentage that is corporate.

Output

Three labeled segments plus a short summary of how many contacts are safe for company enrichment versus person only routing.

Personal Email Guess And Verify

Generate likely personal email patterns per contact and validate them before adding to a list.

Requires Any LLM, email verification API

Purpose

Produce plausible personal or catch-all email addresses for contacts who lack a verified email, then confirm which ones are deliverable.

Inputs

  • CSV of contacts with first name, last name, company domain
  • Known company email pattern if available
  • Access to an email verification API (NeverBounce, ZeroBounce, or similar)

Steps

  1. For each row, list the common patterns such as first.last, flast, first, firstl at the company domain.
  2. If a company pattern is already known, rank that format first and demote the rest.
  3. Deduplicate the generated candidates and drop rows with missing name or domain fields.
  4. Send each candidate to the verification API and record the status returned.
  5. Keep the first candidate marked valid per contact and discard the others.
  6. Flag contacts where only catch-all or risky results came back for manual review.
  7. Tally hit rate by pattern so future guesses start with the winning format.

Output

A CSV with one verified email per contact, a status column, and a summary of which patterns won most often.

Phone Number Format Standardizer

Normalize messy phone numbers into E.164 format and flag invalid or unreachable entries.

Requires LLM, Any spreadsheet

Purpose

Convert a column of inconsistent phone numbers into clean E.164 format so dialers and CRMs accept them.

Inputs

  • CSV with raw phone column and a country or region column
  • Default country code for rows missing region data
  • List of country codes you actually sell into

Steps

  1. Read each raw value and strip spaces, dashes, parentheses, and letters.
  2. Detect country from the region column, or apply the default code when region is blank.
  3. Rebuild each number in E.164 form with the leading plus and country code.
  4. Flag entries that are too short, too long, or contain repeated placeholder digits like 000000.
  5. Mark rows outside your sell-into country list as out of scope.
  6. Deduplicate identical normalized numbers and keep the most complete contact row.
  7. Write a status column reading valid, invalid, or out_of_scope.

Output

The original file plus a normalized_phone column, a status column, and a short count summary of valid, invalid, and out of scope rows.

Role Title Seniority Normalizer

Map messy job titles into clean role and seniority buckets for consistent targeting and routing.

Requires Any LLM, Google Sheets

Purpose

Turn inconsistent raw job titles into standardized role and seniority buckets so filtering and routing stay accurate.

Inputs

  • CSV of contacts with raw job title text
  • Your target role buckets, for example Marketing, Sales, RevOps, Finance
  • Your seniority tiers, for example IC, Manager, Director, VP, C-level

Steps

  1. Load the CSV and isolate the raw title column, trimming whitespace and dropping obvious noise like emojis or company names.
  2. For each title, classify it into one role bucket using your provided list, and mark Unknown when no clear match exists.
  3. Assign a seniority tier by scanning for signal words such as Head, Lead, Chief, Senior, and Founder.
  4. Flag ambiguous titles like Partner or Principal that need human review.
  5. Detect non-target titles and tag them for suppression.
  6. Write two new columns, role_bucket and seniority_tier, next to the original title.
  7. Produce a summary count per bucket and a list of Unknown titles.

Output

The enriched CSV plus a bucket distribution table and a review queue of unclassified titles.

Verify Catch-All Domain Risk

Flag catch-all domains in a list and route them to safer verification before sending.

Requires NeverBounce, LLM

Purpose

Identify catch-all domains in an email list so risky addresses get routed to a slower verification path instead of a normal send.

Inputs

  • CSV of contacts with email and company domain
  • Verification results from NeverBounce or similar
  • Your accepted bounce rate threshold

Steps

  1. Run the full list through the verifier and pull the status field for every row.
  2. Group results by domain and count how many addresses on each domain return catch-all or accept-all status.
  3. Flag any domain where the catch-all share crosses your threshold as high risk.
  4. Split the list into three buckets: verified valid, catch-all risk, and hard invalid.
  5. For catch-all rows, tag them to hold for a low-volume test send before full rollout.
  6. Write a short note per risky domain explaining why it was held.

Output

Three labeled CSV segments plus a domain risk summary table showing catch-all percentage and recommended action per domain.

Other skill categories

The full library runs to 120 plays across 11 categories. The rest are here:

Want these run for you rather than by you?

The skills are free because the hard part is not the play, it is knowing which one to run and when. If you would rather someone else ran the whole motion, that is what I do.

Book a call