Auto-enrich new Airtable prospects from their website

When a new prospect with a website URL lands in your Airtable table, pull a clean company profile from their site and write every field back to the row.

Deterministic Code
AirtableFirecrawlSalesOperationsLead EnrichmentData Sync

Build a code workflow that enriches new prospects in my Airtable Prospects table by extracting a fixed company profile from their website using Firecrawl, and writes everything back to the same row.

Trigger: an Airtable poll trigger on the new_record event for the Prospects table. For each new record, read the website URL field and the Status field. If the URL is empty, do nothing. If the Status is already 'Enriched', skip the record so we do not spend Firecrawl credits enriching the same company twice.

Step 1: call Firecrawl's Extract Structured Data operation on the prospect's website URL with a fixed JSON schema. The schema is exactly these eight fields, all optional strings except employee_size which is a string enum and pricing_model which is a string enum: company_name, one_line_description, industry, hq_city, hq_country, employee_size (one of '1-10', '11-50', '51-200', '201-500', '501-1000', '1001-5000', '5000+'), primary_product, pricing_model (one of 'free', 'freemium', 'subscription', 'usage-based', 'one-time', 'enterprise-sales', 'unknown'), and contact_email (only if a public contact email is listed on the site). Pass a short natural-language prompt alongside the schema telling Firecrawl to fill each field from the homepage, about page, and pricing page if present, and to leave a field null rather than guess.

Step 2: on success, call Airtable's Update Record operation on the same record ID and write each extracted field into its matching Airtable column. Map company_name to Company Name, one_line_description to Description, industry to Industry, hq_city to HQ City, hq_country to HQ Country, employee_size to Employee Size, primary_product to Primary Product, pricing_model to Pricing Model, contact_email to Contact Email. Also set the Status column to 'Enriched'. Leave columns blank where Firecrawl returned null rather than writing the string 'null'.

Step 3: on failure (Firecrawl returns success: false, a non-2xx status, or throws), call Airtable's Update Record operation on the same record and set Status to 'Failed' and write a short error message (one sentence, truncated to 200 characters) into a 'Enrichment Notes' column so the user can see what went wrong without leaving Airtable. Do not write any of the extracted-data columns in the failure case.

Constraints: this is a deterministic pipeline, not an agent. The schema is fixed and every step is a known node. The workflow should be idempotent at the row level (Status='Enriched' acts as the dedupe key) and resilient to single-row failures (one bad URL must not block enrichment for the next new row). Do not loop over the whole table on each run; rely on the new_record trigger to scope work to one record at a time.

Additional information

What does this prompt do?
  • Watches your Airtable Prospects table for any new row that includes a website URL
  • Visits the company site and pulls out a clean profile: name, one-line description, industry, headquarters city and country, employee size, primary product, pricing model, and a public contact email if one is listed
  • Writes every field back to the same row and stamps a Status column as Enriched or Failed, so the table always reflects what is done and what needs a second look
  • Skips rows that are already Enriched so you do not pay to extract the same company twice
What do I need to use this?
  • An Airtable base with a Prospects table that has a website URL column and a Status column
  • A Firecrawl account for the website extraction
  • Empty Airtable columns ready to receive the extracted fields (company name, description, industry, HQ city, HQ country, employee size, primary product, pricing model, contact email)
How can I customize it?
  • Swap the eight default fields for ones your team cares about, like founded year, funding stage, target market, or a tech stack keyword
  • Point the workflow at a different Airtable table or rename the Status column to match the one your team already uses
  • Change which Status values count as skip so archived, do-not-contact, or already-enriched rows are left alone

Frequently asked questions

What happens if a new row does not have a website URL?
That row is left untouched. The workflow only runs the extraction when there is a URL to read, so partial entries are not marked Failed.
Will this re-enrich a row I edit later?
No. It only acts on brand new rows, and any row already marked Enriched is skipped, so you do not get charged for the same company twice.
What if Firecrawl cannot read the site?
The Status column is set to Failed with a short note. You can filter the table for Failed rows and decide whether to retry by hand or write them off.
Can I extract different fields than the eight defaults?
Yes. Tell the workflow which fields you want and it will adjust both the extraction schema and the Airtable columns it writes back to.
Does this work with Airtable Free?
Yes. The workflow uses standard Airtable record reads and writes that are available on every Airtable plan.

Stop hand-researching every new prospect.

Connect Airtable and Firecrawl once, and Geni fills in a fresh company profile for every new row.