BirdsEye ROI: GHL Build Spec

Sub-account: BirdsEye ROI Location ID: r8N6VQLFYrBCML2ZgYiO Date: 2026-08-01 Author: Gino (GHL Operator) Sources: marketing/FACTS.md, marketing/outreach-and-pipeline.md, marketing/copy-emails-social.md


STOP: Read before building

The workflow must be created PAUSED (draft mode). Nothing sends.

Reasons:

  • Pricing is not approved yet (task 3 in the launch plan).
  • Mike has not signed off on the email copy.
  • Building is approved. Sending is not.

Do not activate, publish, or enable the workflow until both conditions clear. Do not import contacts until the workflow is verified in draft and Mike gives the go.


MCP limitations discovered 2026-08-01

These are recorded here so nobody burns another hour rediscovering them.

What was attempted Tool Result
Create pipeline with stages No create-pipeline tool exists in the official LeadConnector MCP. Only get-pipelines, get/search/update-opportunity. Blocked. Pipeline structure is read-only.
Create workflow No workflow tools exist in the MCP at all. Zero tools. Blocked. Not exposed.
Create email templates emails_create-template exists but returned 401: "The token is not authorized for this scope." Additionally, it only creates empty shells (name + type), has no body content field, and no update-template tool exists to populate content. Blocked. Auth scope missing AND tool is content-blind.

The entire build below must be done in the GHL web UI by copy-paste.


Part 1: Pipeline

Pipeline name: BirdsEye Sales Pipeline

Create in: Opportunities > Pipelines > Create Pipeline

Stages (create in this exact order)

# Stage name Definition Exit criteria Max days in stage
1 Identified Fits an ICP, contact details verified First touch sent 3
2 Engaged Replied, or answered the phone Discovery call booked 10
3 Discovery Call held, need confirmed Their numbers captured (all 8 fields from section 5 of outreach doc) 7
4 Demo Saw the product against their own situation Proposal requested 7
5 Proposal Written scope and price delivered Verbal yes or no 10
6 Closing Verbal yes, paperwork moving Signature 7
7 Won Signed and logged Handoff to delivery n/a
8 Lost Clean no, reason recorded Re-approach date set n/a

Notes:

  • Won and Lost are terminal stages with no max days.
  • Any deal past its max days in stage should be surfaced in the weekly pipeline review.
  • GHL does not enforce max-days natively. This is a reporting convention, not an automation gate. The workflow does not auto-move stages.

Part 2: Email Templates (8 total)

Create in: Marketing > Emails > Templates (or Email Templates under Settings)

For each template below: create as HTML type, paste the subject line and body exactly as written. Do not edit the copy.

Merge field rules for this batch

The only merge fields allowed in any template body are the ones the CSV actually populates:

Merge field (GHL syntax) CSV column Populated
{{contact.company_name}} Business Name 300 of 300
{{contact.city}} City 300 of 300
{{contact.state}} State 300 of 300
Custom: {{contact.niche}} Niche 300 of 300

There is no first name for batch 1. The First Name column is empty on all 300 rows. Do not use {{contact.first_name}} anywhere. Do not add "Hi there" or any generic salutation. Several emails intentionally have no salutation at all. That is deliberate, not an omission, so nobody helpfully adds one during the GHL build.

Business name warning: Business names in this list run up to 92 characters and some carry commas, ampersands, and registered-trademark marks. {{contact.company_name}} must always sit inside a sentence, never alone on a salutation line where the punctuation reads wrong.

In the copy below, {{Business Name}} from the source doc maps to GHL's {{contact.company_name}}.

Cold Email 1

Template name: BirdsEye Cold 1: Which Calls Paid Subject line (default, local service owner): Which of your calls actually paid? Subject line (agency variant, swap when sending to ICP B): Your client asks which channel paid. Then what? Alternate subject A: Your call report is counting spam Alternate subject B: 400 calls. How many were revenue? Preview text: Your provider counts rings. It does not count dollars.

Body:

This one is for whoever watches the marketing spend at {{contact.company_name}}.

Quick question about your call reporting.

