---
ref: workflow:content-download-nurture
title: Follow up on downloads with the section they need
author: thedogwiththedataonit
tools: [tool:firecrawl/scrape-url, tool:hubspot/search-crm-records, tool:brew/generate-email, tool:brew/send-email, tool:brew/get-send, tool:notion/create-page]
tags: [capability:manage-crm, capability:manage-docs, capability:scrape-web, capability:send-email, capability:track-email-engagement, capability:write-copy, channel:email, has:api, has:mcp, motion:inbound]
updated: 2026-10-11
---

# 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/benchmark
- `download_form`: the name HubSpot records for the form that gates the asset, e.g. 2026 outbound benchmark download
- `follow_up_window`: how far back to look, e.g. 3 days
- `nurture_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.

```json
{ "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.

```sh
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.

```json
{ "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.

```json
{ "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.

```sh
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.

```json
{ "mcpServers": { "notion": { "url": "https://mcp.notion.com/mcp" } } }
```

Call the MCP tool `notion-create-pages`.

#### CLI (official)

Install the command, then confirm it runs.

```sh
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

1. **Read the asset** with Scrape a URL (Firecrawl). Fetch `asset_url` as markdown. Keep its section headings and one line on each.
2. **Pull downloads** with Search CRM records (HubSpot). Search contacts whose `recent_conversion_event_name` contains `download_form` and whose `recent_conversion_date` falls within `follow_up_window`, requiring a recorded marketing opt-in and leaving out anyone with `hs_email_optout` set. Absence of an opt-out alone is not consent. Keep name, email, job title, company and industry.
3. **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`, `emailVersionId` and subject.
4. **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>`.
5. **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.
6. **Log the send** with Create a page (Notion). Add one row per accepted send to `nurture_log` with 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.
