Follow up on downloads with the section they need
Finds recent downloads of your asset in HubSpot, queues each person the section that fits their role with Brew, and logs it in Notion.
Outcome
A follow-up email, queued or declined by you, for every opted-in contact who recently downloaded the asset, each pointing to the section that fits them.
One row per accepted send in your Notion log, with the contact, section, date, send ID and observed status.
How it works
FRead the asset, by Scrape a URL by Firecrawl
Fetch
asset_urlas markdown. Keep its section headings and one line on each.
HPull downloads, by Search CRM records by HubSpot
Search contacts whose
recent_conversion_event_namecontainsdownload_formand whoserecent_conversion_datefalls withinfollow_up_window, requiring a recorded marketing opt-in and leaving out anyone withhs_email_optoutset. Absence of an opt-out alone is not consent. Keep name, email, job title, company and industry.
BWrite follow-ups, by Generate an email by Brew
Generate one email per contact that picks the section from step 1 most relevant to their role and industry. Show the drafts to the user. Keep each approved email's
emailId,emailVersionIdand subject.
BSend, by Send an email by Brew
Match each consent-qualified address to an existing subscribed Brew contact. If it is missing, stop for the user to prepare their consented contact list. Send each approved email to that contact, with the idempotency key
<emailVersionId>:<email>.
BRead send status, by Get a send by Brew
Read each returned sendId. Poll until terminal or the execution window ends; keep the observed status and delivery accounting. A queued or pending send has not been delivered.
NLog the send, by Create a page by Notion
Add one row per accepted send to
nurture_logwith its contact, section, date, sendId and observed status. Record delivery only when Brew reports it; keep pending and failed results explicit.
You'll be asked for
Where the downloaded asset lives
e.g. https://acme.example/benchmark
The name HubSpot records for the form that gates the asset
e.g. 2026 outbound benchmark download
How far back to look
e.g. 3 days
The Notion database that logs each send, set up once with Contact, Section, Date, Send ID and Status properties
content-download-nurture.mdView markdown
Follow up on downloads with the section they need
Finds recent downloads of your asset in HubSpot, queues each person the section that fits their role with Brew, and logs it in Notion.
Set up the tools below, then run the steps in order for the user, carrying each step's results into the next. The run is done when the user has the outcome below.
Outcome
- A follow-up email, queued or declined by you, for every opted-in contact who recently downloaded the asset, each pointing to the section that fits them.
- One row per accepted send in your Notion log, with the contact, section, date, send ID and observed status.
Inputs
Ask the user for these before you start.
asset_url: where the downloaded asset lives, e.g. https://acme.example/benchmarkdownload_form: the name HubSpot records for the form that gates the asset, e.g. 2026 outbound benchmark downloadfollow_up_window: how far back to look, e.g. 3 daysnurture_log: the Notion database that logs each send, set up once with Contact, Section, Date, Send ID and Status properties
Set up
Scrape a URL (Firecrawl, tool:firecrawl/scrape-url)
Use the first option your agent supports.
MCP (official, remote)
Add this server to your agent's MCP settings, then sign in when asked.
{ "mcpServers": { "firecrawl": { "url": "https://mcp.firecrawl.dev/v2/mcp-oauth" } } }
Call the MCP tool firecrawl_scrape.
CLI (official)
Install the command, then confirm it runs.
npm install -g firecrawl-cli
firecrawl --version
Run firecrawl scrape.
Set $FIRECRAWL_API_KEY in your environment first (get a key: https://www.firecrawl.dev/app/api-keys).
Search CRM records (HubSpot, tool:hubspot/search-crm-records)
Use the first option your agent supports.
Note: The MCP tool takes up to five groups of six filters and returns up to 200 records per page.
MCP (official, remote)
Add this server to your agent's MCP settings, then sign in when asked.
{ "mcpServers": { "hubspot": { "url": "https://mcp.hubspot.com" } } }
Call the MCP tool search_crm_objects.
API (official)
- Base URL: https://api.hubapi.com
- Endpoint:
POST /crm/objects/2026-09/{objectType}/search - Auth: send the header
Authorization: Bearer $HUBSPOT_API_KEY
Note: Use a service key or an app's static access token with the CRM scopes the calls need; paths carry a dated version such as 2026-09.
Brew (tool:brew/generate-email, tool:brew/send-email, tool:brew/get-send)
Use the first option your agent supports.
Notes:
- Generate an email: Costs credits and requires a ready brand. If generating, poll get_email. Keep emailId and emailVersionId; pass both to a send or automation to pin the design.
- Send an email: Supply subject and existing subscribed recipients. Use idempotency_key (MCP) or Idempotency-Key (HTTP), reusing it for retries. On confirmation_required, obtain approval and repeat with confirmed:true and the returned confirmation_id. Queued is not delivered.
- Get a send: Use the sendId returned by send-email. MCP takes report:{kind:"sends",sendId}. Queued is not delivered; inspect delivery accounting and recipient events before recording delivery. Stop polling when terminal or your execution window ends.
MCP (official, remote)
Add this server to your agent's MCP settings, then sign in when asked.
{ "mcpServers": { "brew": { "url": "https://brew.new/api/mcp" } } }
- Generate an email: call the MCP tool
create_email - Send an email: call the MCP tool
send_email - Get a send: call the MCP tool
get_email_analytics
CLI (official)
Install the command, then confirm it runs.
brew install getbrew/tap/brew-cli
brew-cli --version
- Generate an email: run
brew-cli emails generate - Send an email: run
brew-cli emails send - Get a send: run
brew-cli sends get
Set $BREW_API_KEY in your environment first (get a key: https://brew.new/settings/api).
Create a page (Notion, tool:notion/create-page)
Use the first option your agent supports.
Note: To add a row to a database, set the parent to its data source and match that data source's property schema.
MCP (official, remote)
Add this server to your agent's MCP settings, then sign in when asked.
{ "mcpServers": { "notion": { "url": "https://mcp.notion.com/mcp" } } }
Call the MCP tool notion-create-pages.
CLI (official)
Install the command, then confirm it runs.
npm install --global ntn
ntn --version
Run ntn api v1/pages.
Set $NOTION_API_TOKEN in your environment first (get a key: https://www.notion.so/developers/tokens).
Before step 1, confirm access to each service with its cheapest read-only call, like a list or a search. Never send or change anything to test access.
Steps
- Read the asset with Scrape a URL (Firecrawl). Fetch
asset_urlas markdown. Keep its section headings and one line on each. - Pull downloads with Search CRM records (HubSpot). Search contacts whose
recent_conversion_event_namecontainsdownload_formand whoserecent_conversion_datefalls withinfollow_up_window, requiring a recorded marketing opt-in and leaving out anyone withhs_email_optoutset. Absence of an opt-out alone is not consent. Keep name, email, job title, company and industry. - Write follow-ups with Generate an email (Brew). Generate one email per contact that picks the section from step 1 most relevant to their role and industry. Show the drafts to the user. Keep each approved email's
emailId,emailVersionIdand subject. - Send with Send an email (Brew). Match each consent-qualified address to an existing subscribed Brew contact. If it is missing, stop for the user to prepare their consented contact list. Send each approved email to that contact, with the idempotency key
<emailVersionId>:<email>. - Read send status with Get a send (Brew). Read each returned sendId. Poll until terminal or the execution window ends; keep the observed status and delivery accounting. A queued or pending send has not been delivered.
- Log the send with Create a page (Notion). Add one row per accepted send to
nurture_logwith its contact, section, date, sendId and observed status. Record delivery only when Brew reports it; keep pending and failed results explicit.
Rules
- Use only the services set up above. The read-only calls they need, like listing ids or polling for results, are fine.
- Ask the user before anything that sends messages, costs money, or changes data, and say how many records it touches. One approval covers a batch the user has seen.
- Never print API keys.
