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.