IV · Implementation Spec · For Engineering / Ops

Automation Spec

How to wire the Director → Lab outreach system through HubSpot Sequences and OpenPhone. Emails send from the Customer Success team's inbox with the Regional Director and Brock auto-CC'd; texts come from each Director's actual cell. Includes property schema, monthly export contract, sequence routing logic, and HubSpot-tokenized templates.

Internal · For Nate, Drew, or implementer

Contents

  1. System Overview
  2. HubSpot Property Schema
  3. Monthly CSV Export Contract
  4. Sequence Logic & Routing
  5. HubSpot-Tokenized Templates
  6. OpenPhone Setup (SMS)
  7. Build Effort & Sequencing
I · System OverviewWhat we're building

One pipeline, two channels, one sender model.

Each month, the USR analytics export refreshes lab metrics in HubSpot. A workflow re-classifies every lab into a quartile (Q1–Q4) and routes outreach. Emails send from the Customer Success team's inbox with the Regional Director and Brock auto-CC'd — so the lab gets a single thread with everyone in the loop. Texts come from the Director's personal cell via OpenPhone, used for high-priority Q3/Q4 follow-up.

1

Monthly USR data export

USR analytics generates a CSV with every lab's current metrics, computed quartile, assigned Director, and previous quartile. Triggered on the 1st of the month or on demand.

Owner: Nate / Eng · Cadence: Monthly · Output: usr_monthly_export.csv
2

HubSpot import & property update

CSV uploads to HubSpot Companies via a recurring import or API push. Custom USR properties update on each lab. Quartile changes trigger a workflow.

Owner: Ops · Mechanism: HubSpot API or scheduled import
3

CS-sent email · Director + Brock auto-CC'd

Workflow assigns the lab's primary contact to a CS rep (round-robin or by Director region). CS rep enrolls the contact in the appropriate Q-tier Sequence. Email sends from the CS rep's inbox; HubSpot's Sequence settings auto-CC the assigned Regional Director (hubspot_owner_id) and Brock (static CS lead address).

Owner: HubSpot · Mechanism: Sequences with auto-CC config
4

SMS via OpenPhone (Director sends, parallel)

For Q3/Q4 labs only, workflow triggers a webhook to OpenPhone 24 hours after email. Text sends from the Director's OpenPhone number (their cell with business line forwarding) using the Q-tier SMS template — keeps the personal touch without the CC weight of email.

Owner: HubSpot + OpenPhone · Mechanism: Native integration or Zap
5

Booking & reply tracking

Calendar links are Director-specific Calendly URLs (the call is with the Director, not CS). Replies come back into the email thread visible to CS, Director, and Brock. Booking events sync to HubSpot. CS sees daily digest of who booked, who replied, who needs a follow-up nudge.

Owner: HubSpot · Mechanism: Sequence reply detection + Calendly integration
II · HubSpot Property SchemaCompanies + Contacts + Owners

What needs to exist in HubSpot.

No USR-specific custom properties exist on Companies today (verified via search). Every property below is net-new. Naming convention: usr_* prefix to keep them grouped.

Speed Lab → HubSpot Company

Each Speed Lab maps to one HubSpot Company. Use Company name to match against the lab_name field; create new companies for any unmatched rows.

Property Name Type Required Description / Values
usr_org_id number Required USR DB primary key. Used as the durable join key — never changes.
usr_community_id number Optional USR community ID for the lab's roster. May be one of several per org.
usr_quartile enumeration Required Values: Q1, Q2, Q3, Q4, NA (no data)
usr_score number (0–100) Required Composite engagement score. National average = 50.
usr_previous_quartile enumeration Derived Quartile from prior month's import. Workflow sets this from usr_quartile before overwriting.
usr_quartile_change enumeration Derived Values: improved, declined, unchanged. Triggers different sequence variants.
usr_ytd_tests number Required YTD assessment count for current calendar year.
usr_30d_tests number Required Assessments in last 30 days.
usr_90d_tests number Required Assessments in last 90 days.
usr_lifetime_tests number Required All-time assessment count.
usr_athlete_count number Required Unique athletes ever assessed.
usr_last_used date Required Date of most recent assessment. Drives Q4 urgency messaging.
usr_segment enumeration Optional Values: Lone Wolf, Sustainable, Growing, New Vertical
usr_region enumeration Required Values: Northeast, Southeast, Midwest, Southwest, Northwest, Founders, Unassigned
hubspot_owner_id number Required Standard HubSpot field. Set to the Director's Owner ID — drives sequence "send from" identity.

Lab Owner → HubSpot Contact

The lab's primary owner/operator is a Contact, associated to the Speed Lab Company.

Property Name Type Required Description / Values
firstname / lastname string (standard) Required Standard HubSpot. Used in {{ contact.firstname }} token.
email / phone string (standard) Required Standard HubSpot. Email used for sequence delivery; phone for OpenPhone SMS.
usr_is_lab_owner boolean Required Marks this contact as the primary outreach target for the Company. Only one per Company.

