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 implementerEach 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.
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.
CSV uploads to HubSpot Companies via a recurring import or API push. Custom USR properties update on each lab. Quartile changes trigger a workflow.
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).
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.
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.
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.
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. |
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. |
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. |
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.
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"
usr_org_id — must be unique and durable. Primary join key in HubSpot. If a lab's name changes, this stays.director_owner_id — HubSpot Owner ID of the Regional Director, not a name. Maps to hubspot_owner_id on the Company.owner_email — primary lab operator's email. If empty, the row imports but the contact is flagged for manual update before sequence enrollment.usr_last_used — ISO 8601 date (YYYY-MM-DD). Empty if no assessments ever.usr_quartile — string literal: Q1, Q2, Q3, Q4, or NA.usr_org_id exact match → update; no match → create new Company.usr_quartile ≠ usr_previous_quartile), then sets usr_quartile_change and overwrites usr_previous_quartile with the new value.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.
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.
# 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
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.
Replace each {{PLACEHOLDER}} in the Action Plan Templates with the corresponding HubSpot personalization token before pasting into Sequences. Token syntax shown below.
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.
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.
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.