Your tracking provider tells you the phone rang. It does not tell you which ring paid. So the number at the top of your monthly report is a call count, not a revenue number, and those two things drift apart fast.

BirdsEye ROI sits on top of the providers you already use, transcribes the calls, scores them, and attaches a dollar figure to each one. Same phone numbers. Same forwarding. One log.

Worth a look at what your last 90 days would say if every call had a dollar attached to it?

{{signature}}

P.S. Reply with the word "calls" and I will send the 90 day breakdown format.

Cold Email 2

Template name: BirdsEye Cold 2: 42 Percent Spam Subject line (default, local service owner): 42.3% of the calls were spam Subject line (agency variant): You are billing on a call count that includes spam Alternate subject A: Almost half the log was noise Alternate subject B: The number your dashboard will not subtract Preview text: 43,700 out of 103,000 calls. Verified on our platform.

Body:

Following up with the specific reason I reached out.

On the BirdsEye platform, 43,700 of the calls in the log were flagged as spam. That is 42.3% of a log carrying more than 103,000 calls.

Every one of those sat inside somebody's raw call count before it got flagged. If your cost per lead is calculated off an unfiltered dashboard, the number is wrong, and it is wrong in the direction that costs you money.

BirdsEye flags spam automatically and keeps it out of the revenue math, so the count you look at is the count you can act on.

{{signature}}

P.S. Want your own spam percentage? Reply "check" and I will show you where it comes from.

NOTE: This email has no salutation. That is deliberate. Do not add one.


Cold Email 3

Template name: BirdsEye Cold 3: Four Dashboards Subject line (default, local service owner): Four dashboards, four definitions of a lead Subject line (agency variant): Multi-client call flow without four logins Alternate subject A: Your calls live in four different places Alternate subject B: One log instead of four logins Preview text: Twilio, SignalWire, CallFire, CallRail. One log.

Body:

Please pass this to whoever logs into the call tracking dashboards at {{contact.company_name}}.

Most operators I talk to are not running one call tracking provider. They are running several, because different campaigns got set up in different years by different people.

Each provider shows its own slice. Each one counts a lead its own way. Nobody shows the whole picture.

BirdsEye unifies four providers into a single call log: Twilio, SignalWire, CallFire, and CallRail. It manages more than 200 forwarding rules from one place, and it applies your revenue rules per call, per service, and per niche.

One log. One revenue number. Your existing numbers stay exactly where they are.

{{signature}}

P.S. Book 20 minutes and I will map your providers into one log on screen: https://birdseyeroi.com

Cold Email 4

Template name: BirdsEye Cold 4: The Proof Email Subject line (default, local service owner): The actual numbers behind the pitch Subject line (agency variant): The receipts, before you give me 20 minutes Alternate subject A: 103,000 calls, and what we found in them Alternate subject B: Here is what the platform has processed so far Preview text: Every figure below is inspectable in the product.

Body:

I would rather show you the platform's real numbers than describe them.

Here is what BirdsEye has processed:

- 103,000+ calls in the call log
- $46,000+ in tracked revenue attributed back to calls
- 43,700 calls flagged as spam, 42.3% of the log, kept out of the revenue math
- 4 call tracking providers unified: Twilio, SignalWire, CallFire, CallRail
- 200+ forwarding rules under management
- 6,002 leads carrying full AI analysis
- 7,495 SMS conversations analyzed for intent, money signals, and urgency
- 13 dedicated caller-intelligence fields extracted per call, including service needed, urgency level, call outcome, and conversion probability
- 79 service monetization records and 18 canonical service categories, so revenue rules apply to a real service name and not a fuzzy string
- 13 call flow types built and wired, from simple forward to AI receptionist

Transcription runs on AssemblyAI Universal-2. Analysis runs on Claude Opus 4.6. Hawkeye, the chat layer, lets you ask the call data a question in plain English instead of building a report to find out.

That is the whole mechanism. Nothing in it depends on you changing phone numbers.

{{signature}}

P.S. See it against your own calls: https://birdseyeroi.com

NOTE: This email has no salutation. That is deliberate. Do not add one.


Cold Email 5