Director → HubSpot Owner

Each Regional Director is an existing HubSpot Owner (user). One small property addition on the Owner / User record:

Field Where Description
calendly_url User custom field Each Director's personal Calendly link. Inserted into all sequence templates as {{ owner.calendly_url }}.
director_phone User custom field OpenPhone number for SMS. Used in Q4 email signature.
region User custom field Director's region label. Inserted as signature line.
III · Monthly CSV Export ContractUSR analytics → HubSpot

The CSV that bridges USR analytics and HubSpot.

Generated from the USR analytics database on the 1st of each month. One row per Speed Lab. Imports directly into HubSpot Companies via the Imports API or a recurring scheduled import.

File: usr_monthly_export_YYYY_MM.csv

# Header row — exact column names matter for HubSpot mapping
usr_org_id,usr_community_id,company_name,owner_first_name,owner_last_name,
owner_email,owner_phone,director_owner_id,usr_region,usr_segment,
usr_ytd_tests,usr_30d_tests,usr_90d_tests,usr_lifetime_tests,
usr_athlete_count,usr_last_used,usr_score,usr_quartile

# Sample row
1842,559,"The Performance Lab","Josh","Henderson",
"josh@theperformancelab.com","+16195551234",71204881,
"Southwest","Growing",12047,2127,5682,67975,
2213,2026-04-30,99,"Q1"
Quartile is computed at export time The quartile column is derived in the export script from the score percentile across all active labs. HubSpot doesn't compute it — it just receives and stores. This keeps the math in one place (USR analytics) and makes HubSpot the system of record for outreach state, not analytics.

Column rules

Import process (recurring)

  1. Engineering generates the CSV on the 1st of each month and drops it in a shared Drive folder (or sends to a HubSpot import endpoint via API).
  2. HubSpot scheduled import (or API push) updates Companies. Match logic: usr_org_id exact match → update; no match → create new Company.
  3. HubSpot workflow detects quartile change (usr_quartileusr_previous_quartile), then sets usr_quartile_change and overwrites usr_previous_quartile with the new value.
  4. Contact (lab owner) is enrolled in the appropriate Director's quartile-tier sequence.
IV · Sequence Logic & RoutingPer-Director, per-quartile

4 sequences, sent from CS, Director + Brock auto-CC'd.

HubSpot Sequences send from the enrolling user's connected inbox. The CS rep (or shared CS inbox) enrolls each lab — so the same Q1 sequence sends from the CS account in every case. The Director identity is preserved via auto-CC and inline mentions in the body, not sender. This avoids 14 × 4 = 56 sequence variants and keeps a single source of truth for copy.

Sequence inventory

Each sequence is 3 steps: initial email (Day 0), nudge (Day 4), final follow-up (Day 9). Reply or booking pauses sequence automatically.

All four sequences are configured to auto-CC the lab's hubspot_owner_id (Director) and a static address (Brock) on every send. This is set once at the sequence level in HubSpot — no manual CC needed per send.

Workflow logic (HubSpot)

# Trigger: Company property change → usr_quartile_change is "improved", "declined", or "unchanged" with score < 30

IF usr_quartile == "Q1" AND usr_quartile_change IN ["improved", "unchanged"]:
   → assign CS rep (round-robin or by Director region)
   → CS rep enrolls lab-owner contact in "USR — Q1 Top Performer Outreach"
   → sequence auto-CCs Director (hubspot_owner_id) and Brock

IF usr_quartile == "Q2":
   → enroll in "USR — Q2 Solid Performer Outreach"

IF usr_quartile == "Q3":
   → enroll in "USR — Q3 Below Average Outreach"
   → 24h after email: trigger OpenPhone SMS from Director's number

IF usr_quartile == "Q4" OR (usr_quartile_change == "declined" AND usr_quartile == "Q3"):
   → enroll in "USR — Q4 At-Risk Outreach"
   → 24h after email: trigger OpenPhone SMS from Director's number
   → also: notify Director + Brock via Slack of at-risk flag
Director-controlled enrollment (recommended for first 2 months) Don't auto-enroll on day one. The workflow sets usr_quartile_needs_outreach = true and surfaces the lab in each Director's daily HubSpot dashboard. Director clicks "Enroll" on each lab once — their email signature, calendar link, and tone all auto-populate. After two months of monitoring, flip to fully automated.
V · HubSpot-Tokenized TemplatesDrop-in for Sequences

Placeholder → HubSpot token mapping.

Replace each {{PLACEHOLDER}} in the Action Plan Templates with the corresponding HubSpot personalization token before pasting into Sequences. Token syntax shown below.

