Shared-services marketing works when brand is stamped at record creation, lifecycle is modeled per brand, and each brand's ads get their own conversion signal. Here's the architecture, step by step.
Dana Reyes
Contact · Larkspur Group portal · 3 brands
Toggle to see the same contact before and after the architecture fix.
Brands partitions what customers see.
It doesn't partition your data.
The Brands add-on separates
It does not separate
Lifecycle Stage holds one value, moves forward only and is shared portal-wide. "Customer of A, lead of B" can't both be true, so teams invent custom fields native tools ignore.
HubSpot's native Google Ads conversion events fire on standard Lifecycle Stage changes or form submissions. Custom properties, Lead stages and Deal stages aren't triggers. That's how four of five brands in one B2C group ended up sending Google nothing.
Brand-tagged HubSpot forms set the brand automatically. Imports, integrations, chat, sales-created records and non-HubSpot forms don't. Untagged records become "group" records nobody owns.
Buyers expect a sub-portal and get a brand switcher. When two sister companies sell into competing ecosystems, shared timelines turn into an accidental data-leak risk.
Two internal clients, both sales leaders, both under-funded, and no intake queue, allocation % or SLA. The loudest request wins, and one shared "marketing" subscription across legal entities becomes a compliance gap.
Benchmarks: weak, acceptable, strong
| Metric (per brand) | Weak | Acceptable | Strong |
|---|---|---|---|
| Spam complaint rate per sending domain | ≥0.30% (Gmail/Yahoo enforcement) | 0.10–0.29% | <0.10% |
| Unsubscribe rate per marketing send | >0.5% | 0.2–0.5% | <0.2% (average 0.15–0.22%) |
| Time to honor an unsubscribe across brands | >10 business days (CASL breach) | ≤2 days (Gmail/Yahoo rule) | Instant, per brand plus group "unsubscribe from all" |
| CRM data accurate and complete | <50% (76% of orgs report this) | 50–80% | >80% |
| Records with brand stamped at creation | <90% | 95–98% | ≥99% with a nightly exception queue |
| Google Ads conversion signal | No offline or enhanced conversions | Standard GCLID offline import | Enhanced conversions for leads: median +10% conversions vs. standard import |
| Marketing budget as % of revenue | ≤6% | ~7.7% (average) | >9%, allocated by business unit against pipeline |
Sources: Google and Yahoo bulk-sender rules (2024) via Red Sift (2026); Mailchimp unsubscribe benchmarks (data Dec 2023); CRTC CASL FAQ (2026); Validity, The State of CRM Data Management in 2025; Google Ads Help, About offline conversion imports (2026); Gartner CMO Spend Survey (2025). "Brand stamped at creation" is a JayOh practitioner target, not a published study.
One portal + Teams, one portal + Brands, or separate portals + MAM. Decide before buying.
Everything hangs off this choice. Switching later means a rebuild.
One governed brand value on contacts, companies, deals, tickets and leads.
A brand inferred later is the root of every reporting failure.
business_unit_origin (single-select, contact and company): the brand that created the record. Never overwritten; guard it with a workflow.business_units_engaged (multi-select): every brand the person has touched. Append-only.business_unit (single-select, required) on deals, leads and tickets, defaulted from the pipeline.Teams plus view and edit permissions decide who sees which records.
Brands doesn't hide timeline activity or restrict pipelines. You can hide deals by team, but the pipeline itself stays visible.
BU-A Sales, BU-B Sales, Shared Marketing.Keep standard Lifecycle Stage as the group's highest relationship. Model brand status on an object that can exist more than once per person.
Native ads, attribution and funnel reports read only the standard field. Per-brand custom lifecycle properties are invisible to them.
bu_a_customer.bu_a_lifecycle) for segmentation only, never as the system of record.Subscription types, a preference page and an opt-out import for each brand.
Consent belongs to a legal entity. Mixed subscription types are the most common compliance failure in shared services.
BU-A | Newsletter, BU-A | Product updates, BU-A | Events.consent_country and consent_source_brand. CASL requires naming every sender and honoring unsubscribes within 10 business days.Group rules so one person isn't hit by five brands a week.
Gmail and Yahoo enforce a 0.3% spam ceiling per sending domain. Cross-brand fatigue lands on the parent's reputation.
SUPP | Global hard suppress: hard bounces, spam reports, legal holds and competitors, attached to every send in every brand.SUPP | Open deal in other BU: pause Brand B nurture during Brand A's open deal, if sales asks.SUPP | Customer of BU-A: excluded from Brand A acquisition ads and emails.Each brand's campaigns optimize on that brand's qualified pipeline, not the group's lifecycle.
Native HubSpot events for Google cover standard lifecycle changes and form submissions only. Brands tracked in custom properties send nothing.
BU-X | SQL, value) via Data Hub custom code, a webhook or an iPaaS.gclid, gbraid, wbraid, fbclid and li_fat_id on every form, first- and last-touch per brand. Use campaign-specific conversion goals so Brand A bids only on BU-A actions.Brand dashboards, a shared-capacity dashboard, a parent rollup.
Default report templates have no brand filter. Leadership only sees what your reports can split.
business_unit (deals, leads, tickets) or Brands / business_unit_origin (contacts) as a filter or breakdown.BU-A Growth, BU-B Growth, Shared Marketing Capacity, Group Executive Rollup. One time zone per portal drives month-end, so set it deliberately.A Marketing Requests ticket pipeline (or custom object) tagged by business unit, with hours and SLA.
It replaces "whoever shouts loudest" with data both sales leaders can see.
requesting_bu, request_type, priority, estimated_hours, actual_hours, due_date, sla_status.Controls that catch untagged records and wrong-brand assets.
Emails, forms and campaigns are locked to a brand at creation. Fixing a mistake means cloning and rebuilding.
On Salesforce instead? The person-level problem is identical: one Lead or Contact, one status. Use a required Business_Unit__c picklist on Lead, Contact, Account, Opportunity and Case; record types only where processes truly differ; OWD Private with sharing rules by business unit; and Opportunities or a BU Relationship junction object for per-unit status.
Account Engagement business units cap at 25, can't share most assets, and moving a prospect between units carries fields, not activities.
Stamp the business unit at creation. Never infer it later. Immutable origin, append-only engaged.
Standard Lifecycle Stage = highest group relationship, written by one workflow only.
Brands for brand-facing separation, Teams for visibility. Don't treat Brands as a data wall.
One subscription-type set per brand, built around legal basis and category, not campaigns.
One global suppression list on every send, plus group frequency rules.
An authenticated sending domain per brand, with spam rate monitored below 0.1%.
Turn on native form conversion events per brand now, then add offline conversions for MQL, SQL and Customer.
Capture click IDs with timestamps, first- and last-touch per brand.
Use campaign-specific conversion goals so one brand's bidding never learns from another's conversions.
Put a business-unit filter on every report from day one. Treat default templates as unusable for brand splits.
One intake pipeline with BU, hours and SLA. Publish allocation vs. actuals to both sales leaders monthly.
Separate portals only for legal, regulatory, sale-readiness or different-GTM reasons, connected with Multi-Account Management.
Four brands track status in custom fields. Native ad conversion events can't read them.
CostThose brands send no downstream signal. Smart Bidding optimizes on clicks and form fills, so junk leads rise.
A Brand A customer can't be re-nurtured as a Brand B lead; the field only moves forward.
CostNewer brands' funnels are undercounted and cross-sell pipeline goes invisible.
Records arrive untagged from imports, chat and integrations.
Cost"Unknown BU" becomes the biggest bucket. Allocation fights have no data behind them.
One "Marketing Information" type covers every legal entity.
CostRegulatory exposure, and one brand's unsubscribe wipes out another brand's audience.
Timelines and integrations aren't partitioned by brand.
CostAn accidental data leak between companies that sell into competing ecosystems.
Each logo gets its own portal, properties and workflows.
CostA second Enterprise license (~$3,600/mo list), duplicated builds and no cross-brand customer view.
Need a provable data wall?
Contracts, regulation, data residency or a pending sale.
Each brand needs its own domain and subscription page?
Current Marketing Hub tier
Optional. Leave blank to see the base cost only.
One portal + Brands add-on
Estimated Marketing Hub list price, per month
List-price estimates only: Marketing Hub Professional $890/mo (3 seats) and Enterprise $3,600/mo (5 seats), per Resonate HQ (verified May 2026). Excludes extra seats, contact tiers and onboarding. Brands needs Enterprise plus one add-on per brand; HubSpot doesn't publish the add-on price, so enter your quote. Separate portals assume the minimum for Multi-Account Management: one Enterprise account, the rest Professional.
Set annually by the CEO or CFO; revenue- or plan-weighted.
Base pool $31,500 split 60/40. Variable pool $13,500 split by hours (43% / 57%).
Copies all three tables as tab-separated text.
ABrand / business-unit property spec
| Property (internal name) | Object(s) | Type | Values | Rules |
|---|---|---|---|---|
business_unit_origin | Contact, Company | Single-select | bu_a, bu_b, … group | Required at creation via form hidden field, import column, integration map or creator. Never overwritten (workflow guard). |
business_units_engaged | Contact, Company | Multi-select | Same | Append-only. Workflow adds a value on brand form fill, brand lead or deal creation, or purchase. |
| Brands (HubSpot system) | Contact (+ objects per portal) | Multi-value, system | Configured brands | Auto-set by brand-tagged forms. Confirm internal name in your portal. Backfill with Append, never Replace. |
business_unit | Deal, Lead, Ticket, custom objects | Single-select, required | Same | Defaulted from pipeline; validated by workflow. |
bu_unknown_flag | Contact | Calculated boolean | true / false | True when origin is empty; feeds the exception queue. |
BPer-brand lifecycle field spec
| Property | Values | Source of truth | Written by |
|---|---|---|---|
bu_a_lifecycle | Subscriber, Lead, MQL, SQL, Opportunity, Customer, Former customer | BU-A lead, deal or Brand Relationship record | "BU-A lifecycle sync" workflow only |
bu_a_lifecycle_date_[stage] | Date | Same | Same |
bu_a_customer | Boolean | Closed Won in BU-A pipeline, or purchase | Same |
bu_b_lifecycle (repeat per brand) | Same | BU-B records | "BU-B lifecycle sync" workflow only |
| Lifecycle Stage (standard) | Highest stage across all brands | "Group lifecycle" workflow | Only that workflow; manual edits removed by field-level permissions |
gclid_first, gclid_last, gclid_last_date, fbclid_last, li_fat_id_last, click_id_brand | Text / date | Hidden form fields | Forms + workflow |
CShared-services intake, SLA and allocation
| Field / rule | BU-A (established) | BU-B (newer) | Notes |
|---|---|---|---|
| Base allocation % | e.g. 60% | e.g. 40% | Set annually by CEO/CFO; revenue- or plan-weighted |
| Variable true-up | +/- hours logged vs. allocation | Same | Quarterly, from the Marketing Requests pipeline |
| Intake channel | One HubSpot form to Marketing Requests pipeline | Same | No Slack DMs; if it isn't ticketed, it isn't worked |
| Request types | Campaign, content, event, sales enablement, ops/data, ads | Same | request_type property |
| SLA: acknowledge | 1 business day | 1 business day | Ticket SLA |
| SLA: small request (<4 h) | 5 business days | 5 business days | Ticket SLA |
| SLA: campaign | Planned in monthly prioritization | Same | Joint meeting with both sales leaders |
| Reporting cadence | Monthly: hours, pipeline sourced/influenced, CAC by BU | Same | Shared Marketing Capacity dashboard |
| Conflict rule | Same-week sends: lower-priority BU shifts 48 h | Same | Global frequency cap applies |
Usually not. One portal with a governed business-unit property, Teams and per-brand subscriptions covers most cases. Go separate (linked by Multi-Account Management) only to prove a data wall: contracts, regulation, data residency or a likely sale.
No. Brands (formerly Business Units) partitions outward-facing assets like domains, subscription types and ad accounts. Visibility comes from Teams and permissions, and contact timelines still show other brands' activity.
HubSpot's native Google Ads conversion events fire only on standard Lifecycle Stage changes or form submissions. Custom lifecycle properties, Lead stages and Deal stages aren't supported triggers; HubSpot staff confirmed this in October 2026. Turn on native form events per brand now, then send brand-level offline conversions (GCLID plus hashed email) for MQL, SQL and Customer.
Yes, by design. Lifecycle Stage becomes the group's highest relationship, so native ads and funnel reports keep working. Each brand's real status lives on its own lead, deal or Brand Relationship record.
Use a hybrid: a base share set annually (revenue- or plan-weighted) plus a variable true-up from hours logged in one intake pipeline, reviewed quarterly. The chargeback calculator in section 7 runs the math.
HubSpot doesn't publish the price, so get a quote. It requires Marketing Hub Enterprise (about $3,600/mo list with 5 seats, per Resonate HQ, May 2026) and one add-on per brand, up to 100.
A required brand value on every record at creation, plus a nightly untagged queue. In Salesforce, the field is admin-locked and required before an opportunity advances.
A company buying from two brands isn't merged by mistake; real duplicates still are.
Standard Lifecycle Stage holds the highest relationship so native ad events keep working. Per-brand status lives on Leads, Deals or a custom object.
GCLID and hashed-email uploads per brand from HubSpot or the warehouse, wherever native events can't express the brand.
When brands run separate billing or CRM stacks, we map lineage and use a warehouse such as Snowflake as the cross-brand view.
One intake pipeline, an allocation formula and SLA dashboards, so both internal clients see the same numbers every month.
We'll review your container, brand stamp, lifecycle and ad signal, and show you which step to fix first.
We engineer growth systems. JayOh builds the RevOps architecture, GTM execution and data infrastructure that turn messy revenue operations into predictable pipeline for B2B SaaS and PE-backed teams.