Template name: BirdsEye Cold 5: Break-Up Subject line (default, local service owner): Closing your file Subject line (agency variant): Closing the loop on this Alternate subject A: I will stop here Alternate subject B: Last one from me Preview text: No pitch in this one. Just the close-out.

Body:

Last note to {{contact.company_name}} on this.

I have sent a few notes about tying your calls to revenue and have not heard back, which usually means one of three things: you already have this solved, the timing is wrong, or it is simply not a priority this quarter. All three are fine answers.

I am closing your file so I stop landing in your inbox.

If it becomes relevant later, the one thing worth remembering is this: on our platform 42.3% of logged calls were spam. Whatever tool you end up using, make sure it subtracts that number before it reports your cost per lead.

Everything is at https://birdseyeroi.com if you want it down the road.

Thanks for the time either way.

{{signature}}

P.S. Reply "later" and I will check back in six months. Otherwise this is the last one.

Nurture Email 1

Template name: BirdsEye Nurture 1: The One Screen Trigger: 3 days after a demo that did not close. Subject line: The one screen from our call Alternate subject A: Following up with the revenue view Alternate subject B: Picking up where the demo left off Preview text: The revenue rules screen, in writing this time.

Body:

Following up on the demo, with the one screen that matters most.

Thanks again for the time. Rather than a recap of everything, here is the single piece that matters most for your situation.

Revenue rules are what turn a call log into a revenue number. You set them per call, per service, and per niche. BirdsEye then shows revenue, cost per lead, margin, and ROI at both the niche level and the service level, so you can see which service line is carrying the account and which one is quietly losing money.

That is the part that does not exist in a provider dashboard. A provider can tell you the call happened. It has no idea what the call was worth.

Nothing else needs to change on your side. Your numbers, your forwarding, your providers stay as they are.

{{signature}}

P.S. Reply with your two biggest service lines and I will show you how the rules would be set up for them.

Nurture Email 2

Template name: BirdsEye Nurture 2: The Objection Subject line: The objection I should have answered on the call Alternate subject A: "We already have call tracking" Alternate subject B: Why this sits on top instead of replacing anything Preview text: This is not a rip-and-replace of what you have.

Body:

Thinking back on our call, I do not think I answered the real hesitation clearly, so let me do it now.

The objection is usually "we already have call tracking." That is true, and it is also the point. BirdsEye does not replace Twilio, SignalWire, CallFire, or CallRail. It reads all four, puts them in one log, and adds the layer none of them have.

That layer is: automatic spam flagging kept out of the revenue math, transcription on qualifying calls, 13 structured caller-intelligence fields extracted per call, and a dollar figure attached to the call.

You keep every number and every forwarding rule you have today. The switching cost is close to nothing, because there is nothing to switch.

If the hesitation is something else entirely, tell me what it is and I will answer it straight.

{{signature}}

P.S. Reply with the actual hesitation and I will address it in one email, no second demo required.

NOTE: This email has no salutation. That is deliberate. Do not add one.


Nurture Email 3

Template name: BirdsEye Nurture 3: Close or Keep Open Subject line: Should I close this out? Alternate subject A: Where do you want to leave this? Alternate subject B: Open or closed, either is fine Preview text: One question, and no follow-up if the answer is no.

Body:

No pitch here, just housekeeping.

I want to be respectful of where this actually sits, so one direct question: should I keep this open or close it out?

If it is a timing thing, say so and I will set a reminder for the quarter you name. If it is a no, that is genuinely fine and I will stop.

If it is still a maybe, the fastest way through is not another demo. Send me one month of your call data and I will show you what BirdsEye reports for it against what your current dashboard reports for it. The gap is usually the whole conversation.

{{signature}}

P.S. Reply with one word: open, later, or closed.

Part 3: Workflow Spec (Cold Outreach Sequence)

Workflow name: BirdsEye Cold Outreach: 9 Touch, 21 Day Status on creation: PAUSED / Draft. Do not publish.

Enrollment trigger

Contact is added to the "BirdsEye Sales Pipeline" in the "Identified" stage.

Workflow goal (reply-exit rule)