Template Placeholder
HubSpot Token
{{CS_REP_NAME}}
{{ sender.fullname }} (auto)
{{CS_REP_EMAIL}}
{{ sender.email }} (auto)
{{OWNER_FIRST_NAME}}
{{ contact.firstname }}
{{OWNER_LAST_NAME}}
{{ contact.lastname }}
{{OWNER_EMAIL}}
{{ contact.email }} (auto)
{{LAB_NAME}}
{{ company.name }}
{{SCORE}}
{{ company.usr_score }}
{{YTD_TESTS}}
{{ company.usr_ytd_tests }}
{{ATHLETE_COUNT}}
{{ company.usr_athlete_count }}
{{30D_TESTS}}
{{ company.usr_30d_tests }}
{{LAST_USED}}
{{ company.usr_last_used }}
{{DIRECTOR_NAME}}
{{ owner.fullname }}
{{DIRECTOR_FIRST_NAME}}
{{ owner.firstname }}
{{DIRECTOR_EMAIL}}
{{ owner.email }} (CC auto)
{{DIRECTOR_PHONE}}
{{ owner.director_phone }}
{{CALENDAR_LINK}}
{{ owner.calendly_url }}
{{BROCK_EMAIL}}
Static CC at sequence level

Example: Q1 email after token replacement

Subject: {{ company.name }} — you're in the top 25% of the USR network

Hi {{ contact.firstname }},

Quick update: I just pulled the latest network benchmark across the
USR Speed Lab network, and {{ company.name }} landed in the top quartile (Q1)
with a composite score of {{ company.usr_score }}.

For context — that puts you above the network average on a blend of YTD,
90-day, and 30-day testing volume plus athlete count. Specifically:

• {{ company.usr_ytd_tests }} YTD assessments (vs. national avg 955)
• {{ company.usr_athlete_count }} active athletes
• {{ company.usr_30d_tests }} tests in the last 30 days

This is real. You're building something the rest of the network is going
to want to learn from.

I'd love to grab 20 minutes to talk through (1) what's working at
{{ company.name }} that we can amplify, (2) where USR can support you to
scale further, and (3) whether you'd be open to being featured as a case
study to other Speed Labs.

Grab a slot here: {{ owner.calendly_url }}

Talk soon,
{{ owner.fullname }}
USR Regional Director — {{ owner.region }}

The other three (Q2, Q3, Q4) follow the same token-substitution pattern. The full set is on the Action Plan Templates page — one find-and-replace pass converts them all.

VI · OpenPhone Setup (SMS)Personal cell, business line

Why OpenPhone over HubSpot's native SMS.

HubSpot SMS (via Twilio) sends from a HubSpot-owned number, which doesn't feel personal coming from a Director. OpenPhone gives each Director a real business line that forwards to their cell, and integrates natively with HubSpot via webhooks.

Per-Director setup

  1. Create OpenPhone account; assign one number per Director (typically area code matching their region).
  2. Forward number to Director's cell — incoming texts and calls hit their phone like normal.
  3. Connect OpenPhone to HubSpot via OpenPhone's native HubSpot integration (1-click in OpenPhone settings).
  4. In HubSpot, create 4 SMS templates (Q1/Q2/Q3/Q4) using the same token syntax as email.
  5. Workflow trigger: when contact is enrolled in Q-tier email sequence, also fire OpenPhone send via webhook 24 hours later (so the lab gets email first, text second).

Per-Director cost

Alternative if OpenPhone is a stretch Start with email-only via HubSpot Sequences for Month 1. Add OpenPhone in Month 2 once we see open-rate data and decide whether the SMS layer materially improves booking rate. Don't let SMS block the launch.
VII · Build Effort & SequencingRealistic estimate

The whole system: roughly one week of focused work.

~6 hrs
HubSpot Setup
Properties + 4 sequences + workflow + Owner fields
~4 hrs
CSV Export Pipeline
First time only; automated thereafter
~14 hrs
OpenPhone Onboarding
~1 hr × 14 Directors, parallelizable
~4 hrs
Director Training
One 30-min Loom + one live Q&A session

Suggested rollout sequence

  1. Week 1 — Nate builds HubSpot property schema; Drew runs first CSV export manually as a test; one Director (Adrian or Cici) pilots Q-tier sequences with their own labs.
  2. Week 2 — Pilot Director gives feedback. Refine sequence copy based on first replies. Email-only, no SMS yet.
  3. Week 3 — Roll out email sequences to remaining Directors. Schedule monthly export cadence. Director-controlled enrollment (one click per lab).
  4. Week 4 — Add OpenPhone for top-engagement Directors first. Layer SMS in for Q3/Q4 outreach (where urgency matters most).
  5. Month 2 — Switch to fully automated enrollment if reply rates are healthy. Add monthly digest report to Directors showing what got booked, replied, ignored.
Hard prerequisite: lab owner contacts in HubSpot The whole system depends on having a primary contact (with email) for each Speed Lab in HubSpot, marked usr_is_lab_owner = true. If contact data is incomplete, the first export will surface that gap fast — bake a "missing contact" QA pass into Week 1.