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.
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.
FAQs
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?
Related templates
Work every partner tier decision from one board, with the revenue and commission numbers, clear promotion thresholds, and AI review briefs.
Open one board at month end to find every closed deal missing a commission, every commission with no deal behind it, and every amount that does not add up.
See warmup status, daily send volume, and bounce risk for every sending account in one grid, with the riskiest mailboxes floating to the top.
Review Introw partner payouts line by line, approve them from one board, raise the matching bill in Xero, and post every approval to Slack.
See who is due, build a week of dinners on demand, swap anything you do not like, then send the recipe and grocery links yourself.
See every customer photo that tags your brand, ask for permission in one click, and repost only once a yes is on the record.
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.