All workflows

How Brew books 20 demos per week with outbound

Run cold email and LinkedIn as one system, put a finished piece of your product's work in front of each prospect before they ask, and steer every warm reply to one of three outcomes.

Updated Sep 28, 2026

outbound-demo-engine.md

How Brew books 20 demos per week with outbound

Set up the tools below, then run the steps in order for the user, carrying each step's results into the next.

Inputs

Ask the user for these before you start.

  • ideal_customer: the companies and roles to target, e.g. B2B software, 20 to 500 employees, the person who owns marketing or growth
  • weekly_volume: new prospects to contact each week, e.g. 2,000
  • email_campaign_id: the Instantly campaign that sends the cold emails
  • linkedin_campaign_id: the HeyReach campaign that sends the connection requests and messages
  • booking_link: the calendar link a warm reply gets
  • free_deliverable: the finished thing your product makes for one prospect without their input, e.g. their welcome email rebuilt from their site

Set up

Crustdata (tool:crustdata/search-people, tool:crustdata/enrich-person-contact)

Use the first option your agent supports.

Notes:

  • Get a person's emails and phone numbers: Pass one identifier type per request.
CLI (official)

Install the command, then confirm it runs.

curl -fsSL https://static-assets.crustdata.com/cli/install.sh | sh
crustdata --version
  • Search people: run crustdata person search
  • Get a person's emails and phone numbers: run crustdata person contacts

Set $CRUSTDATA_API_KEY in your environment first (get a key: https://app.crustdata.com/api-keys).

API (official)

Instantly (tool:instantly/verify-email, tool:instantly/add-leads-to-campaign, tool:instantly/reply-to-email)

Use the API.

Notes:

  • Verify an email address: A check over 10 seconds returns pending: poll GET /api/v2/email-verification/{email} or pass a webhook_url. Read verification_status, not status. Needs an active paid plan and the email_verifications:create scope.
  • Add leads to a campaign: Leads added to an active campaign can start receiving its emails: confirm the campaign first. Pass campaign_id or list_id, not both; the key needs the leads:create scope.
  • Reply to an email: Sends a real email: confirm the text first. It only replies to an existing email, whose id goes in reply_to_uuid; it can't start a new thread.

Generate an email (Brew, tool:brew/generate-email)

Use the first option your agent supports.

Note: Costs credits, and the brand must be ready first. Pass the returned emailVersionId to a send or an automation to pin that exact version.

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" } } }

Call the MCP tool create_email.

CLI (official)

Install the command, then confirm it runs.

brew install getbrew/tap/brew-cli
brew-cli --version

Run brew-cli emails generate.

Set $BREW_API_KEY in your environment first (get a key: https://brew.new/settings/api).

HeyReach (tool:heyreach/add-leads-to-campaign, tool:heyreach/get-conversations, tool:heyreach/send-message)

Use the API.

  • Base URL: https://api.heyreach.io
  • Add leads to a campaign: POST /api/public/campaign/AddLeadsToCampaignV2
  • Get inbox conversations: POST /api/public/inbox/GetConversationsV2
  • Send a message: POST /api/public/inbox/SendMessage
  • Auth: send the header X-API-KEY: $HEYREACH_API_KEY

Note: Create the key in the HeyReach app under Settings, API keys. Every request counts toward one workspace limit of 300 requests per minute, and read endpoints use POST with a JSON body of filters.

Notes:

  • Add leads to a campaign: The campaign must exist and have LinkedIn sender accounts assigned before leads go in. Each lead needs a LinkedIn profile URL; the response counts added, updated and failed leads.
  • Get inbox conversations: A read that uses POST, with the filters in the JSON body, paginated by offset and limit. Only conversations from HeyReach campaigns sync into the inbox.
  • Send a message: Sends a real LinkedIn message: confirm the text first. It takes a conversation id and the sender account id that owns the conversation; it replies to existing conversations rather than starting new ones.

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. Build the week's list with Search people (Crustdata). Find up to weekly_volume people matching ideal_customer, one per company. Keep each person's name, title, company, company domain and LinkedIn profile URL.
  2. Get their work emails with Get a person's emails and phone numbers (Crustdata). Look up business emails by LinkedIn profile URL, in batches. Keep each person's work email; people with no email stay in the list for the LinkedIn channel.
  3. Verify the emails with Verify an email address (Instantly). Check each work email and keep only the verified ones for the email channel. Bounces burn the sending domains that everything else depends on.
  4. Build the deliverable before they ask with Generate an email (Brew). Produce free_deliverable for the best-fit prospects. When your product is email, this tool is the whole step: point Brew at the prospect's own site so it picks up their brand, and generate the first email their company should be sending but is not, such as their welcome email. Selling something else, skip this tool and make the equivalent with your own product: an audit it ran, a report it wrote, a page it rebuilt, anything finished and specific to this prospect with a link they can open. Keep each deliverable's link. This is the step that makes the reply rate: the first message shows finished work instead of describing it.
  5. Enroll the email channel with Add leads to a campaign (Instantly). Add the verified people to email_campaign_id. The copy leads with what is wrong or missing that your product fixes for this prospect and offers the finished deliverable from the previous step, not a pitch about the product.
  6. Enroll the LinkedIn channel with Add leads to a campaign (HeyReach). Add the rest to linkedin_campaign_id, which spreads sends across several LinkedIn sender accounts so no single profile exceeds its daily limits. Keep the two channels' lists apart so nobody is cold-contacted twice in the same week.
  7. Sweep the LinkedIn inbox with Get inbox conversations (HeyReach). At least daily, pull recent conversations and judge each one by its newest message, not by thread-level metadata. Sort replies into warm, question, not-now and no.
  8. Reply on LinkedIn with Send a message (HeyReach). Answer the actual question first, in the sender's own voice, short and specific. Every warm reply steers to exactly one of three outcomes: try the product self-serve, book a call at booking_link, or take the done-for-you offer. Show the user each reply before it sends.
  9. Reply on email with Reply to an email (Instantly). Same playbook as LinkedIn, and when a prospect bites on the offer, the reply carries the deliverable link built in step 4. A not-now gets a date to reconnect, not a push.
  10. Suppress every no, on both channels yourself. Keep one suppression list. A no, an unsubscribe or a wrong-person reply on either channel stops the sequence and blocks the person on the other channel too, since the campaigns do not share their no's on their own.

Done when

  • Every reply from either channel has an answer, or a note saying why it was skipped, by the end of the day it arrived.
  • Every no is suppressed on both channels, not only the one it came from.
  • The user has a weekly table of contacted, replies, warm replies and demos booked, tracked against the weekly demo target.

Notes

The bait generalizes past email. It works because it is finished work for this specific prospect, free, before any commitment; email is just what Brew happens to make. Swap in whatever your own product can produce for one named company in minutes without their input, and keep every other step unchanged. If producing it takes hours per prospect, reserve step 4 for the best-fit slice and let the rest of the list run on the two channels without it.

Three outcomes, never zero and never four: a warm reply that is not steered anywhere is a compliment, not a demo, and a reply that pitches all three options at once reads like a script. Pick the one that fits what the person actually said.

The channels behave differently. Email carries the built-artifact offer well because a preview link renders in the thread; LinkedIn works best two or three sentences at a time, casual, answering questions honestly, including questions about price. If the honest answer is that the product does not do something, say so and suggest what does; the goodwill outlasts the thread.

The weekly numbers only mean something if the sweep runs every day. Replies decay fast: a warm reply answered the same day books; the same reply answered on Thursday usually does not.

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.