MontyCloudxThe Matchbox
Operational Build Log

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.

Key takeaway

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.

Live (cleanup partial)
Section 01

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

Deprecated tool fields (Apollo score/status/source, all Warmly_*, ClearOut verification fields) and orphaned legacy fields were archived to de-clutter records.

"Company Type" un-overloaded

The old single field meant two things to two teams. Split into Customer Status (lifecycle/relationship — Finance/Mason) and Customer Type (partner segment — Marketing/Ann Marie).

Lifecycle score thresholds set

Lead 0–49 · MQL 50–99 · Hot Lead 100 (= SQL).

Custom properties

PropertyObjectPurpose / state
Customer StatusContact + CompanyRelationship status; automated from lead status/deals
Customer TypeContact + CompanyPartner segment (MSP/GSI/SI/ISV/Distributor); mirrored both ways
Territory OwnerCompany + ContactThe real owner (set by routing); legacy owners hidden
Territory Owner LockCompanyManual checkbox; stops routing override (per Mason)
Named AccountCompany (checkbox)Bypasses geo routing
Named Account OwnerCompany + ContactRep who owns the named account
RegionContactRouting property
ICP SegmentCompany + ContactSmall/Mid/Large MSP, Enterprise Direct, Not ICP (needs contact↔company mapping automation or it won't show on the contact card)
Score TierContactHot/Warm/Cold shell — awaiting scoring activation
Has Open Deal / Has Closed-Won DealCompany (checkbox)Protects accounts during routing re-runs
AWS CompetenciesCompany (dropdown)~27 AWS competencies (Cloud Ops, Data & Analytics, DevOps, Migration & Modernization, SaaS, Security, Storage, SAP, …)
AWS Partner ProgramsCompany (dropdown)AWS program memberships (MSP, etc.)
Closed Lost ReasonDealRequired at Closed Lost (9 reasons)
Competitor NameDealConditional — appears when reason = "Chose Competitor"
Scoring shellsContact + CompanyCombined Score, Combined MQL Score, demo/behavioral scores, Account Type — shells, awaiting scoring
SCA Approved / SCA SourceContact + CompanyCreated early, then de-emphasized/removed from the card — SCA folded into normal scoring (+6)

Required-at-close fields

Live on the Company "Account Plan" tab, made required when a deal closes: Contact Deal Roles (Exec Leader / Champion / Budget Owner), AWS Monthly Spend, Target Customer Count, Priority Use Cases, Deal Close Date.

PLAN → BUILT

The Jan plan said "use native HubSpot fields, minimize custom properties, build once." In practice the team created a sizeable set of custom AWS fields (Competencies, Partner Programs as dropdowns) — reversing the initial advice — because MontyCloud needed them to drive scoring and ICP. This adds some maintenance overhead but was a deliberate trade-off.

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.
Live
Section 02

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 StatusHow it's setLifecycle result
NewAuto on record creationLead
MQLAuto — score ≥ 50 (contact AND company) or a marketing-qualified formMQL
In ProgressAuto when rep activity (emails/calls) is detectedMQL
Meeting BookedAuto when a meeting is loggedSQL
Open DealAuto when a deal enters the pipelineOpportunity
ColdAuto after 90 days with no activity(no change)
NQ – Other / Partner / Vendor / CompetitorManual (rep)(no change; automates status)
Do Not ContactManual (rep)(no change)

How the cascade works

  • Ops - Lead Status Automations reads 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 = Customer flips 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 Contact moves unsubscribes to non-marketing; Ops - MontyCloud Internal Routing tags internal-domain contacts.

Customer Status values

ProspectActive CustomerChurnedPartnerVendorCompetitorHyperscalerAmazonNurture

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."
Live (quote bug open)
Section 03

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

StageProb.PurposeExit criteria
Prospect1%Entry/holding concept (not a rep-worked stage)Meeting booked → Qualified
Qualified10%Rep confirmed fit/BANT/championDemo done, ROI criteria identified, stakeholders mapped
Tech Validation20%Customer evaluating via POCSolution matches reqs, champion validated, MNDA signed
Business Validation50%Deep technical + business validation, ROICustomer agrees solution meets requirements
Negotiate80%Final proposal/pricing, MSA/SOWVerbal/written commitment, MSA redlines complete
Contract90%Awaiting signature, contract/PO in processRouted for internal approval
Closed Won100%Signed & executedDeal amount confirmed
Closed Lost0%Formally lostReason 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 · Migration MC-MIG-001 ("$0 — AWS funded") · Assessment MC-ASSESS-001 · AI MC-AI-001 ("20% of contract") · Marketing Fee MC-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)

