Outbound — Clay Workbook Schema
The hub describes the table; Clay holds the rows. This page is the structure — tables, columns, dedupe rules, and how a tool signal routes to an angle. The live list (companies, contacts, emails, statuses) lives in Clay only — it's PII, it changes daily, and a repo is the wrong place for an operational dataset. Treat this doc as the standard every new source plugs into.
We're at 330 accounts today, all sourced from Pendo. As WalkMe, Whatfix, and Appcues come in, that grows toward ~1,000. The whole point of this schema is that growth adds tags to existing rows, not new tabs — so the list never collapses into duplicates.
The shape: one workbook, two tables, views — not tabs
A workbook per tool (Pendo, then WalkMe, then Appcues) is the trap. The moment one company runs two DAPs — and many do — you get duplicate rows, duplicate Apollo pushes, and no way to see "are we already working this account." So:
| Rule | Why |
|---|---|
| One workbook | Tables can only look up each other inside the same workbook. The People → Companies link is the whole system. |
| Two tables — Companies + People | Companies is the deduped master. People links to it. |
| Views, not tabs | "EU · Growth PM · WalkMe" is a saved filter, not a new sheet. The persona "tabs" we have today become persona views. |
| Source is an attribute, not a location | A new DAP is a value in a column, not a new workbook. That's what lets 330 → 1,000 stay clean. |
When to split a second workbook: only on volume (Clay slows past tens of thousands of rows). At 1,000 we're nowhere near it — and if we ever split, we'd split by region (US / EU), never by tool, because tools overlap and region doesn't.
Table 1 — Companies (master, deduped on domain)
| Column | Type | Notes |
|---|---|---|
domain |
text (formula) | The dedupe key. Normalize first: lowercase, strip https://, www., trailing /. Everything keys off this. |
company |
text | Display name. |
tools_detected |
multi-select | Pendo / WalkMe / Whatfix / Appcues. Append on re-import, never overwrite — a company on two DAPs carries both. |
region |
select | US / EU. A column, not a workbook. Gates GDPR + send timing. |
signal_source |
text | Which pull first sourced them (provenance). |
second_signal |
select | hiring-for-AI · recent AI launch · RB2B warm visit. DAP alone is necessary, not sufficient. |
wedge |
select | ai-first-growth / ai-onboarding / ai-native — which play the account routes to. |
account_status |
select | sourced → held → enriched → in-sequence → replied → expanding. The "are we already on this logo" field. |
observation_ready |
checkbox | The hold gate. No sharp observation = unchecked = does not flow to Apollo. |
Table 2 — People (linked to Companies by domain)
| Column | Type | Notes |
|---|---|---|
email |
text | Contact dedupe key. |
linkedin_url |
text | For the founder-led presence step. |
company_domain |
lookup → Companies | The join. Keeps People deduped against the master, not re-enriched per source. |
persona |
select | PM / Growth PM / CTO / VP Eng / VP Product / CPO / CX leader / AI Engineer. A column, not a tab. |
angle |
select | The matrix angle led with — defaults off wedge, override per contact. |
role_in_deal |
select | champion / expansion (Product · CTO). Drives land vs. expand. |
sequence_id |
text | Apollo join key — how status comes back. |
status |
select | pushed → in-sequence → replied → meeting → bounced. Synced back from Apollo. |
Views (saved filters — these replace the persona tabs)
EU · Growth PM · WalkMe→ the exact Apollo push listaccount_status = in-sequence→ collision check before any new pushobservation_ready = false→ the writer's queue (accounts on hold)role_in_deal = expansion→ the multi-thread-to-Product/CTO list
Routing: the tool tag is a targeting signal
The reason tools_detected earns a column: the DAP a company runs tells the writer which wedge and angle to lead with, and hands them the "why now."
| Tool detected | Default wedge | Default angle | The "why now" it gives you |
|---|---|---|---|
| Pendo / WalkMe / Whatfix / Appcues | AI-First Growth / PLG | AI-First Growth | "You're paying the Click Tax in cash for a DAP." |
| (any DAP) + hiring-for-AI | AI-Native | AI-Native interface layer | "Paying the Click Tax and staffing to fix it" → expansion-ready. |
The one rule to hold
Normalized domain is the dedupe key everywhere — the Companies master, the People lookup, and the Apollo push filter. Add the domain-normalization formula column first, before any import runs. If domains aren't clean, dedupe collapses and 1,000 rows become 1,000 duplicates.
The flow (Clay → Apollo → back)
- Source. Pull a DAP's accounts (WalkMe, then Appcues, …) into the Companies table, upserting on
domainand appending totools_detected. Same row, new tag. - Qualify. Stack a
second_signal; enrich People; setwedge+angle. If Clay can't hand the writer a sharp observation, leaveobservation_readyunchecked — the account holds. - Push. Build the Apollo list from a view (
observation_ready = true+ region + persona), carryingpersona,angle,sequence_id. - Send. Apollo runs the sequence.
- Sync back. Apollo reply/meeting status writes to People
statusand rolls up toaccount_status— so Clay stays the one place that answers "where does this account stand."
System of record: Clay (today). Status comes home to Clay because HubSpot isn't in this loop yet. Note: the Tooling playbook still names HubSpot the system of record — reconciling that with current practice is pending owner sign-off.
Companion: Outbound — Tooling · Outbound — Measurement. Plays: Outreach Plays overview. Messaging/ICP canon: positioning/gtm-messaging-matrix.md.