Goal type: Contact replies (any channel: email reply, SMS reply, or inbound call). Goal action: Remove from workflow immediately.

This is critical. Any reply of any kind pulls the prospect out of the sequence and into a human conversation. Configure this as a Workflow Goal in GHL so the contact exits the moment a reply event fires. Do not use an If/Else branch for this. The goal fires globally across all steps.

Sequence steps

Step Day Wait Action type Action detail
1 0 None (immediate on enrollment) Send email Template: "BirdsEye Cold 1: Which Calls Paid"
2 1 Wait 1 day Create task (assigned to rep) Task: "LinkedIn: Send connection request to the contact at {{contact.company_name}}, no pitch. Profile URL: {{contact.linkedin_url}}. Goal: face recognition only."
3 3 Wait 2 days Send email Template: "BirdsEye Cold 2: 42 Percent Spam"
4 5 Wait 2 days Create task (assigned to rep) Task: "Phone: Call {{contact.company_name}} at {{contact.phone}}. No voicemail. Goal: live contact attempt. If no answer, mark complete and move on."
5 7 Wait 2 days Send email Template: "BirdsEye Cold 3: Four Dashboards"
6 10 Wait 3 days Create task (assigned to rep) Task: "LinkedIn: Share the spam split infographic (marketing/infographics-png/01-the-spam-split.png) with the contact at {{contact.company_name}}. No ask, no pitch. Passive proof only."
7 12 Wait 2 days Send email Template: "BirdsEye Cold 4: The Proof Email"
8 15 Wait 3 days Create task (assigned to rep) Task: "Phone: Call {{contact.company_name}} at {{contact.phone}}. Leave voicemail referencing email 4 (the proof email with platform numbers). Goal: live contact attempt."
9 18 Wait 3 days Send email Template: "BirdsEye Cold 5: Break-Up"

After step 9 (day 21 with no reply)

Add a final wait of 3 days (to reach day 21), then:

  • Add tag: 90-day-reapproach
  • Move opportunity to "Lost" stage in the pipeline
  • Create task (assigned to rep): "No response after 9 touches. Record moved to 90-day re-approach. Wake-up date: {{date + 90 days}}. Do not delete."

Nurture workflow (separate workflow)

Workflow name: BirdsEye Post-Demo Nurture: 3 Touch Status on creation: PAUSED / Draft. Do not publish.

Enrollment trigger: Contact moves to "Proposal" stage in the pipeline AND has a tag demo-completed AND does NOT have a tag closed-won.

Workflow goal: Contact replies (any channel). Remove from workflow immediately.

Step Day offset from enrollment Wait Action type Action detail
1 0 (3 days post-demo, handled by enrollment timing) None Send email Template: "BirdsEye Nurture 1: The One Screen"
2 6 Wait 6 days Send email Template: "BirdsEye Nurture 2: The Objection"
3 14 Wait 8 days Send email Template: "BirdsEye Nurture 3: Close or Keep Open"

Note on enrollment timing: the outreach doc says nurture starts 3 days after the demo. Two options to implement this:

  • Option A: Add the demo-completed tag 3 days after the demo manually, and the workflow fires immediately on tag add.
  • Option B: Use the pipeline stage move as the trigger and add a 3-day wait as the first step before email 1.

Option B is simpler. If using Option B, insert a 3-day wait before step 1.


Part 4: CSV Import Column Headers

The prospects table has 2,680 contacts. The first 300 will arrive as a CSV. Use these exact column headers so GHL maps them on import without manual field matching.

Required columns (GHL standard contact fields)

CSV column header GHL field Notes
Business Name contact.company_name The business name. This is the primary merge field used in the email copy. Maps to GHL's Company Name field.
Email contact.email 300 of 300 populated. Send-to field, not used in body copy.
Phone contact.phone 98.4% populated. Use E.164 format (+1XXXXXXXXXX).
City contact.city 300 of 300 populated.
State contact.state 300 of 300 populated. Two-letter abbreviation.
First Name contact.first_name Empty on all 300 rows in batch 1. Include the column but leave it blank. Do not populate with guesses.
Last Name contact.last_name Include if available, otherwise leave blank.
Address 1 contact.address1 Street address, if available.
Postal Code contact.postal_code
Website contact.website Business website URL
Tags contact.tags Pipe-separated if multiple. Use: birdseye-prospect as the base tag.

