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.
Helper code snippet
Reusable code that powers a step inside this automation — loop bodies, parsers, routers, and other glue.
- Connection Strength Router — specific partner vs random →JavaScript · connection_router.js
Reads a company's connection-strength field and routes the Zap to the partner with that relationship — or to a random senior partner if no relationship exists. Pairs with the intro / congrats outreach Zaps.
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.
What the flow writes
One write, to one record. No email is sent here — that's the downstream Zap's job.
| Attribute | Value | Why |
|---|---|---|
| congratulations | 'Send email' | Tells the drafter Zap this entry needs a congrats-flavored email, not a normal intro. |
| email_founder | partner id | Resolved actor id (Path A) or random pick (Path B). Drives whose Outlook mailbox the downstream draft lands in. |
| round_announcements | title + summary | Verbatim 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.