In March, adding contacts spawned duplicate deals. Root cause: a workflow created a deal whenever any contact's Lead Status = "Open Deal," so several contacts at one company each generated a deal. Fix (Mar 30): the workflow was paused, cleaned up, and rebuilt to operate at the Company level. The deal-creation workflow remains OFF pending final sign-off.

PLAN → BUILT

The Jan plan proposed Discovery 10% → Qualified 20% → Tech Val 40% → Business Val 60% → Negotiation 80% and renaming "Prospect" to "Discovery." What shipped follows the GTM team's "RAC" model: Prospect 1% → Qualified 10% → Tech Val 20% → Business Val 50% → Negotiate 80% → Contract 90% → Closed. The rep-facing Sales Playbook shows the worked stages (Qualified → Contract), with Prospect (1%) as a behind-the-scenes entry concept.

Quote snippet bug (open, ~2 months)

Snippet font/color edits don't "stick" — they revert on re-login (e.g., Lexend Deca → default). Escalated to HubSpot Technical Support; flagged a "major priority" by RevOps as deal volume grows. See Next Steps.

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.
Live but needs cleanup
Section 04

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

1

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.

2

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").

3

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.

4

No location → catch-all. Routes to Ryan Broderson (previously Ann Marie for unassigned/LATAM, since migrated to Ryan/Diana).

5

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 Owner is the field that matters; legacy Company/Contact Owner still exist but are hidden. Territory Owner Lock (manual checkbox) prevents the workflow from overwriting a deliberate manual assignment. Deal owner is independent — deals can be passed around without re-routing the account.

Territory table — as-built ("UPDATED ROUTING 5/8/2026")

RepTerritoryExample Named Accounts
JD RomeroMA, ME, NH, VT, RI, CT; Canada (East); EMEA/UKIEnsono, phData, Opti9, Bespin Global, Xebia
Matt GrossUS West: CA, WA, OR, AK, HIYash, nClouds, DinoCloud, Insight, TrustSoft, Optic, Epi-Use, StormReply, Noventiq, Macedon, Teleperformance
Nicole FranceseNJ, NY, PA, DEFuturalis, Deloitte, Arvato, Future Processing, Versent, KO Technologies, Elastic Scale, Data Art, Mastercard, Intellias
Paola GarciaFL, GA, NC, SC, AL, MS, KS, LA, OK, TN, AR, VA, MD, DC
Sam HessUS Central + Mountain: OH, WI, MO, NE, MN, MI, KY, IN, IL, IA, WV, TX, WY, UT, NV, ID, CO, AZ, ND, SD, NM, MTSynthesis, DXC, Pellera, Trinetix, SoftChoice, Quest Global, N-iX
Ryan BrodersonNamed Accounts + unassigned catch-allSHI, Megazone, Accenture, Slalom, Presidio
Diana MolinaLATAM
Marketing OwnerFree-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

Lists 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

The Jan plan said to standardize on full state names and use 5 US super-territories (Northeast/Southeast/Midwest/West/Texas). What shipped instead handles both abbreviations and full names in the routing branches (no mass data rewrite) and uses per-rep state lists, because territories kept changing.

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.
Designed, NOT live
Section 05

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)

Two workflows — (1) an always-on workflow that scores/enriches the whole database, and (2) a separate inbound workflow for new form-fills/registrations. Auto-MQL exceptions (skip the line): named accounts, current/historical pipeline deals, current customers. Auto-disqualify: competitors, marketing/VA agencies, and vendors (AWS, PAX8) via a negative/exclusion list.

Revised Scoring 4.0 — Fit

SignalPoints
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)
CapsContact-demo 25/35 · Company-demo 40/55

Revised Scoring 4.0 — Engagement

SignalPoints
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

Fit A 75–100 / B 50–74 / C < 50 · Engagement 1: 50–100 / 2: 10–49 / 3: < 10 · MQL trigger = Combined Score ≥ 50. Person scoring uses seniority, not title text (titles are unreliable). Two planned workflows finish it: 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

