Decision Maker Map
Enterprise buying committee visualization for multi-stakeholder deal management (PRD Gap #5).
Why This Pattern
Enterprise deals have 3-7 stakeholders. Without visualization:
- No clarity on who influences vs decides
- Unclear engagement levels per stakeholder
- Deal health scoring is guesswork
- Missing stakeholders cause deals to stall
Impact: Blocks 50% of enterprise deals with complex buying committees ($25K+ ACV)
Acme Corp - Enterprise Platform
$150,000 | Proposal Stage
Stakeholder Role Reference
Internal advocate pushing for purchase
Authority: influencer
Controls budget and final approval
Authority: decision maker
Assesses technical fit and requirements
Authority: influencer
Reviews contracts and compliance
Authority: gatekeeper
Handles vendor management and process
Authority: gatekeeper
Day-to-day user of the product
Authority: user
C-level stakeholder and sponsor
Authority: decision maker
Implementation
Stakeholder Card Pattern
import {
RoleBadge,
type StakeholderRole,
type InfluenceLevel,
roleToAuthority,
} from '@stackmates/ui-interactive/atoms';
interface Stakeholder {
id: string;
name: string;
title: string;
role: StakeholderRole;
influence: InfluenceLevel;
engagementScore: number;
}
function StakeholderCard({ stakeholder }: { stakeholder: Stakeholder }) {
const authority = roleToAuthority[stakeholder.role];
return (
<div className="flex items-center gap-4 p-4 border rounded-lg">
<Avatar>
<AvatarFallback>{getInitials(stakeholder.name)}</AvatarFallback>
</Avatar>
<div className="flex-1">
<div className="flex items-center gap-2">
<span className="font-medium">{stakeholder.name}</span>
<RoleBadge
role={stakeholder.role}
influence={stakeholder.influence}
showInfluence
size="sm"
/>
</div>
<div className="text-sm text-muted-foreground">
{stakeholder.title}
</div>
</div>
<div className="text-right">
<div className="text-sm font-medium">
{stakeholder.engagementScore}% engaged
</div>
<div className="text-xs text-muted-foreground capitalize">
{authority.replace('_', ' ')}
</div>
</div>
</div>
);
}Database Schema (deal_contacts junction)
// Drizzle schema for multi-stakeholder deals
export const dealContacts = pgTable('deal_contacts', {
id: uuid('id').primaryKey().defaultRandom(),
dealId: uuid('deal_id').references(() => deals.id),
contactId: uuid('contact_id').references(() => beings.id),
role: text('role').$type<StakeholderRole>().notNull(),
influence: text('influence').$type<InfluenceLevel>(),
engagementScore: integer('engagement_score').default(0),
lastContactAt: timestamp('last_contact_at'),
createdAt: timestamp('created_at').defaultNow(),
});Pattern Checklist (PRD Gap #5)
- RoleBadge atom for stakeholder role display
- 7 enterprise roles (Champion, Economic Buyer, Technical, Legal, Procurement, End User, Executive)
- Influence level indicators (High/Medium/Low)
- Authority type mapping (Decision Maker, Influencer, Gatekeeper, User)
- Engagement score display per stakeholder
- Deal health scoring based on stakeholder coverage
- Dark mode support
- OrgChartPattern visualization (task-1.2)
- deal_contacts junction table in schema (task-1.4)