Enriched ... attributes.
Only when the first provider misses does the run fall through to a second, pricier provider. So you pay for the expensive lookup only on the records the cheap one could not fill.
Prerequisites
- A workspace plan that includes the new Workflows engine. Pro is recommended for the Send HTTP request volume a waterfall generates. Plan allowances live on Credits & pricing explained.
- Two enrichment providers with REST APIs, ordered cheapest first. For example, a domain-cheap provider as provider A and a richer provider as provider B. You need an API key for each, stored as a workspace secret.
- The Companies object with a populated
domainattribute to use as the lookup key. - Dedicated source attributes that no human edits directly:
Enriched industry,Enriched employee count, andEnriched source. The last is a text or select attribute that records which provider filled the row. - An optional
Industry verifiedcheckbox, or any human-owned attribute, so the Filter can skip records a teammate has already confirmed.
How it works
The workflow runs from the cheapest provider to the priciest. It stops the moment it has the data. It writes results only into fields humans never touch. The Filter is free, so gating costs nothing. Gating means checking a record and deciding whether the run should continue. You pay one credit per HTTP call you actually make, plus one credit for the single write at the end. A record that the cheap provider fills costs 2 credits and never touches provider B.- Record created on Companies fires for each new company.
- Filter continues only when
Enriched industryis empty andIndustry verifiedis unchecked. - Send HTTP request calls provider A with the company
domain. - Parse JSON extracts
industryandemployee_countfrom provider A’s response. - If checks whether provider A returned an industry. When it did, the run jumps straight to the write.
- Send HTTP request calls provider B with the same
domain, on the miss branch only. - Parse JSON extracts the same two fields from provider B’s response.
- Update record writes the winning values into
Enriched industry,Enriched employee count, andEnriched source.
Build steps
1
Add the Record created trigger
Create a new workflow and add the Record created trigger. Set its object to Companies so the workflow fires once per new company. You can also enrich on demand from a record’s actions menu. To do that, swap in a Record command trigger. The rest of the build is identical.
2
Gate on the free Filter
Add a Filter block immediately after the trigger. Set it to continue only for records worth enriching. That means the target field is empty and no human has verified it. The Filter is free, so this gate costs nothing and protects every paid step after it.
3
Call provider A, the cheapest
Add a Send HTTP request block. Point it at your cheapest provider and pass the company
domain from the trigger. Pick a provider endpoint that responds within the 2-minute HTTP timeout. Respect that provider’s rate limits too, so a burst of new companies does not trip a 429.4
Parse provider A's response
Add a Parse JSON block and feed it the response body from the provider A call. Parsing JSON reads the provider’s raw response and turns it into named fields. Define a schema for the two fields you care about so later blocks can reference them by name.
5
Stop on the first hit
Add an If condition. When provider A returned an industry, route to the write step and skip provider B entirely. When the industry is empty, fall through to the next provider. The condition itself is free. Stopping early is what makes this a waterfall rather than two full lookups every time.
6
Call provider B, richer, on the miss branch
On the false branch only, add a second Send HTTP request block. Point it at your richer, pricier provider, and again pass
domain. This call sits behind the If condition. So you pay provider B, and spend the credit, only on records provider A could not fill.7
Parse provider B's response
Add a Parse JSON block for provider B’s body and map its shape to the same two fields. Provider B may name them differently. In the schema, map
sector to industry and headcount to employee_count.8
Write only to source fields
Add an Update record block targeting the triggering company. Write the winning values into your dedicated
Enriched ... attributes only. Never write into the human-owned Industry or Employees attributes. Set Enriched source to the provider that won, so you can audit coverage later.Variable mapping
Credit cost worked example
The Filter, Parse JSON, and If blocks are free logic and lookups, so they never consume credits. You pay 1 credit per Send HTTP request you actually fire, plus 1 credit for the single Update record write. The whole point of the waterfall is that most runs never reach provider B. Three paths cost three different amounts. A run where the cheap provider hits fires one HTTP call to provider A plus one write, so it costs 2 credits. A run where provider A misses and provider B hits fires two HTTP calls plus one write, so it costs 3 credits. A run that the Filter stops at the gate fires nothing and costs 0 credits. Now work an example. Assume 800 new companies a month, a 70% hit rate on provider A, and a 10% Filter skip rate. That breaks down into three groups:- 80 skipped runs at 0 credits.
- 504 runs that stop on provider A at 2 credits each, for 1,008 credits.
- 216 runs that fall through to provider B at 3 credits each, for 648 credits.
Test plan
- In the workflow editor, open the test panel. Pick a real Companies record that has a
domainbut an emptyEnriched industry, for exampleacme.com. Fire a test run. - Confirm the Filter shows continue in run history. It should pass because both conditions are true.
- Confirm the provider A Send HTTP request returns a
200and a body, and that Parse JSON populates{{step_4.industry}}withSoftware. - Confirm the If routed straight to Update record and that provider B never ran. Open the company and verify
Enriched industry,Enriched employee count, andEnriched sourceare set, while the humanIndustryattribute is untouched. - Test the miss branch. Pick a company whose domain provider A does not cover, such as a stealth or very new company. Confirm the run falls through to provider B and the write still lands.
- Run a deliberately failing input. Fire the workflow on a company whose
Industry verifiedcheckbox is already ticked. The Filter stops the run at the gate, no HTTP call fires, no credits are spent, and run history shows the run ending at the Filter. This proves the waterfall never overwrites verified data. - Read each block’s output in the run viewer under run history. Confirm credits were charged only for the steps that actually executed.
Failure modes
Variations
Three-tier waterfall
Add a third provider for the records the first two both miss. Duplicate the If, Send HTTP request, and Parse JSON trio on the second miss branch, ordered cheapest to priciest. The economics still hold. Each tier runs only on what the tier above could not fill. A record that the first provider covers still costs 2 credits.Command trigger instead of create
Swap the Record created trigger for a Record command. Now a rep enriches a single company on demand from its actions menu. This avoids spending credits on bulk imports you do not care about. It also lets you re-run the waterfall after a company changes domains. Everything from the Filter down stays the same.See also
- Webhook lead intake with safe upsert
- Variables & data passing
- Send HTTP request
- Parse JSON
- Credits & pricing explained
Source: Attio Workflows block library. Last reviewed against the Attio Help Center, June 2026.