The Jan plan's model was a simpler layered design (SCA +50, Named Account +50, MSP +25, demo +35, C-suite +20; MQL = 50, Hot Lead = 100). It evolved into the capped Fit + Engagement + Recency "4.0" model, and SCA was demoted from a +50 accelerant to a +6 fit signal (it was only ever a campaign list). The 100-point "Hot Lead = SQL" threshold concept survives in the lifecycle scoring (Lead 0–49 / MQL 50–99 / Hot 100).
Done once; duplicates still being created
Section 06

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

Operations Hub Professional (23 Mar 2026, $500/mo). HubSpot's native duplicate management requires this tier; Starter wasn't enough. Also enables data standardization and webhooks.

Full dedup completed (~23 Apr 2026)

Roughly 2,500 companies and 4,000 contacts merged. Method: merge toward the oldest record using fuzzy domain + name matching.

Missing-company enrichment

The Ops - Company Name association workflow + an enrichment pass cut the "no associated company" list from ~7,000 down to ~2,600 records.

PLAN → BUILT

The Jan plan had no dedup engine — it assumed duplicates would be handled manually via a Closed-Lost "Duplicate" reason → merge. Reality required buying Data Hub Pro and running a full programmatic dedup.

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.
In progress; Salesloft retained
Section 07

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)

#SequenceTrigger / purpose
1SCA OutboundWork the ~2,500–3,000 SCA list — migrate from Salesloft (build first)
2MQL StandardFollow up qualified leads (score ≥ 50, no deal)
3Inbound Hot LeadSpeed-to-lead for score 100+ / demo requests
4Event Follow-UpPost-event engagement (re:Invent, summits)
5Post-Discovery StallKeep stalled deals moving
6Timing RevisitRe-engage "not now" (Closed Lost = Timing, +90 days)

PLAN → BUILT

The Jan plan had Salesloft fully retired by June with sequences live at SKO. In reality the Salesloft contract auto-renewed (~12 months) and the team wasn't yet confident in HubSpot, so Salesloft was retained for outbound and HubSpot is used for inbound speed-to-lead. Note HubSpot lacks Salesloft's call-recording bot and a true international dialer — MontyCloud accepted these as known gaps.
Confirm the Salesloft ↔ HubSpot sync stays healthy while both run (in-flight cadences like JD's London outreach).
Section 09

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.

Live (ON)
WorkflowWhat it does
Ops - Sales - Territory Routing - 2026PRIMARY territory/owner assignment by location
Ops - Company to Contact - State/Country RoutingCopies company location to contacts (enables company-level routing)
Ops - Sales - Territory Routing - RegionsSets the Region property
Ops - Company Territory Owner - Data HygieneCopies Territory Owner to other owner fields (re-test after routing cleanup)
Ops - Deactivated Owners - One off - ReRouteClears 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 ContactPushes NA status (Yes/No/Unknown) to associated contacts
Ops - Lead Status AutomationsSets 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 = CustomerWon deal → Customer (built; confirm this trigger is actually firing — never fully verified)
Ops - Company Status to Contact StatusSyncs status across company and contacts
Ops - Email Opt Out - Non Marketing ContactUnsubscribes → non-marketing
Ops - Company Name associationSets company name where missing
Ops - MontyCloud Internal RoutingInternal-domain contacts → Account Type "Internal" / status "Other"
Built but OFF
WorkflowWhy off
Ops - Lead Status = Open Deal → Deal CreationCreates 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."
Planned / not built
WorkflowPurpose
1 - build company score to contact recordCopy company combined score to the contact (scoring-dependent)
2 - combine scoresCombined MQL Score = Contact×0.6 + Company×0.4 → set MQL when both ≥ 50 (scoring-dependent)
Customer Status - Amazon RoutingFlag Amazon, DQ as vendor
Customer Status - HyperScaler RoutingFlag azure/gcp — blocked: needs domain criteria from Ann Marie
Lead Status contact → company mirrorSync lead status up to company (flagged to-build)

Lists & suppression

ListState
Ops - Named Accounts - 2026Live (current NA list)
Ops - Named Account - Static - Feb 2026 - Backup ListBuilt (pre-implementation snapshot)
Ops - Backup List - Static - Company Owners - Feb 2026Built (pre-go-live owner snapshot)
Ops - Non marketing ContactLive
Suppression - Unsubscribe Emails / SpamBuilt
Suppression - Hard DQ / Soft DQOPEN — need criteria + workflows once lifecycle scoring is final
Suppression - PRIMARY - ALLOPEN — aggregator that should feed from all suppression lists (not built)

Prepared by The Matchbox · June 2026 · Internal handoff · HubSpot portal 22107327.