Nightly target accounts refresh from Crustdata to Airtable
Keep every account on your watchlist current. Headcount, funding, and industry sync from Crustdata to Airtable every night, with a Slack recap each morning.
Build a deterministic nightly data sync workflow that keeps an Airtable Target Accounts table in sync with current Crustdata firmographics. The workflow runs on a cron trigger every night at 2am local time. Every step is a known node, no LLM reasoning is required.
Step 1. Read every record from the Airtable Target Accounts table using Airtable List Records, paginating through the full table via the offset cursor until exhausted. Each row already has a company domain field and an Airtable record ID. Skip rows with an empty domain.
Step 2. Chunk the collected domains into groups of 25 (Crustdata Enrich Company accepts up to 25 comma-separated company_domain values per request). For each chunk, call Crustdata Enrich Company with fields=headcount,headcount_change_last_90_days,funding_and_investment,largest_headcount_country,industry,decision_makers. Run these chunk calls strictly sequentially, never in parallel: Crustdata enforces a leaky-bucket rate limit that trips fast on parallel fan-out. Add a small delay between chunks if needed. Track which domains return a match and which return no result.
Step 3. For every domain that matched, build an Airtable update payload keyed on the original record ID with the refreshed values: headcount, headcount_change_last_90_days, funding_stage (from funding_and_investment.last_funding_round_type), last_funding_date (from funding_and_investment.last_funding_round_date), largest_headcount_country, industry, and decision_makers_count (length of the decision_makers array). Before writing, compare the new headcount to the previous value already stored in Airtable and capture how many records moved by more than 10 percent in either direction. Send the updates back via Airtable Update Multiple Records in batches of 10, matched on Airtable record ID. Do not use upsert; these are existing rows.
Step 4. For every domain that returned no match (Crustdata 404 or empty response), call Airtable Update Record on that single row to tick a needs_review checkbox field to true. Do not overwrite any existing data on those rows.
Step 5. After all updates are written, post one Slack message to the configured ops channel using Slack Send a Message. The message should be one line in this format: "Account refresh complete: {refreshed_count} refreshed, {big_change_count} with headcount change over 10 percent, {failed_count} failed lookup." The team uses this single line to confirm the sync ran cleanly.
Inputs the workflow needs to be configurable: the Airtable base ID, the Target Accounts table ID, the names of the domain field, the record ID source, the needs_review checkbox field, and each refreshed column; the Crustdata API key; the Slack channel ID; and the headcount change threshold (default 10 percent).
This is a pure data sync pattern with discrete deterministic nodes: read, batch, enrich, write, flag, notify. Do not introduce an LLM step. Do not parallelize the Crustdata calls. Keep the failure flow strict: a single batch failure should not abort the whole run, it should just record those domains as failed and continue.
Additional information
What does this prompt do?
- Reads every account in your Airtable target accounts table and refreshes it from Crustdata each night.
- Updates headcount, recent headcount change, funding stage, last funding date, industry, and decision maker count for every row.
- Flags rows where Crustdata could not find a match so a human can review them, without overwriting good data.
- Posts a one-line Slack recap to your ops channel each morning showing how many accounts refreshed, how many had a big headcount swing, and how many failed lookup.
What do I need to use this?
- An Airtable base with a Target Accounts table that already has a company domain column for each row.
- A Crustdata account with API access enabled.
- A Slack workspace and the name of the channel where you want the morning recap posted.
How can I customize it?
- Change the run time. The default is 2am local, but you can move it to any nightly window that fits your team.
- Pick which fields get refreshed. Drop or add columns like industry, funding stage, or largest headcount country to match the shape of your Airtable.
- Set your own headcount change threshold. The default flags any account that grew or shrunk by more than 10 percent versus the previous run.
- Choose where the recap goes. Swap the Slack channel, route to a DM, or skip the recap entirely if you only want the data sync.
Frequently asked questions
Will it overwrite my existing data if Crustdata cannot find a company?
How much does this cost to run each night?
What happens if my Airtable table has hundreds of rows?
Why does it run sequentially instead of all at once?
Can I add other fields like revenue or tech stack to the refresh?
Stop letting your target accounts list go stale.
Connect Airtable, Crustdata, and Slack once. Geni runs this every night at 2am and your sales team opens Airtable to fresh data every morning.