Custom fields (create these in GHL before import)

CSV column header GHL custom field name Field type Notes
Niche Niche Single line text Values: Roofing, HVAC, Plumbing, Electrical, Restoration
ICP Type ICP Type Dropdown Values: Local Service Owner, Agency
LinkedIn URL LinkedIn URL Single line text Used by LinkedIn task steps in the workflow. Empty is fine.
Monthly Call Volume Monthly Call Volume Number If known from enrichment. Empty is fine.
Number of Providers Number of Providers Number If known from enrichment. Empty is fine.

Import settings in GHL

  • Go to Contacts > Import > Upload CSV
  • Map columns using the headers above
  • Set "Do Not Import Duplicates" to ON (match on email OR phone)
  • Do NOT add contacts to any workflow on import. The workflow is PAUSED.
  • Add the tag birdseye-prospect to all imported contacts
  • After import, manually create opportunities in the "BirdsEye Sales Pipeline" at the "Identified" stage for each contact. This is what triggers the workflow enrollment once the workflow is published.

Part 5: Build Checklist

Complete in this exact order. Do not skip ahead.

Pre-build

  • Log into BirdsEye ROI sub-account (location r8N6VQLFYrBCML2ZgYiO)
  • Confirm you are in the correct sub-account by checking Settings > Business Info > name says "BirdsEye ROI"

Custom fields (do before import or workflow)

  • Create custom field: "Niche" (single line text)
  • Create custom field: "ICP Type" (dropdown: Local Service Owner, Agency)
  • Create custom field: "LinkedIn URL" (single line text)
  • Create custom field: "Monthly Call Volume" (number)
  • Create custom field: "Number of Providers" (number)

Pipeline

  • Create pipeline: "BirdsEye Sales Pipeline"
  • Add stage 1: Identified
  • Add stage 2: Engaged
  • Add stage 3: Discovery
  • Add stage 4: Demo
  • Add stage 5: Proposal
  • Add stage 6: Closing
  • Add stage 7: Won
  • Add stage 8: Lost
  • Verify all 8 stages appear in order

Email templates (create all 8)

  • Create template: "BirdsEye Cold 1: Which Calls Paid" (paste subject, preview text, body from Part 2)
  • Create template: "BirdsEye Cold 2: 42 Percent Spam"
  • Create template: "BirdsEye Cold 3: Four Dashboards"
  • Create template: "BirdsEye Cold 4: The Proof Email"
  • Create template: "BirdsEye Cold 5: Break-Up"
  • Create template: "BirdsEye Nurture 1: The One Screen"
  • Create template: "BirdsEye Nurture 2: The Objection"
  • Create template: "BirdsEye Nurture 3: Close or Keep Open"
  • Verify all 8 templates render correctly in preview (check merge field syntax)
  • Verify no em dashes appear anywhere in any template

Cold outreach workflow

  • Create workflow: "BirdsEye Cold Outreach: 9 Touch, 21 Day"
  • Set status to DRAFT / PAUSED immediately on creation
  • Set enrollment trigger: contact added to "BirdsEye Sales Pipeline" in "Identified" stage
  • Set workflow goal: contact replies (any channel) > remove from workflow
  • Add step 1: Send email, template "BirdsEye Cold 1: Which Calls Paid" (day 0)
  • Add wait: 1 day
  • Add step 2: Create task, LinkedIn connection request (day 1)
  • Add wait: 2 days
  • Add step 3: Send email, template "BirdsEye Cold 2: 42 Percent Spam" (day 3)
  • Add wait: 2 days
  • Add step 4: Create task, phone call, no voicemail (day 5)
  • Add wait: 2 days
  • Add step 5: Send email, template "BirdsEye Cold 3: Four Dashboards" (day 7)
  • Add wait: 3 days
  • Add step 6: Create task, LinkedIn share infographic (day 10)
  • Add wait: 2 days
  • Add step 7: Send email, template "BirdsEye Cold 4: The Proof Email" (day 12)
  • Add wait: 3 days
  • Add step 8: Create task, phone call with voicemail (day 15)
  • Add wait: 3 days
  • Add step 9: Send email, template "BirdsEye Cold 5: Break-Up" (day 18)
  • Add wait: 3 days
  • Add step 10: Add tag "90-day-reapproach"
  • Add step 11: Move opportunity to "Lost"
  • Add step 12: Create task, "90 day re-approach" reminder
  • Verify workflow is still in DRAFT / PAUSED status
  • Do NOT publish

