The first Clay table a revenue team builds is usually impressive.
It finds accounts, enriches contacts, asks a model to research each company, writes a personalized line, and sends the result somewhere else. A process that used to take days now runs in minutes.
The tenth table is where the problems start.
Nobody remembers which table is production. Two versions enrich the same accounts. A scheduled source keeps adding rows nobody works. An AI column runs before a cheaper eligibility filter. The person who built the workflow leaves, and the workspace becomes an archaeology project funded with recurring credits.
Clay tables are powerful because they make data and workflow logic visible in the same operating surface. They are also easy to overbuild. This guide covers the design choices that make a table useful after the demo.
Start with the grain: What does one row represent?
Every good table has a clear grain. One row represents one thing.
Common grains include:
- One company or account
- One person or contact
- One signal event
- One opportunity
- One account-play combination
- One research or enrichment request
Write the grain in the table description before adding columns. “One row per person at a target account” is clear. “Prospects for Q3” is not.
The grain determines the primary key and prevents duplicates. A company table may use normalized domain plus country. A person table may use LinkedIn URL or a stable provider ID. An account-play table may need account ID plus play ID plus eligibility date.
If a row tries to represent both an account and all of its contacts, the workflow will eventually fight itself. Keep companies and people in separate tables when they have different enrichment, scoring, or activation logic.
Clay’s current Send Table Data feature can route or expand records between tables, while lookup functions can reference shared data such as a suppression list or messaging library. That makes multi-table designs easier, but the architecture still needs a clear direction. Design the flow before connecting tables.
The seven column zones of a production table
Column colors and views are not decoration. They can expose the workflow’s structure.
We recommend organizing a table into seven zones.
1. Source columns
These are the facts that entered with the row:
- CRM account ID
- Domain or LinkedIn URL
- Source system
- Source timestamp
- Campaign, segment, or signal name
- Original owner
Do not overwrite source columns. Preserve the raw input so you can diagnose differences later.
2. Identity columns
Identity columns resolve the row to a trusted entity:
- Normalized domain
- Canonical company name
- CRM match status and ID
- Parent account
- Person match status
- Customer and open-opportunity flags
This work belongs near the beginning. There is little value in paying to enrich or research a row that cannot be matched, is already a customer, or belongs to the wrong segment.
3. Eligibility columns
Eligibility should be cheap, visible, and deterministic wherever possible:
- ICP fit rule
- Territory eligibility
- Suppression status
- Active sequence or recent-touch check
- Required input present
- Ready-to-enrich checkbox
The key pattern is filter before spend. A formula or lookup should eliminate ineligible rows before paid enrichment or AI research runs.
4. Enrichment columns
Enrichment fills the data needed for a decision, not every field available from a provider.
Use provider waterfalls when coverage matters and multiple sources can return the same required field. Clay describes a waterfall as a sequence that queries providers in order and stops when a valid result is found. For email waterfalls, validation can be part of the process.
The order should reflect economics and quality:
- Use data the company already owns.
- Query the lowest-cost acceptable source.
- Validate the result.
- Continue only when the prior source fails or returns an unacceptable value.
Do not confuse more providers with better data. Track which provider returned the winning value, when it was observed, and whether it was validated.
5. Decision columns
These columns turn data into an operational recommendation:
- Fit score and reason
- Signal strength and recency
- Buying-group role
- Recommended play
- Confidence
- Exception reason
- Human-review status
Prefer separate, testable components over one giant AI prompt that returns the entire decision. A deterministic fit check, a research summary, and a final classification are easier to inspect than a single opaque answer.
6. Activation columns
Activation columns control what leaves Clay:
- Destination system
- Action type
- Owner
- Payload-ready status
- Approved-by-human status
- Exported-at timestamp
- Destination record ID
Use a final “ready to export” condition that verifies every required field and suppression rule. Do not let the presence of an email address automatically mean “send.”
7. Audit and outcome columns
A table needs memory:
- Workflow version
- Processed timestamp
- Data-source timestamp
- Error or retry status
- Credit category
- Seller acceptance or rejection
- Meeting and opportunity result
These columns make it possible to answer the two questions that arrive later: “Why did this row do that?” and “Did this workflow create anything useful?”
A practical two-table pattern
Suppose the goal is to find the right people at newly eligible target accounts.
Company table
One row represents one account.
| Zone | Example columns |
|---|---|
| Source | CRM ID, domain, segment, signal, observed date |
| Identity | normalized domain, parent account, CRM match |
| Eligibility | ICP, customer flag, open opportunity, territory |
| Enrichment | employee range, industry, technology, hiring signal |
| Decision | fit reason, account tier, recommended play |
| Activation | send-to-people-table, account owner |
| Audit | processed date, workflow version, exception |
Only accounts that pass eligibility move to the next table.
People table
One row represents one person at an eligible account.
| Zone | Example columns |
|---|---|
| Source | parent account ID, person source, search criteria |
| Identity | LinkedIn URL, CRM contact ID, dedupe key |
| Eligibility | role match, seniority, geography, consent, suppression |
| Enrichment | verified email, phone, current title |
| Decision | buying-group role, contact priority, reason |
| Activation | seller review, CRM upsert, approved destination |
| Audit | provider, validation status, exported date, outcome |
This separation prevents expensive person-level searches from running on accounts that should never have entered the motion.
Test the table without turning testing into spend
Clay’s current guidance recommends running email waterfalls on a small sample first, and its Sandbox mode is designed to let teams test table configurations against selected rows before applying changes to production.
A useful test set contains more than ten perfect rows. Include edge cases:
- A customer that should be suppressed
- A duplicate account
- A subsidiary with a shared domain
- A person who recently changed companies
- A missing required input
- A catch-all email domain
- An account with an open opportunity
- A provider timeout or null result
For each test, write the expected decision before running the table. “Looks reasonable” is not a test. “This row must stop before email enrichment because it is an active customer” is.
Review the table graph when a workflow has many dependent columns. It can reveal that an expensive action is upstream of the filter intended to control it.
Control auto-run before it controls the budget
Auto-run is convenient when the workflow is stable. During development, it can execute a half-finished chain as soon as rows appear.
Before enabling recurring or automatic runs, confirm:
- The source adds only eligible rows or the first filter is free.
- Expensive columns have explicit run conditions.
- Null, retry, and duplicate behavior are understood.
- The output is idempotent and cannot create the same action twice.
- A named owner monitors errors and spend.
- There is a way to stop the schedule quickly.
Clay’s usage reporting now breaks down credit consumption by workbook, table, and integration. Review that report as an operating metric, not only when the invoice surprises someone.
The more useful measure is not credits per row. It is credits per accepted account, qualified meeting, or opportunity—whichever outcome the table exists to support.
Name tables like production assets
“Final_v7_new” is a warning, not a name.
Use a convention that exposes purpose and state:
[Motion] – [Entity] – [Stage] – [Environment]
Examples:
- Inbound – Company – Qualification – PROD
- ABM Tier 1 – Person – Buying Group – PROD
- Expansion – Account – Signal Research – TEST
Add an owner, description, grain, source, destination, schedule, and review date. Tags and folders can add useful organization, but they do not replace the description.
Archive retired tables after confirming that no source, schedule, connection, or downstream table still depends on them.
Permissions and change control matter
Clay supports workspace roles and workbook-level collaboration controls. The exact options depend on the plan, so confirm them for your workspace. The principle is straightforward: the ability to view a workflow does not need to imply permission to edit production logic.
For critical tables:
- Limit editors.
- Use Sandbox mode for changes.
- Review table history or change logs.
- Record why the change was made.
- Test before publishing.
- Keep a rollback path.
Connections deserve the same discipline. Use recognizable connection names, restrict shared credentials, and periodically trace which resources depend on them. An expired API key should not be the first indication that nobody owns the workflow.
Common Clay table failure patterns
One table does everything
Company sourcing, contact discovery, enrichment, messaging, and export accumulate into an unmaintainable grid. Separate tables by entity and major stage.
AI runs before eligibility
The model researches accounts that a free CRM lookup could have excluded. Put cheap rules first.
The primary key is missing
Schedules and imports create duplicates, which trigger duplicate enrichment and outreach. Define and enforce the key early; use dedupe carefully and decide whether the oldest or newest row should win.
Fields have no observed date
Employee count, title, technology, and intent age silently. Store when important data was sourced and define a refresh rule.
“Personalized” output is shipped without judgment
The table generates correct but generic text and sends it at scale. Use AI to assemble evidence and drafts; keep the buyer-facing point of view with a human.
Nobody closes the loop
The table reports rows processed, not recommendations accepted or opportunities created. Bring outcomes back or the workflow cannot improve.
Production-readiness checklist
Before a Clay table runs unattended, answer yes to these questions:
- Is the row grain written in the description?
- Is there a stable dedupe key?
- Are raw inputs preserved?
- Do free eligibility checks run before paid actions?
- Are customers, active opportunities, recent touches, and restricted contacts suppressed?
- Does each paid column have a run condition?
- Are provider source and observed date retained?
- Can every decision be explained from visible columns?
- Is buyer-facing output reviewed appropriately?
- Are exports idempotent?
- Are errors and exceptions routed to an owner?
- Can another operator stop, test, and maintain the table?
- Are credit spend and revenue outcomes reviewed together?
Clay tables are not valuable because they contain many columns. They are valuable when they make a revenue decision faster, more consistent, and easier to audit.
That is also why a good Clay operator increasingly looks like a GTM engineer. The work is not spreadsheet administration. It is system design performed in a grid.
For the broader architecture around these tables, see How GTM Engineers Build Modern Revenue Systems. For the platform-selection question, see Clay or 6sense: Understanding the Difference.
Build the smallest table that completes the decision loop. Make the logic visible. Put the expensive columns late. Capture the outcome.
Then let it run.