GTM Engineering skill 02 of 13
Clay Table Design SKILL.md
The Clay Table Design skill makes Claude Code or another AI agent design GTM tables that are cheap, fast and easy to debug. It writes a table spec, gives each table one job, orders columns in stages from input and free qualification to paid enrichment, scoring, signals, AI copy, QA and output, adds run conditions to every paid column, sets naming conventions and tests on a small sample first.
clay-table-design/SKILL.md, version 1.0.0, 1,528 words.
By Afeez Adebayo, Marketing, SEO & Growth Expert with 10+ years of experience.
Created 10 October 2026. Updated 10 October 2026. Free to use under CC BY 4.0.
Clay tables become hard to run when they grow without design: dozens of columns in no particular order, enrichment that runs on every row even when the row will be filtered out later, AI columns that fire before their inputs exist, hidden dependencies, and no way to tell which columns cost credits. The same patterns appear in any table-based GTM tool. A well-designed table is cheaper, faster, easier to debug and reusable by the next person.
This skill designs GTM tables for Clay or similar tools: a clear purpose and spec, a staged column layout (input, qualify, enrich, score, write, QA, output), filters and run conditions that stop paid steps on rows that will not qualify, naming conventions, dependency order, error handling, templates for reuse and a test plan on a small sample before full runs.
Operating principles
- One table, one job. A table builds a list, enriches it or writes copy, not everything at once.
- Qualify before you pay. Cheap checks and filters run before expensive enrichment and AI.
- Left to right is the order of work. Columns follow the flow of data.
- Every paid column has a run condition. It only runs when its inputs exist and the row still qualifies.
- Test small, then scale. Run 20 to 50 rows, check, then run the rest.
Table stages
| Stage | Columns | Notes |
|---|---|---|
| 1. Input | Source data: company, domain, LinkedIn URL, list source | Normalise domains on entry |
| 2. Qualify (cheap) | Firmographic checks, exclusion lookups, country and size filters | Free or low-cost; drop non-ICP rows early |
| 3. Enrich (paid) | Contacts, emails, phone, technographics | Waterfalls with run conditions |
| 4. Score | Fit and intent score, tier | Formula columns |
| 5. Signals | Hiring, funding, tech changes, news | Only for qualified tiers |
| 6. Write | AI copy columns | Only for rows ready to send |
| 7. QA | Validation formulas, flags | Before any export |
| 8. Output | CRM push, sequencer push, export | Only rows that pass QA |
Naming conventions
- Tables:
<team>-<purpose>-<segment>-<yyyy-mm>, for examplesales-outbound-fintech-uk-2026-10. - Columns: prefix by stage, such as
in_domain,q_country_ok,en_email,sc_tier,sig_hiring,ai_opener,qa_status,out_crm_id. - Booleans start with
is_orhas_; scores end with_score.
When to use, and when not to
Use it when building a new table, rebuilding a messy one, turning a one-off table into a template, or before scaling a workflow to many rows.
Don't use it to choose providers (enrichment-waterfalls) or write prompts (ai-copy-columns), though the table must leave room for both.
Inputs
- Purpose of the table and the output it must produce.
- The spec or ICP rules (see
gtm-workflow-qafor spec format). - Data sources and providers available.
- Expected volume and credit budget.
- Where the output goes (CRM, sequencer, export).
Raw SKILL.md file
This is the exact file agents read, including the credit header and licence notice. Save it as clay-table-design/SKILL.md.
--- name: clay-table-design description: "Design Clay and similar GTM tables that are cheap, fast and debuggable: a table spec, one job per table, staged columns from input and cheap qualification to paid enrichment, scoring, signals, AI copy, QA and output, run conditions on every paid column, naming conventions, dependency order, sample tests and reusable templates. Use whenever someone builds or rebuilds a Clay table, wants to cut credits per row, fix a messy workflow, add run conditions, structure an outbound or enrichment table or turn a table into a reusable template." license: CC-BY-4.0 metadata: author: Afeez Adebayo author_url: https://afeezadebayo.com author_linkedin: https://www.linkedin.com/in/afeez-adebayo/ author_x: https://x.com/za_icon source: https://afeezadebayo.com/skills-md/marketing/gtm-engineering/clay-table-design/ category: marketing subcategory: gtm-engineering version: "1.0.0" created: "2026-10-10" updated: "2026-10-13" --- # Clay Table Design Clay tables become hard to run when they grow without design: dozens of columns in no particular order, enrichment that runs on every row even when the row will be filtered out later, AI columns that fire before their inputs exist, hidden dependencies, and no way to tell which columns cost credits. The same patterns appear in any table-based GTM tool. A well-designed table is cheaper, faster, easier to debug and reusable by the next person. This skill designs GTM tables for Clay or similar tools: a clear purpose and spec, a staged column layout (input, qualify, enrich, score, write, QA, output), filters and run conditions that stop paid steps on rows that will not qualify, naming conventions, dependency order, error handling, templates for reuse and a test plan on a small sample before full runs. ## Operating principles 1. **One table, one job.** A table builds a list, enriches it or writes copy, not everything at once. 2. **Qualify before you pay.** Cheap checks and filters run before expensive enrichment and AI. 3. **Left to right is the order of work.** Columns follow the flow of data. 4. **Every paid column has a run condition.** It only runs when its inputs exist and the row still qualifies. 5. **Test small, then scale.** Run 20 to 50 rows, check, then run the rest. ## Table stages | Stage | Columns | Notes | |---|---|---| | 1. Input | Source data: company, domain, LinkedIn URL, list source | Normalise domains on entry | | 2. Qualify (cheap) | Firmographic checks, exclusion lookups, country and size filters | Free or low-cost; drop non-ICP rows early | | 3. Enrich (paid) | Contacts, emails, phone, technographics | Waterfalls with run conditions | | 4. Score | Fit and intent score, tier | Formula columns | | 5. Signals | Hiring, funding, tech changes, news | Only for qualified tiers | | 6. Write | AI copy columns | Only for rows ready to send | | 7. QA | Validation formulas, flags | Before any export | | 8. Output | CRM push, sequencer push, export | Only rows that pass QA | ## Naming conventions - Tables: `<team>-<purpose>-<segment>-<yyyy-mm>`, for example `sales-outbound-fintech-uk-2026-10`. - Columns: prefix by stage, such as `in_domain`, `q_country_ok`, `en_email`, `sc_tier`, `sig_hiring`, `ai_opener`, `qa_status`, `out_crm_id`. - Booleans start with `is_` or `has_`; scores end with `_score`. ## When to use, and when not to Use it when building a new table, rebuilding a messy one, turning a one-off table into a template, or before scaling a workflow to many rows. Don't use it to choose providers (`enrichment-waterfalls`) or write prompts (`ai-copy-columns`), though the table must leave room for both. ## Inputs - Purpose of the table and the output it must produce. - The spec or ICP rules (see `gtm-workflow-qa` for spec format). - Data sources and providers available. - Expected volume and credit budget. - Where the output goes (CRM, sequencer, export). ## Workflow ### Step 1. Write the table spec Purpose, input source, output, volume, owner, ICP and exclusion rules, fields required at the end, budget. ### Step 2. Design the column plan List columns in stage order with type (input, formula, enrichment, AI, integration), cost and run condition. ### Step 3. Add cheap qualification first Country, employee range, industry, exclusion lookups against customers and competitors, domain validity. ### Step 4. Gate every paid step Run conditions such as "only if `q_icp_ok` is true and `en_email` is empty". Never let enrichment or AI run on rows that will be filtered out. ### Step 5. Order dependencies A column that needs another column's output sits to its right and only runs when that value exists. ### Step 6. Handle errors Fallback values, error flags and a `qa_status` column that records why a row failed. ### Step 7. Test on a sample Run 20 to 50 representative rows across segments; check outputs, costs and errors; fix; repeat. ### Step 8. Scale and monitor Run the full table in batches; watch credits, error rates and match rates. ### Step 9. Save as a template Document purpose, columns and run conditions so the table can be duplicated for new segments. ## Column plan template ``` | # | Column | Stage | Type | Inputs | Run condition | Est. cost per row | | 1 | in_domain | Input | Import | - | - | 0 | | 2 | q_employees_ok | Qualify | Formula | employees | always | 0 | | 3 | q_not_customer | Qualify | Lookup | in_domain | always | 0 | | 4 | en_contacts | Enrich | Provider | in_domain | q_employees_ok AND q_not_customer | 1 credit | | 5 | en_email | Enrich | Waterfall | name, domain | en_contacts found | 1 to 3 credits | | 6 | sc_tier | Score | Formula | firmographics, signals | always | 0 | | 7 | ai_opener | Write | AI | signals, role | sc_tier in [A,B] AND en_email valid | AI cost | | 8 | qa_status | QA | Formula | all required | always | 0 | | 9 | out_crm | Output | Integration | all | qa_status = pass | 0 | ``` ## Run condition patterns | Pattern | Purpose | |---|---| | Only if input exists | Avoid errors and wasted credits | | Only if previous step found nothing | Waterfall logic | | Only if qualified tier | Spend on the best rows | | Only if not already in CRM | Avoid duplicates | | Only if QA passed | Protect the CRM and sequencer | ## Debugging a table When outputs look wrong, filter rows by `qa_status`, check the first column where values go missing, compare a failing row with a passing one and look at run conditions and input formats. Most problems come from a dependency running too early, an unexpected input format or a provider returning a different field name. ## Edge cases and judgement calls | Situation | What to do | |---|---| | Very large lists | Split by segment into several tables; run in batches | | Shared workspace | Folders and naming by team; one owner per table | | Inherited messy table | Duplicate, rebuild with stages, compare outputs, then archive the old one | | Columns hidden by others | Document hidden columns in the spec | | Real-time triggers | Separate trigger tables from bulk list tables | | Tool limits on rows or runs | Batch and archive processed rows | ## Handoffs to related skills - Audit first: `gtm-engineering-audit` - Provider order: `enrichment-waterfalls` - Scoring formulas: `icp-account-scoring` - AI columns: `ai-copy-columns` - Cleaning: `data-deduplication-normalisation` - Pre-launch checks: `gtm-workflow-qa` - Costs: `gtm-cost-control` - Documentation: `gtm-workflow-documentation` ## Worked example A team's outbound table had 74 columns, enriched every imported company and ran an AI opener on every row, using about 9 credits per row even though only a third qualified. The redesign split it into a list-building table and an outreach table, added free qualification filters first, put run conditions on every paid column, moved AI copy to the end for tier A and B rows only and added a QA status column. After a 40-row test and two fixes, the full run used about 3.5 credits per row and produced the same number of qualified contacts. ## Common mistakes - Enriching rows before qualifying them. - AI columns that run before their inputs exist. - No naming convention, so nobody can follow the table. - Running thousands of rows without a sample test. - One giant table doing every job. ## Output format ``` 1. Table spec 2. Column plan with stages, types, run conditions and costs 3. Naming conventions 4. Test plan and results 5. Template notes for reuse ``` ## Self-check before you answer - Do cheap qualification steps run before paid ones? - Does every paid column have a run condition? - Are dependencies ordered left to right? - Was a small sample tested before the full run? --- Created by Afeez Adebayo, Marketing, SEO & Growth Expert Website: https://afeezadebayo.com LinkedIn: https://www.linkedin.com/in/afeez-adebayo/ X: https://x.com/za_icon Source: https://afeezadebayo.com/skills-md/marketing/gtm-engineering/clay-table-design/ Licence: CC BY 4.0 (https://creativecommons.org/licenses/by/4.0/). You may copy, share and adapt this skill, including for commercial use, as long as you credit Afeez Adebayo and link to the source URL above. Keep this notice in any copy or adapted version.
Workflow
Step 1. Write the table spec
Purpose, input source, output, volume, owner, ICP and exclusion rules, fields required at the end, budget.
Step 2. Design the column plan
List columns in stage order with type (input, formula, enrichment, AI, integration), cost and run condition.
Step 3. Add cheap qualification first
Country, employee range, industry, exclusion lookups against customers and competitors, domain validity.
Step 4. Gate every paid step
Run conditions such as "only if q_icp_ok is true and en_email is empty". Never let enrichment or AI run on rows that will be filtered out.
Step 5. Order dependencies
A column that needs another column's output sits to its right and only runs when that value exists.
Step 6. Handle errors
Fallback values, error flags and a qa_status column that records why a row failed.
Step 7. Test on a sample
Run 20 to 50 representative rows across segments; check outputs, costs and errors; fix; repeat.
Step 8. Scale and monitor
Run the full table in batches; watch credits, error rates and match rates.
Step 9. Save as a template
Document purpose, columns and run conditions so the table can be duplicated for new segments.
Column plan template
| # | Column | Stage | Type | Inputs | Run condition | Est. cost per row |
| 1 | in_domain | Input | Import | - | - | 0 |
| 2 | q_employees_ok | Qualify | Formula | employees | always | 0 |
| 3 | q_not_customer | Qualify | Lookup | in_domain | always | 0 |
| 4 | en_contacts | Enrich | Provider | in_domain | q_employees_ok AND q_not_customer | 1 credit |
| 5 | en_email | Enrich | Waterfall | name, domain | en_contacts found | 1 to 3 credits |
| 6 | sc_tier | Score | Formula | firmographics, signals | always | 0 |
| 7 | ai_opener | Write | AI | signals, role | sc_tier in [A,B] AND en_email valid | AI cost |
| 8 | qa_status | QA | Formula | all required | always | 0 |
| 9 | out_crm | Output | Integration | all | qa_status = pass | 0 |Run condition patterns
| Pattern | Purpose |
|---|---|
| Only if input exists | Avoid errors and wasted credits |
| Only if previous step found nothing | Waterfall logic |
| Only if qualified tier | Spend on the best rows |
| Only if not already in CRM | Avoid duplicates |
| Only if QA passed | Protect the CRM and sequencer |
Debugging a table
When outputs look wrong, filter rows by qa_status, check the first column where values go missing, compare a failing row with a passing one and look at run conditions and input formats. Most problems come from a dependency running too early, an unexpected input format or a provider returning a different field name.
Edge cases and judgement calls
| Situation | What to do |
|---|---|
| Very large lists | Split by segment into several tables; run in batches |
| Shared workspace | Folders and naming by team; one owner per table |
| Inherited messy table | Duplicate, rebuild with stages, compare outputs, then archive the old one |
| Columns hidden by others | Document hidden columns in the spec |
| Real-time triggers | Separate trigger tables from bulk list tables |
| Tool limits on rows or runs | Batch and archive processed rows |
Handoffs to related skills
- Audit first:
gtm-engineering-audit - Provider order:
enrichment-waterfalls - Scoring formulas:
icp-account-scoring - AI columns:
ai-copy-columns - Cleaning:
data-deduplication-normalisation - Pre-launch checks:
gtm-workflow-qa - Costs:
gtm-cost-control - Documentation:
gtm-workflow-documentation
Worked example
A team's outbound table had 74 columns, enriched every imported company and ran an AI opener on every row, using about 9 credits per row even though only a third qualified. The redesign split it into a list-building table and an outreach table, added free qualification filters first, put run conditions on every paid column, moved AI copy to the end for tier A and B rows only and added a QA status column. After a 40-row test and two fixes, the full run used about 3.5 credits per row and produced the same number of qualified contacts.
Common mistakes
- Enriching rows before qualifying them.
- AI columns that run before their inputs exist.
- No naming convention, so nobody can follow the table.
- Running thousands of rows without a sample test.
- One giant table doing every job.
Output format
1. Table spec
2. Column plan with stages, types, run conditions and costs
3. Naming conventions
4. Test plan and results
5. Template notes for reuseSelf-check before you answer
- Do cheap qualification steps run before paid ones?
- Does every paid column have a run condition?
- Are dependencies ordered left to right?
- Was a small sample tested before the full run?
On this page
- When to use this skill, and when not to
- Example prompts
- Example output
- What the agent needs from you
- How this skill hands off to related skills
- How to run Clay Table Design step by step
- Situations this skill handles
- What makes this skill different
- Practical tips from real projects
- Frequently asked questions
- Changelog
When to use this skill, and when not to
Use it when building a new Clay table, rebuilding a messy one, cutting credits per row or turning a table into a reusable template.
Tables grow without design: dozens of columns, enrichment on rows that will be filtered out, AI columns firing before inputs exist and no way to see which columns cost credits.
For provider order, use Enrichment Waterfalls.
Example prompts
- “Design a Clay table for fintech outbound.”
- “Cut the credits this table uses per row.”
- “Add run conditions to every paid column.”
- “Rebuild this 74-column table cleanly.”
- “Turn this table into a template.”
Example output
The skill returns a fixed structure. A shortened example for an imaginary site:
Spec: purpose, input, output, volume, budget, owner Stages: input, qualify, enrich, score, signals, write, QA, output Run conditions: on every paid column Naming: in_, q_, en_, sc_, sig_, ai_, qa_, out_ Test: 40 rows, 2 fixes Result: 9 to 3.5 credits per row, same qualified output
Cheap qualification always runs before paid enrichment and AI, so credits are spent only on rows that can convert.
What the agent needs from you
The skill asks for the table's purpose and output, the spec or ICP rules, providers available, expected volume and credit budget and where the output goes.
How this skill hands off to related skills
Clay Table Design connects to the GTM Engineering Audit, Enrichment Waterfalls, AI Copy Columns, GTM Workflow QA and GTM Cost Control.
How to run Clay Table Design step by step
- Install the skill as
clay-table-design/SKILL.md. - Write the table spec.
- Plan columns by stage.
- Gate every paid column.
- Test on a sample.
- Save as a template.
Situations this skill handles
Clay Table Design handles these situations:
| Situation | What the skill does |
|---|---|
| Very large lists | Split by segment, batch runs |
| Shared workspace | Folders and owners |
| Messy inherited table | Rebuild, compare, archive |
| Hidden columns | Documented in spec |
| Real-time triggers | Separate trigger tables |
| Row limits | Batch and archive |
What makes this skill different
Most Clay tables are built column by column as ideas arrive. This skill designs the table first, so every paid step has a reason and a gate, and the next person can follow it.
Practical tips from real projects
- One table, one job.
- Qualify before you pay.
- Left to right is the order of work.
- Test small, then scale.
A worked example: an outbound table had 74 columns, enriched every imported company and ran an AI opener on every row, using about nine credits per row though only a third qualified. The redesign split it into a list-building table and an outreach table, added free qualification first, gated every paid column, moved AI copy to the end for tiers A and B and added a QA status column. After a 40-row test and two fixes, the full run used about 3.5 credits per row with the same number of qualified contacts.
The column plan lists each column with its stage, type, inputs, run condition and estimated cost per row, for example a free employee-range check, a customer exclusion lookup, a contact search that runs only on qualified rows, an email waterfall that runs only when contacts are found, a tier formula, an AI opener for tiers A and B with valid emails, a QA status and a CRM push that runs only on passes. Run condition patterns cover inputs existing, previous steps finding nothing, qualified tiers only, records not already in the CRM and QA passed.
Naming keeps tables readable: tables follow team, purpose, segment and month, columns carry stage prefixes, booleans start with is or has and scores end with score. Debugging starts by filtering rows by QA status, finding the first column where values go missing, comparing a failing row with a passing one and checking run conditions and input formats, since most problems come from a dependency running too early or a provider returning an unexpected format.
Very large lists are split by segment and run in batches; shared workspaces use folders, naming and one owner per table; inherited tables are duplicated, rebuilt with stages, compared and then archived; and real-time triggers live in separate tables from bulk lists. Common mistakes are enriching before qualifying, AI columns running before their inputs, no naming convention, full runs without a sample test and one giant table doing every job.
The workflow writes the table spec with purpose, input source, output, volume, owner, ICP and exclusion rules, required fields and budget; designs the column plan in stage order; adds cheap qualification such as country, employee range, industry, customer and competitor exclusions and domain validity; gates every paid step; orders dependencies so a column that needs another sits to its right; adds fallbacks, error flags and a QA status column; tests on a representative sample across segments; scales in batches while watching credits, error rates and match rates; and saves the result as a documented template for new segments.
The output is a table spec, a column plan with stages, types, run conditions and costs, naming conventions, a test plan with results and template notes for reuse. The final check confirms cheap steps run before paid ones, every paid column has a run condition, dependencies run left to right and a sample was tested before the full run.
Well-designed tables are also easier to hand over. A new owner can read the spec, follow the stages left to right and see why each paid column runs, which cuts onboarding time and reduces the risk of breaking a live workflow while making changes.
It also makes costs predictable before each run starts.
Frequently asked questions
How should a Clay table be structured?
In stages: input, cheap qualification, paid enrichment, scoring, signals, AI copy, QA and output, left to right.
How do I reduce Clay credits per row?
Qualify with free checks first and add run conditions so paid columns only run on qualified rows with inputs present.
What are run conditions?
Rules that decide when a column runs, such as only if the row qualifies and the email is still empty.
Should one table do everything?
No. Separate list building, enrichment and outreach tables are easier to run and debug.
How many rows should I test?
Twenty to fifty representative rows before running the full table.
How should columns be named?
With stage prefixes such as in_, q_, en_, sc_, ai_, qa_ and out_.
Changelog
- 1.0.0, 10 October 2026: first release.
Use, adapt and share this skill under CC BY 4.0: credit Afeez Adebayo and link to this page.