Nurture workflow

  • Create workflow: "BirdsEye Post-Demo Nurture: 3 Touch"
  • Set status to DRAFT / PAUSED immediately on creation
  • Set enrollment trigger: contact moves to "Proposal" stage + has tag "demo-completed" + does NOT have tag "closed-won"
  • Set workflow goal: contact replies (any channel) > remove from workflow
  • Add wait: 3 days (delay before first nurture email)
  • Add step 1: Send email, template "BirdsEye Nurture 1: The One Screen"
  • Add wait: 6 days
  • Add step 2: Send email, template "BirdsEye Nurture 2: The Objection"
  • Add wait: 8 days
  • Add step 3: Send email, template "BirdsEye Nurture 3: Close or Keep Open"
  • Verify workflow is still in DRAFT / PAUSED status
  • Do NOT publish

Post-build verification

  • Open pipeline, verify all 8 stages are present and in order
  • Open each email template, verify merge fields render correctly (only {{contact.company_name}} is used in bodies, no {{contact.first_name}} anywhere)
  • Verify no email has a "Hi" or "Hello" salutation. Emails 2, 4, and Nurture 2 have no salutation at all. That is correct.
  • Open cold workflow, count exactly 9 action steps plus wait steps and the post-sequence cleanup
  • Open nurture workflow, count exactly 3 email steps plus the initial 3-day wait
  • Confirm both workflows show DRAFT / PAUSED status
  • Confirm zero contacts exist in the pipeline (no contacts imported yet)

Part 6: Gaps and open items

Item Status Detail
Email sender identity GAP The templates use {{signature}} as a placeholder. GHL needs a configured sender (from name, from email, reply-to). This must be set in Settings > Email Services before any workflow sends. Not in the copy docs.
Agency vs. owner subject line swap MANUAL GHL does not natively A/B by a custom field value in a workflow email step. To send the agency variant subject line to ICP B contacts, either: (a) create a parallel workflow with an If/Else on the "ICP Type" custom field branching to a duplicate email step with the agency subject, or (b) use the local service owner subject as the default for all and swap manually for agency batches. Option (a) is cleaner but doubles the email steps.
Spam split infographic for LinkedIn day 10 CLOSED Asset produced by Picasso. Specs in marketing/infographic-specs.md. Retina PNG at marketing/infographics-png/01-the-spam-split.png. The day 10 task step in the cold workflow references this file path. Upload to a public URL or attach directly when the LinkedIn touch is executed.
Sender domain and warmup GAP No sending domain is configured in the BirdsEye ROI sub-account. Before any email sends: configure a sending domain, verify DNS (SPF, DKIM, DMARC), and warm the domain. Cold outreach at 300 contacts on a fresh domain will land in spam.
A2P registration NOT NEEDED YET No SMS is sent in either workflow. If SMS touches are added later, A2P must be completed first per ghl-a2p-compliance.
Workflow goal: reply detection VERIFY GHL workflow goals detect email replies natively. Phone call replies (inbound calls) may need a separate trigger or a "Call Status" event. Verify that the workflow goal fires on inbound phone calls, not just email replies. If it does not, add a separate If/Else branch after the phone task steps that checks for a recent inbound call from the contact.
90-day re-approach automation PARTIAL The cold workflow tags contacts with 90-day-reapproach and creates a task. There is no automated wake-up after 90 days. Either: (a) create a third workflow triggered by the tag that waits 90 days then creates a follow-up task, or (b) handle the 90-day check manually in weekly pipeline reviews. Option (b) is fine for 300 contacts.