Everything we built, and how.
A workstream-by-workstream record of the HubSpot system — what was configured, how it's structured, how it works, and the gotchas. Detailed enough for any HubSpot admin to maintain or rebuild it. Open items live in Next Steps.
Status legend — Live · Partial / in progress · Built but off · Designed, not built. Each section flags its state and any divergence from the original January plan.
The property layer
Before anything could be automated, the instance was cleaned and re-propertied. Three-plus years of tool debt (Apollo, Warmly, ClearOut, and legacy "Marcelo-era" fields) were archived and a clean set of custom properties added.
80+ legacy fields archived
"Company Type" un-overloaded
Lifecycle score thresholds set
Custom properties
| Property | Object | Purpose / state |
|---|---|---|
| Customer Status | Contact + Company | Relationship status; automated from lead status/deals |
| Customer Type | Contact + Company | Partner segment (MSP/GSI/SI/ISV/Distributor); mirrored both ways |
| Territory Owner | Company + Contact | The real owner (set by routing); legacy owners hidden |
| Territory Owner Lock | Company | Manual checkbox; stops routing override (per Mason) |
| Named Account | Company (checkbox) | Bypasses geo routing |
| Named Account Owner | Company + Contact | Rep who owns the named account |
| Region | Contact | Routing property |
| ICP Segment | Company + Contact | Small/Mid/Large MSP, Enterprise Direct, Not ICP (needs contact↔company mapping automation or it won't show on the contact card) |
| Score Tier | Contact | Hot/Warm/Cold shell — awaiting scoring activation |
| Has Open Deal / Has Closed-Won Deal | Company (checkbox) | Protects accounts during routing re-runs |
| AWS Competencies | Company (dropdown) | ~27 AWS competencies (Cloud Ops, Data & Analytics, DevOps, Migration & Modernization, SaaS, Security, Storage, SAP, …) |
| AWS Partner Programs | Company (dropdown) | AWS program memberships (MSP, etc.) |
| Closed Lost Reason | Deal | Required at Closed Lost (9 reasons) |
| Competitor Name | Deal | Conditional — appears when reason = "Chose Competitor" |
| Scoring shells | Contact + Company | Combined Score, Combined MQL Score, demo/behavioral scores, Account Type — shells, awaiting scoring |
| SCA Approved / SCA Source | Contact + Company | Created early, then de-emphasized/removed from the card — SCA folded into normal scoring (+6) |
Required-at-close fields
PLAN → BUILT
Watch-outs
- Deprecated-property cleanup is only partial. Many in-use legacy fields were left in place (archiving deferred pending a client list of "keep vs. kill"). See Next Steps.
- Some scoring/segment properties exist as shells and won't populate until scoring is turned on.
Lead Status in, everything else out
This is the backbone described on the System Overview. Reps set Lead Status; a chain of "Do Not Touch" workflows derives Lifecycle Stage, Customer Status, and downstream actions.
Lead Status reference
| Lead Status | How it's set | Lifecycle result |
|---|---|---|
| New | Auto on record creation | Lead |
| MQL | Auto — score ≥ 50 (contact AND company) or a marketing-qualified form | MQL |
| In Progress | Auto when rep activity (emails/calls) is detected | MQL |
| Meeting Booked | Auto when a meeting is logged | SQL |
| Open Deal | Auto when a deal enters the pipeline | Opportunity |
| Cold | Auto after 90 days with no activity | (no change) |
| NQ – Other / Partner / Vendor / Competitor | Manual (rep) | (no change; automates status) |
| Do Not Contact | Manual (rep) | (no change) |
How the cascade works
Ops - Lead Status Automationsreads engagement and sets Lead Status (activity → In Progress; 90-day silence → Cold).Ops - Lead Status → Lifecycle (Do Not Touch)maps Lead Status → Lifecycle Stage.Ops - Contact → Company Lifecycle Promotion (Do Not Touch)rolls the highest contact lifecycle up to the Company; the sync + backup workflows copy it back down.OPS: Deals: Closed/Won = Customerflips Customer Status to Active Customer on a won deal (closed-lost can route to Churn). Built, but confirm this specific trigger is actually firing — it was never fully verified.Ops - Email Opt Out - Non Marketing Contactmoves unsubscribes to non-marketing;Ops - MontyCloud Internal Routingtags internal-domain contacts.
Customer Status values
Watch-outs
- Several Customer Status automations are not finished: Churned (intended to read Day2 subscription data), Hyperscaler (needs an azure/gcp domain list from Ann Marie), Amazon routing, and Nurture.
- New lead-status values (Cold, DQ) still need to be added and wired into dependent workflows.
- A workflow to sync Lead Status contact → company was flagged as still to-build.
- Closed Lost → Customer Status mapping rows in the tracker are marked "Janae to update and explain."
One clean pipeline, standardized quotes
The old prospect-heavy, multi-pipeline mess was consolidated into a single pipeline with required exit criteria and automatic deal creation, plus standardized quote templates.
As-built pipeline
| Stage | Prob. | Purpose | Exit criteria |
|---|---|---|---|
| Prospect | 1% | Entry/holding concept (not a rep-worked stage) | Meeting booked → Qualified |
| Qualified | 10% | Rep confirmed fit/BANT/champion | Demo done, ROI criteria identified, stakeholders mapped |
| Tech Validation | 20% | Customer evaluating via POC | Solution matches reqs, champion validated, MNDA signed |
| Business Validation | 50% | Deep technical + business validation, ROI | Customer agrees solution meets requirements |
| Negotiate | 80% | Final proposal/pricing, MSA/SOW | Verbal/written commitment, MSA redlines complete |
| Contract | 90% | Awaiting signature, contract/PO in process | Routed for internal approval |
| Closed Won | 100% | Signed & executed | Deal amount confirmed |
| Closed Lost | 0% | Formally lost | Reason selected; competitor name if applicable |
How it works
- Single pipeline; all deals migrated in. Legacy "Stalled" deals mapped to Closed Lost ("Decision Delayed / No Decision") via a one-off workflow.
- Exit criteria = required multi-select checkboxes that pop up when a rep drags a deal forward. Skip them and the deal bounces back.
- Required at entry (Qualified): associated Contact + Company, deal amount, close date, owner.
- Automatic deal creation in Qualified when Lead Status = Open Deal or a meeting is booked. This workflow is currently OFF.
- Closed Lost reasons (9, required): No Budget · Timing – Revisit Later · Chose Competitor (reveals Competitor Name) · No Decision · Not a Fit – Technical · Not a Fit – Business · Champion Left · Wrong Contact · Duplicate.
Quotes / CPQ
- Product library — 5 SKUs: MSP
MC-MSP-001· MigrationMC-MIG-001("$0 — AWS funded") · AssessmentMC-ASSESS-001· AIMC-AI-001("20% of contract") · Marketing FeeMC-MKT-001. - 3 quote templates (MSP, Migration, Assessment) built from HubSpot's "basic" template + editable snippets. Purchase Terms split across multiple snippets — reps must insert both parts.
- Fields auto-pulled: Contract Type, Customer Name, Discount, AWS Credits, Contract Term, AWS Spend, Price, Price Percent.
- Deal card reorganized: quotes & line items moved to top; tickets and unused fields removed.
Incident — duplicate deals (fixed; creation workflow still off)
PLAN → BUILT
Quote snippet bug (open, ~2 months)
Watch-outs
- Snippet visibility: an admin without a Sales seat sees only some snippets (the MSP snippet was hidden) — confirm seat/permissions.
- Minor quote-template fixes: "[CUSTOMER NAME]" not rendering dynamically, a "$$" double-dollar artifact, unclear "Price Percent" source, Assessment template needs final snippet language, "can we delete the old products?" cleanup.
- The Quote Request – Internal workflow (prompt a quote at Negotiation) is spec'd but its acceptance-criteria checkboxes are unchecked — verify it's enabled.
Automatic, company-level routing
Accounts route to reps automatically by company headquarters; named accounts bypass geography and are assigned by hand. This was the single most-iterated part of the build and still needs a clean re-run (see Next Steps).
How routing works
Is it a Named Account? Yes → skip geographic routing; the Named Account Owner is used (mirrored into Territory Owner by an owner-fields clone workflow). No → continue.
Read location. Ops - Sales - Territory Routing - 2026 checks State + State/Region code and/or Country + Country code — matching both abbreviations and full names (e.g., "MD" and "Maryland").
Match → assign. The matching branch rotates the record owner to that territory's owner. Ops - Company to Contact - State/Country Routing first copies company location down to contacts.
No location → catch-all. Routes to Ryan Broderson (previously Ann Marie for unassigned/LATAM, since migrated to Ryan/Diana).
Protect & clean. Customers and open deals keep their owner on re-run; Ops - Deactivated Owners - One off - ReRoute clears owners who've left.
Owner model
Territory table — as-built ("UPDATED ROUTING 5/8/2026")
| Rep | Territory | Example Named Accounts |
|---|---|---|
| JD Romero | MA, ME, NH, VT, RI, CT; Canada (East); EMEA/UKI | Ensono, phData, Opti9, Bespin Global, Xebia |
| Matt Gross | US West: CA, WA, OR, AK, HI | Yash, nClouds, DinoCloud, Insight, TrustSoft, Optic, Epi-Use, StormReply, Noventiq, Macedon, Teleperformance |
| Nicole Francese | NJ, NY, PA, DE | Futuralis, Deloitte, Arvato, Future Processing, Versent, KO Technologies, Elastic Scale, Data Art, Mastercard, Intellias |
| Paola Garcia | FL, GA, NC, SC, AL, MS, KS, LA, OK, TN, AR, VA, MD, DC | — |
| Sam Hess | US Central + Mountain: OH, WI, MO, NE, MN, MI, KY, IN, IL, IA, WV, TX, WY, UT, NV, ID, CO, AZ, ND, SD, NM, MT | Synthesis, DXC, Pellera, Trinetix, SoftChoice, Quest Global, N-iX |
| Ryan Broderson | Named Accounts + unassigned catch-all | SHI, Megazone, Accenture, Slalom, Presidio |
| Diana Molina | LATAM | — |
| Marketing Owner | Free-email / no-company (Gmail, Yahoo, AOL) → Nurture | — |
This is the granular admin version. The rep-facing Sales Playbook shows a simplified table with "temp" regions called out so a new hire can be slotted in without rebuilding routing.
Named accounts — supporting objects
Ops - Named Accounts - 2026 (live), plus static backups Ops - Named Account - Static - Feb 2026 - Backup List and Ops - Backup List - Static - Company Owners - Feb 2026. Mirror workflows: Ops - Named Account - Company to Contact, Ops - Named Account - Value Clone, and the May-2026 Named Account - Owner Fields Clone.PLAN → BUILT
This is the big one — see Next Steps P0
- Named-account flag is massively over-applied: ~4,400 contacts / ~2,700 companies are flagged "Named Account," but those are really the old ~2,500–3,000-account SCA target list. The truly strategic count is far smaller — Ryan has put it as low as ~3. The per-rep "named account" lists reflect the same definition gap between "named account" and "territory-owned account" that needs locking down.
- Routing was re-run ~10 times and still has edge cases: ~190 contacts lingered on Ann Marie; reps still occasionally get others' accounts; a lingering legacy MontyCloud workflow is suspected of overriding the new routing.
- Region automation is not built ("not clear how to do US"); the data-hygiene workflow is flagged "turn off filters & re-test AFTER routing is cleaned up."
- The clean fix (a full wipe-and-re-run, ~1–1.5 hrs) is blocked on a final territory list + final named-account list from Ryan.
The model is built, not turned on
A complete scoring model ("Revised Scoring 4.0") is designed and is ready in the system. Pending Ryan and Ann Marie's final approval.
Architecture (intended)
Revised Scoring 4.0 — Fit
| Signal | Points |
|---|---|
| Title: VP / Director / Head / C-Suite | +15 |
| Title: Manager / Cloud / AWS / Infra | +5 |
| Personal email | −5 · Student/Intern −10 |
| Contact negatives: Competitor / Vendor / Amazon | −50 · Unsubscribed −50 |
| Customer Type: MSP +7 · GSI +7 · SI +5 · Distributor +3 · ISV +3 | (company) |
| ICP Segment: Small +1 · Mid +3 · Large +5 · Enterprise Direct +7 · Not ICP 0 | (company) |
| Named Account +5 · SCA Approved +6 | (company) |
| Revenue: $100K–999K −10 · $1M–9.9M +2 · ≥$100M +4 | (company) |
| Caps | Contact-demo 25/35 · Company-demo 40/55 |
Revised Scoring 4.0 — Engagement
| Signal | Points |
|---|---|
| Form submission (main/additional) | +50 (cap 50) |
| Form view | +10 |
| Pricing / Demo page | +10 (cap 20) |
| Any page (2–4) | (cap 10) |
| Opened emails | +2–3 (cap 15) |
| Clicked | +5 / +10 / +15 (cap 20) |
| Meeting booked | +50 |
| Last activity / last engagement | +5 down to −10 / +3–5 |
Thresholds & combine logic
1 - build company score to contact record and 2 - combine scores: Combined MQL Score = (Contact Combined Score × 0.6) + (Company Score on Contact × 0.4) → set Lifecycle = MQL when both ≥ 50.PLAN → BUILT
Cleaned the database — and how to keep it clean
A full dedup was completed; two integrations still create new duplicates over time and need a configuration fix at the source.
Data Hub Pro purchased
Full dedup completed (~23 Apr 2026)
Missing-company enrichment
Ops - Company Name association workflow + an enrichment pass cut the "no associated company" list from ~7,000 down to ~2,600 records.PLAN → BUILT
Watch-outs
- Duplicates are still being created post-dedup. Root cause: Lusha (enrichment) and likely the Day2 lead integration / legacy Apollo create new company objects instead of enriching the existing one. The fix lives in those integration settings (owned within MontyCloud, with Madhavi for Day2) — see Next Steps P0-4.
- ~3,500 contacts have no company and no owner (surfaced Mar 17); the assignment decision was never finalized.
- Dedup caveat: some legacy Apollo records share a company name but a totally different domain (AOL/Yahoo) — a few merges may be wrong and need a manual un-merge.
- The third-party dedup tool (Dedupe.ly) was canceled; ongoing dedup is now handled manually via HubSpot Data Ops. A short Data Ops list-management training was prepared for Alana — she should own this going forward.
HubSpot for inbound, Salesloft for outbound
The plan was to retire Salesloft into HubSpot Sequences; in practice MontyCloud kept Salesloft, so the two run side-by-side for now.
What was built
- HubSpot Sales Workspace per rep — meetings, in-territory prospects, open deals, and call/connection tasks, with sequence steps that branch on website engagement / deal stage.
- Salesloft → HubSpot rebuild: the team's top cadence (AWS MSP 25 Day Outbound, Sam Hess's) was rebuilt in HubSpot.
- Inbound speed-to-lead workflow: form → enrich → territory route → auto-enroll in the territory rep's sequence (sent from the rep's own outbox); unrouted → Ryan. Currently OFF — gated on correct territories + scoring.
- Email-send cap per user to prevent a repeat of an earlier deliverability issue.
- Inbound Demo Request sequence drafted with email copy + call guidance for RevOps mark-up.
Sequences to build (tracker — owner Janae, In Progress; none confirmed live)
| # | Sequence | Trigger / purpose |
|---|---|---|
| 1 | SCA Outbound | Work the ~2,500–3,000 SCA list — migrate from Salesloft (build first) |
| 2 | MQL Standard | Follow up qualified leads (score ≥ 50, no deal) |
| 3 | Inbound Hot Lead | Speed-to-lead for score 100+ / demo requests |
| 4 | Event Follow-Up | Post-event engagement (re:Invent, summits) |
| 5 | Post-Discovery Stall | Keep stalled deals moving |
| 6 | Timing Revisit | Re-engage "not now" (Closed Lost = Timing, +90 days) |
PLAN → BUILT
Every workflow, by state
About 38 workflows run the system, all prefixed Ops -. Below is the inventory by state. Every workflow lives in your HubSpot portal (Hub ID 22107327); the inventory below is the on-site reference. Workflows ending in (Do Not Touch) are the lifecycle backbone — don't edit them.
| Workflow | What it does |
|---|---|
Ops - Sales - Territory Routing - 2026 | PRIMARY territory/owner assignment by location |
Ops - Company to Contact - State/Country Routing | Copies company location to contacts (enables company-level routing) |
Ops - Sales - Territory Routing - Regions | Sets the Region property |
Ops - Company Territory Owner - Data Hygiene | Copies Territory Owner to other owner fields (re-test after routing cleanup) |
Ops - Deactivated Owners - One off - ReRoute | Clears departed users as owner and reassigns |
Territory Owner Clone to Owner Fields (May 2026) | Re-maps owner fields from Territory Owner |
Named Account - Owner Fields Clone (May 2026) | Clones Named Account owner into territory/company/contact owner |
Ops - Named Account - Company to Contact | Pushes NA status (Yes/No/Unknown) to associated contacts |
Ops - Lead Status Automations | Sets lead status from engagement activity |
Ops - Lead Status → Lifecycle (Do Not Touch) | Lead Status drives Lifecycle Stage |
Ops - Contact → Company Lifecycle Promotion (Do Not Touch) | Rolls contact lifecycle up to company |
Ops - Company → Contact Lifecycle Sync (Do Not Touch) | Copies lifecycle back down to contacts |
OPS: Deals: Closed/Won = Customer | Won deal → Customer (built; confirm this trigger is actually firing — never fully verified) |
Ops - Company Status to Contact Status | Syncs status across company and contacts |
Ops - Email Opt Out - Non Marketing Contact | Unsubscribes → non-marketing |
Ops - Company Name association | Sets company name where missing |
Ops - MontyCloud Internal Routing | Internal-domain contacts → Account Type "Internal" / status "Other" |
| Workflow | Why off |
|---|---|
Ops - Lead Status = Open Deal → Deal Creation | Creates a deal at Qualified when lead status = Open Deal. Off since the duplicate-deals incident — turn on after sign-off. |
Ops - Unknown Company - Routes Contacts to Holding Pattern | "Waiting for Ann Marie approval." |
| Workflow | Purpose |
|---|---|
1 - build company score to contact record | Copy company combined score to the contact (scoring-dependent) |
2 - combine scores | Combined MQL Score = Contact×0.6 + Company×0.4 → set MQL when both ≥ 50 (scoring-dependent) |
Customer Status - Amazon Routing | Flag Amazon, DQ as vendor |
Customer Status - HyperScaler Routing | Flag azure/gcp — blocked: needs domain criteria from Ann Marie |
| Lead Status contact → company mirror | Sync lead status up to company (flagged to-build) |
Lists & suppression
| List | State |
|---|---|
Ops - Named Accounts - 2026 | Live (current NA list) |
Ops - Named Account - Static - Feb 2026 - Backup List | Built (pre-implementation snapshot) |
Ops - Backup List - Static - Company Owners - Feb 2026 | Built (pre-go-live owner snapshot) |
Ops - Non marketing Contact | Live |
Suppression - Unsubscribe Emails / Spam | Built |
Suppression - Hard DQ / Soft DQ | OPEN — need criteria + workflows once lifecycle scoring is final |
Suppression - PRIMARY - ALL | OPEN — aggregator that should feed from all suppression lists (not built) |
Prepared by The Matchbox · June 2026 · Internal handoff · HubSpot portal 22107327.