[object Object]

A close-lost review keeps surfacing the same finding: the rep never identified the procurement contact. Reports do not flag the gap because every contact on the deal looks the same in HubSpot — flat associations with no role attached. Association labels solve this and most teams who have them enabled barely use them.

What labels actually capture

Without labels, every contact on a deal is just “associated.” With labels, each association carries a role: Decision maker, Champion, Procurement, Technical evaluator, End user, Influencer. The same contact can hold different labels on different deals — Sara is the Champion on the renewal and the Decision maker on the upsell.

Deal: Acme Renewal
  Contact: Sara Mendez   - label: Champion
  Contact: Tom Wright    - label: Technical evaluator
  Contact: Priya Shah    - label: Procurement
  Contact: Mark Lee      - label: End user

Enable per object pair

Settings > Objects > Associations. Enable labels per object pair (Contact-Deal, Company-Deal, Contact-Company, Deal-Ticket, custom-object pairs). Each pair has its own label taxonomy because a contact’s role on a deal is different from their role on a company.

Contact <-> Deal:
  Decision maker, Champion, Procurement,
  Technical evaluator, End user, Influencer

Contact <-> Company:
  Owner, Employee, Board member, Vendor contact

Company <-> Deal:
  Customer, Partner, Subsidiary

Mark labels as primary so reports default to a single canonical relationship per record.

Apply at the right moment

Reps will not maintain labels if they have to remember. Build the prompt into the workflow:

On deal stage = Discovery complete:
  Required: at least one contact with label "Decision maker"
  Required: at least one contact with label "Procurement" or N/A justification

On deal stage = Proposal:
  Required: all contacts have a label (no unlabeled associations)

A workflow that creates a task instead of blocking the stage transition keeps reps moving while making the gap visible.

Reporting that actually informs

Report: Deals missing a decision maker
  Object: Deal
  Filter: Pipeline = New Business
  Filter: Stage past Qualified
  Filter: Count of associated contacts where label = Decision maker is 0

This is the kind of question that was unanswerable before labels and obvious with them. Build similar reports for each critical role.

Workflow triggers

Triggers fire on label assignment, not just on association. The pattern:

// Workflow: notify rep when procurement contact added
const event = await getTriggerEvent();
if (event.type === "association_label_added"
    && event.label === "Procurement"
    && event.dealStage === "Negotiation") {
  await postSlack({
    channel: event.dealOwnerSlackId,
    text: `Procurement contact added to ${event.dealName}: ${event.contactName}`
  });
}
return { outputFields: { notified: true } };

Governance: lock down who creates labels

Allow everyone to create labels and you end up with “Decision maker,” “Decision Maker,” “DecisionMaker,” and “Decison maker” within a quarter. Restrict label creation to admins, document the taxonomy in the portal description, and review quarterly to retire unused labels.

Label registry (owned by RevOps):
  Active labels: 8
  Last review: 2026-04-15
  Pending: rename "Tech eval" -> "Technical evaluator"
  Retired: "Other" (replace with N/A)

Migration from unlabeled associations

A portal with thousands of historical associations needs a backfill plan: do not auto-label, but flag deals at stages where labels are now required and assign a deal owner to clean up. Future-only enforcement plus an aging cleanup target works better than a big-bang migration.

What to do this week

Enable association labels for Contact-Deal, define your initial taxonomy in a one-page doc, and build the “deals missing a decision maker” report to size the gap before you announce the new requirement to sales.

[object Object]
Share