Now liveThe Skillselion MCP - thousands of ranked skills, loaded into your agent mid-task. No install.Get it →
timescale avatar

Event Lead Enrichment

  • 1 installs
  • 9 repo stars
  • Updated June 11, 2026
  • timescale/marketing-skills

Enriches event booth-scan lead CSVs with Common Room firmographics, scores by ICP fit and conversation heat, flags customers, and outputs a tiered xlsx for SDRs.

About

Enriches post-event lead CSVs against Common Room firmographics and the Tiger Data customer list, scoring leads by ICP fit and conversation heat and producing a tiered xlsx for SDR follow-up. A marketer or SDR uses it to process booth or badge scans after a conference in three checkpointed phases.

  • Three phases: scaffold, enrichment, and multi-day combined rollup
  • Requires Common Room and Tiger Den connectors plus local Python with openpyxl

Event Lead Enrichment by the numbers

  • 1 all-time installs (skills.sh)
  • Ranked #1,983 of 2,715 Automation & Workflows skills by installs in the Skillselion catalog
  • Data as of Aug 5, 2026 (Skillselion catalog sync)
npx skills add https://github.com/timescale/marketing-skills --skill event-lead-enrichment

Add your badge

Show developers this skill is listed on Skillselion. Paste this into your README.

Listed on Skillselion
Installs1
repo stars9
Last updatedJune 11, 2026
Repositorytimescale/marketing-skills

What it does

Enriches event booth-scan lead CSVs with Common Room firmographics, scores by ICP fit and conversation heat, flags customers, and outputs a tiered xlsx for SDRs.

Files

SKILL.mdMarkdownGitHub ↗

Event Lead Enrichment

Enrich post-event lead lists (booth scans, badge scans, form fills) against Common Room firmographics and the Tiger Data customer list. Produces a tiered xlsx ready for SDR follow-up and manual HubSpot import.

The skill runs in three checkpointed phases:

  • Phase A — Scaffold: pre-flight → pull customer list → normalize CSV → dedupe + filter → emit summary for user review
  • Phase B — Enrichment: per-domain CR lookup → merge firmographics → score → produce final xlsx
  • Phase C — Combined rollup: after the last day of a multi-day event, harmonize per-day outputs into a single workbook

When to use this skill

  • User says "enrich [event] Day N leads" + provides a CSV path
  • User asks to process booth-scan leads after a conference/trade show
  • User runs /enrich-event or mentions 'GrafanCON leads', 'Hannover Messe leads', 'booth scan'
  • User asks to build the combined rollup after the last day of an event

Dependencies

  • Required: Tiger Den connector (for rubric + alias map refs), Common Room connector (for firmographic lookups and customer pull)
  • Python runtime: Python 3.10+ with openpyxl installed locally. One-time setup: pip install openpyxl
  • Working directory: defaults to ~/Desktop/claude-cowork-projects/event-runs/<event-slug>/. Pass a different path via the --output argument on the script invocations; the skill infers the working directory from that path's parent.

Step 0: Pre-flight check

Read REFERENCES.md from the plugin root and run the pre-flight check described there. Call list_marketing_references() to verify Tiger Den is reachable. If it fails or the tool is not found, STOP — do not continue. Follow the error handling in REFERENCES.md.

Once Tiger Den is confirmed, fetch this skill's reference docs in one call:

get_marketing_context(slugs: ["event-lead-scoring-rubric", "event-lead-domain-aliases", "cr-customer-pull-runbook"])

Write the Markdown documents to:

  • <working-dir>/<event-slug>/rubric.md
  • <working-dir>/<event-slug>/aliases.md
  • <working-dir>/<event-slug>/customer-pull-runbook.md

Step 1: Confirm event metadata with the user

Ask for (or confirm):

  • Event name (e.g. "GrafanCON 2026")
  • Day number (for multi-day events)
  • Path to the raw lead CSV
  • Companies/email-domains to strip (host/internal — e.g. "Tiger Data,Grafana" for a Grafana-hosted event)

Create the event slug: lowercase, hyphenated, no year-month — e.g. "grafancon-2026".

Step 2: Pull customer list from Common Room

Read <working-dir>/<event-slug>/customer-pull-runbook.md (fetched in Step 0). Follow it end-to-end to:

1. Build the Common Room filter and paginate through all results 2. Classify each org as Current, Previous, or skip 3. Write the result to <working-dir>/<event-slug>/customers.json

The runbook also defines expected counts and the soft-warning threshold for when the customer pull looks incomplete.

Step 3: Run Phase A (scaffold)

Verify the user has Python 3 + openpyxl installed. If not, provide:

pip install openpyxl

Then run:

python3 <plugin-path>/skills/event-lead-enrichment/scripts/build_enriched.py \
  --event "<event name>" \
  --day <day number> \
  --input <path to raw CSV> \
  --output <working-dir>/<event-slug>/<event-slug>-day-<N>.xlsx \
  --customers <working-dir>/<event-slug>/customers.json \
  --rubric <working-dir>/<event-slug>/rubric.md \
  --aliases <working-dir>/<event-slug>/aliases.md \
  --strip-companies "<host/internal companies>" \
  --strip-email-domains "<host/internal domains>" \
  --prior <prior day xlsx files if any> \
  --stop-after scaffold

Read <working-dir>/<event-slug>/phase_a_summary.txt and present it to the user. Ask them to confirm the counts look right before proceeding.

Step 4: Run Phase B (enrichment)

Once the user confirms, iterate through domains in <working-dir>/<event-slug>/<event-slug>-day-<N>.domains.json.

For each domain:

1. Apply the alias map from aliases.md to canonicalize the domain (though the script already does this when writing domains.json; use the map here as a safety net).

2. Query CR Organization:

