Auto-enrich new HubSpot contacts with Tavily company news

When a new contact lands in HubSpot, an agent pulls funding, hiring, and product news from the past 90 days, writes a summary to the record, and pings the owning rep in Slack.

Agentic Task
HubSpotTavilySlackSalesLead EnrichmentResearch & MonitoringNotifications & Alerts

Build me an agent workflow that enriches every new HubSpot contact with fresh company news from the web and pings the owning sales rep in Slack.

Trigger: when a new contact is created in HubSpot. Use HubSpot's outgoing contact-creation webhook so the workflow runs the moment the contact lands.

Step 1, gate on the email domain. If the contact's email is on a personal-email blocklist (gmail.com, yahoo.com, outlook.com, hotmail.com, icloud.com, aol.com, proton.me, protonmail.com, gmx.com, live.com, msn.com), exit immediately. Do not call Tavily, do not update HubSpot, do not Slack. Log a one-line reason and stop. Expose the blocklist as a workflow config so the user can edit it.

Step 2, identify the company. Read the contact's associated company record from HubSpot for the company name and domain. If no company is associated, fall back to the email domain (everything after the @) as the company identifier.

Step 3, research with Tavily Search. Run several targeted searches against the past 90 days, one per signal type, instead of one giant query. Use Tavily's Search action with search_depth=advanced, time_range or start_date set to 90 days ago, topic=news where appropriate, and max_results around 5 per search. Cover these signals: recent company news and press, funding rounds and investments, hiring sprees and notable role openings, and product launches or major announcements.

Step 4, clean and summarize. Dedupe results by URL and by near-identical headlines. Drop anything dated older than 90 days. Compose: a 2 to 3 sentence company_summary, a recent_news list of 3 to 5 bullet headlines (each with date and source link), and a signal_score from 0 to 100 weighted as funding > hiring > product launches > general press. Set last_enriched_at to the current timestamp.

Step 5, update the contact. Call HubSpot's Update Contact action and write to four custom contact properties: company_summary, recent_news, signal_score, last_enriched_at. If those properties don't exist, surface a clear setup error telling the user to create them as custom contact properties (text, long text, number, datetime) before running again.

Step 6, notify Slack. Call Slack Send a Message and post into the channel mapped to the contact's HubSpot owner. Let the user configure the owner-to-channel map during setup with a default fallback channel for unmapped owners. Message body: one headline line (New contact at <Company>, score <signal_score>/100), 2 to 3 top headlines as bullets with source links, and a direct link back to the HubSpot contact record.

Quiet defaults: if Tavily returns nothing meaningful in the last 90 days, still write last_enriched_at and a short 'no recent signals' summary back to HubSpot, but skip the Slack ping so the channel doesn't get noised with empty briefings. Make the whole workflow idempotent so re-running on the same contact is safe.

Additional information

What does this prompt do?
  • Watches HubSpot for new contacts and runs the moment one is created.
  • Searches the web for fresh signals about their company: funding rounds, hiring sprees, product launches, and press mentions from the last 90 days.
  • Writes a clean summary, top headlines, and a simple signal score back to the contact record so reps see context the second they open it.
  • Pings the owning rep's Slack channel with the top headlines and a direct link back to the contact.
What do I need to use this?
  • A HubSpot account where you can create a few custom contact properties.
  • A Tavily account for live web research. The free tier (1,000 monthly credits) is plenty to start.
  • A Slack workspace and the channel where you want briefings to land.
  • An email blocklist of personal domains (gmail.com, yahoo.com, etc.) so we skip non-business contacts. We ship a sensible default you can edit.
How can I customize it?
  • Change the 90-day lookback to a tighter or wider window depending on how recent signals need to be.
  • Edit the personal-email blocklist so only true B2B contacts get enriched.
  • Map HubSpot owners to specific Slack channels, or DM the owner directly instead of posting to a shared channel.
  • Reweight the signal score so funding, hiring, or launches count for more or less depending on your motion.

Frequently asked questions

What happens when a contact uses a personal email like gmail.com?
We skip them entirely. The agent checks the email domain against a personal-email list (gmail, yahoo, outlook, hotmail, icloud, and a few more) and exits without touching HubSpot or Slack. You can add or remove domains in the workflow settings.
How fresh does the news stay?
Only items from the last 90 days make it through. Older mentions are filtered out so reps don't open a contact and read about a Series A from three years ago. You can shorten the window to 30 days or stretch it to 180.
Will this overwrite contact fields I already use?
No. The agent writes to dedicated enrichment fields (company summary, recent news, signal score, last enriched at). Your standard contact properties stay untouched. You pick the field names during setup.
What if the same article shows up on five different sites?
We dedupe by URL and by near-identical headlines before anything is written, so each contact ends up with a clean list of unique sources, not the same press release syndicated everywhere.
Can I run this on contacts that are already in HubSpot, not just new ones?
Yes. Replay the workflow over a list of existing contacts to backfill, or pair it with a nightly run that targets contacts where last enriched at is empty.

Stop opening Google before every new contact.

Connect HubSpot, Tavily, and Slack once and Geni hands your reps fresh company news the moment a new contact lands.