Automation · Playbook 01

Send congratulatory note on company fundraises.

When a funding announcement lands in the deal feed, figure out if it's one of our Outreach-List companies, then stage the Outreach List entry with the round text and route it to the partner with the strongest relationship (or a random senior partner if nobody has one). Drafting happens downstream.

Sourcing

Helper code snippet

Reusable code that powers a step inside this automation — loop bodies, parsers, routers, and other glue.

Reference build

A funding announcement lands in the Deal Feed and the flow has to decide three things in order: is this one of our companies, are they on the Outreach List, and which partner is best-placed to say congrats. If the answer to either of the first two is no, the run halts silently. If both are yes, the Outreach List entry gets stamped with the announcement and routed to a partner — and the downstream drafting Zap takes it from there.

This Zap stages. The companion Zap drafts. Keeping them split means a re-assignment doesn't burn LLM tokens and a re-draft doesn't have to re-resolve the company.

Flow
01 · Trigger
Notion: new item in the Deep Tech Deal Feed
Funding announcements stream into Notion from newsletters + scrapers. Each new row is a candidate for a congrats outreach.
02 · Resolve the website
OpenAI gpt-5.2-chat-latest + web_search_preview
Prompted to return only the company's domain (or the literal string 'NA') given the announcement title + summary. No prose, no caveats.
03 · Find the company in CRM
Attio find-record on Companies (by domain)
Looks up the resolved domain against the Company object. 'success_on_miss' is on — a miss is allowed and handled by the next gate.
04 · Gate · in CRM?
Filter: continue only if Attio record_id exists
If the company isn't in Attio, the run stops here. We don't congratulate companies we don't track.
05 · Find the Outreach List entry
Attio find-list-entry on the Outreach List
The company has to be on the active outreach queue specifically — sitting in the CRM isn't enough.
06 · Gate · on the Outreach List?
Filter: continue only if list entry_id exists
Second gate. Silent halt if the company is in Attio but not on the Outreach List.
07 · Read the connection signal
Inline JS: classify strongest_connection_strength
If the field is empty/blank → result = 'Random'. Otherwise → result = 'Specific'. Determines which assignment branch fires.
08 · Assignment branch
Branch on assignment-mode (Specific vs Random)
Path A: a specific partner has the strongest relationship. Path B: nobody does, pick from the senior partner pool.
Path B · Random (no connection)
JS · pick a partner
Uniform random pick from Mark · Shaw · Drew · Dan. Junior team members are intentionally not in the pool.
Attio · update list entry
Sets congratulations = 'Send email', email_founder = picked partner, round_announcements = headline + summary.
Path A · Specific (has a strongest connection)
Sub-branch · partner router
Sub-branches C–G match strongest_connection_user.referenced_actor_id to a partner. Hard-coded allowlist, one branch per actor.
AustinShawDrewMarkDan
Attio · update list entry
Same three attributes as Path B, but email_founder is the partner with the strongest signal — not a random pick.
09 · Handoff
Outreach List entry is now staged for drafting
The downstream 'Draft intro / congratulatory outreach' Zap fires on this list entry being updated. That one does the recency math, research, drafting, and Outlook + Slack handoff.

What the flow writes

One write, to one record. No email is sent here — that's the downstream Zap's job.

AttributeValueWhy
congratulations'Send email'Tells the drafter Zap this entry needs a congrats-flavored email, not a normal intro.
email_founderpartner idResolved actor id (Path A) or random pick (Path B). Drives whose Outlook mailbox the downstream draft lands in.
round_announcementstitle + summaryVerbatim copy of the Notion headline and summary. Gives the drafter the original wording of the round to reference.

Gotchas

The risky parts are matching (don't congratulate the wrong Acme), gating (don't surprise a partner), and assignment (a stranger's congrats is worse than a late one).

  • 01The deal feed isn't the CRM. The Notion database is a raw stream of fundraising announcements — most of those companies aren't on our Outreach List, and most never will be. The flow's first real job is to figure out 'is this one of ours?' and silently drop everything else. That's why a CRM-presence gate sits right after the website resolver.
  • 02Resolving the company is a two-step lookup, not a fuzzy name match. We ask GPT-5.2 (with web search) to return only the company's domain — no prose, no maybes, just the domain or the string 'NA'. Then we look that domain up in Attio. Matching on names directly is how you congratulate the wrong Acme.
  • 03'NA' is a first-class value. When the model can't confidently identify the website it returns 'NA', and the Attio find-record step turns up nothing, and the filter step quietly halts the run. We'd rather miss a congrats than send one to a lookalike.
  • 04Two independent gates have to both pass. (1) The company has to exist in Attio. (2) The company has to be on the Outreach List specifically. A company can sit in the CRM for years without being on the active outreach queue — and we don't want to surprise a partner with an email they didn't sign up to send.
  • 05Assignment is a branch, not a model call. We don't ask an LLM 'who should send this?'. The flow reads Attio's 'strongest_connection_user' field — that's a hard signal computed from real inbox/calendar data — and routes to the partner with that actor id. If the field is empty, an inline JS step picks at random from the four senior partners.
  • 06The 'Random' fallback is a smaller pool than the full partner roster on purpose. Mark · Shaw · Drew · Dan. Junior team members aren't in the random pool because a cold congrats from someone the founder has never heard of is worse than a slightly-late one from a known name.
  • 07We don't write the email here. This Zap only stages the Outreach List entry — setting congratulations='Send email', stamping the round announcement into a field, and assigning a partner. The actual drafting (recency math, GPT research, Claude-written body, Outlook draft, Slack ping) is the downstream 'Draft intro / congratulatory outreach' Zap. Splitting them means we can re-run drafting without re-resolving the company, and re-assign without re-drafting.
  • 08Round announcement text is stored verbatim. We copy the Notion 'title' and 'Summary' fields straight into the Attio round_announcements attribute. The drafter downstream gets the original headline — not our paraphrase of it — so the email can reference the specific round size and lead investor without us re-keying that data.

Swap matrix

Every layer is replaceable. The two non-negotiables are a CRM that exposes a real relationship-strength signal, and a deal feed surface that fires on new rows.