commonroom_list_objects(
  objectType: "Organization",
  filter: {"type": "and", "clauses": [{"type": "stringFilter", "field": "companyWebsite", "params": {"op": "eq", "value": "<canonical-domain>"}}]},
  properties: ["subIndustry", "about", "employees", "revenueRangeMin", "revenueRangeMax", "leadScores", "tags"],
  limit: 10
)

3. If no hit, fall back to ProspectorCompany:

commonroom_list_objects(
  objectType: "ProspectorCompany",
  filter: {"type": "and", "clauses": [{"type": "stringFilter", "field": "groupWebsite", "params": {"op": "eq", "value": "<canonical-domain>"}}]},
  properties: ["subIndustry", "employees", "revenueRange", "location", "technologies"],
  limit: 10
)

4. Record the result in <working-dir>/<event-slug>/cr_enrichment.json with shape:

{
  "by_domain": {
    "<canonical-domain>": {
      "source": "CR" | "Prospector" | "NONE",
      "primary_domain": "<domain>",
      "name": "<org name>",
      "sub_industry": "...",
      "about": "...",
      "employees": 1200,
      "size_bucket": "1000 - 4999",
      "revenue_range": "$100M-$500M",
      "hq": "City, Country",
      "v1_account_pct": 86,
      "tech_highlights": ["Prometheus", "Kubernetes"]
    }
  }
}

Write incrementally. After each domain lookup, re-write cr_enrichment.json (or append and re-serialize). This ensures rate-limit failures mid-loop are recoverable — a retry picks up from the last recorded state.

5. On CR rate-limit / error: pause, tell user how many domains completed + which failed. Offer (a) retry failed, (b) skip failed with source "NONE", (c) stop.

Once all domains are processed, run Phase B of the script:

python3 <plugin-path>/skills/event-lead-enrichment/scripts/build_enriched.py \
  --event "<event>" \
  --day <N> \
  --input <CSV> \
  --output <working-dir>/<event-slug>/<event-slug>-day-<N>.xlsx \
  --customers <working-dir>/<event-slug>/customers.json \
  --rubric <working-dir>/<event-slug>/rubric.md \
  --aliases <working-dir>/<event-slug>/aliases.md \
  --cr-enrichment <working-dir>/<event-slug>/cr_enrichment.json \
  --strip-companies "..." \
  --strip-email-domains "..." \
  --prior <prior days if any>

This produces the final xlsx with Summary, All Leads, Removed, and subIndustry Diagnostic sheets.

Step 5: Update Tiger Den event record

Search for the event in Tiger Den:

manage_events(action: "search", query: "<event name>")

If found, update its notes field (append-only) with the day's summary:

manage_events(
  action: "update",
  id: "<event-uuid>",
  notes: "<existing notes>\n\nDay <N> enriched YYYY-MM-DD: <X> leads kept, <Y> current customers, <Z> previous, <A> Conversation, <B> Tier A, <C> Tier B, <D> Tier C, <E> Tier D. File: <event-slug>-day-<N>.xlsx"
)

If not found, offer to create the event record. Ask the user for: event_type (conference/meetup/webinar), start_date, end_date, location, website_url. Then:

manage_events(action: "create", name: "<event>", event_type: "...", start_date: "...", end_date: "...", location: "...")

Then update notes as above.

Step 6: Present results to the user

Present a summary of the run:

  • Tier distribution (Conversation / A / B / C / D counts)
  • Heat breakdown (Hot / Warm / Mild for Conversation tier)
  • Customer matches (Current / Previous)
  • SDR status flags (HOT/WARM without notes)
  • Path to the xlsx output
  • Link to the Tiger Den event record

Remind the user the next step is manual HubSpot CSV import (HubSpot direct push is a v2 feature).

Phase C: Combined rollup (invoked separately)

When the user asks to combine days after the last day of the event:

1. List the per-day xlsx files in <working-dir>/<event-slug>/, confirm which to include 2. Re-fetch rubric.md from Tiger Den (the Summary uses the latest policy text) 3. Run:

python3 <plugin-path>/skills/event-lead-enrichment/scripts/build_combined.py \
  --event "<event>" \
  --inputs <working-dir>/<event-slug>/<event-slug>-day-1.xlsx <working-dir>/<event-slug>/<event-slug>-day-2.xlsx ... \
  --rubric <working-dir>/<event-slug>/rubric.md \
  --output <working-dir>/<event-slug>/<event-slug>-combined.xlsx \
  --day-labels "Day 1,Day 2,Day 3"

Present the combined summary (per-day + Total counts across tier/heat/customers/SDR flags) and the xlsx path to the user.

Known gotchas

  • CR filter field name: use companyWebsite for Organization filtering, groupWebsite for ProspectorCompany. primaryWebsite is NOT a filter field. like on domain returns massive false positives (e.g. *erco.com matched 2091 results in a past run) — always use eq.
  • Personal email domains (gmail, gmx, yahoo, etc.) are handled by the script — they never hit CR. For personal-email leads where the Company field is set, the script uses normalized company-name matching against the customer index.
  • CR Organization tech stack: no groupTechStack column exists. Only ProspectorCompany has technologies. Tech_Highlights will be empty for CR-matched rows and populated only for Prospector fallbacks.
  • Product-name HOT keywords (timescale, postgres, tsdb, influx) are noisy at product-adjacent events (GrafanCON, PostgresConf). The rubric keeps them because the false-positive cost is low (SDR reviews Conversation-tier anyway), but flag this in your summary if the user's event is product-adjacent.
  • Customer list gap: if the customer pull warns about a low count, see customer-pull-runbook.md (fetched in Step 0) for expected ranges and remediation steps.

Related skills

This week in AI coding

Five minutes, every Monday - the tools, releases and tactics for developers.

unsubscribe anytime.