2026-06-26 20:21:51 +08:00
|
|
|
# Consent Data Model Template
|
|
|
|
|
|
|
|
|
|
Pre-built data model for Salesforce Consent Management (GDPR/Privacy) using `flowchart LR` format with color coding and relationship indicators.
|
|
|
|
|
|
|
|
|
|
## Objects Included
|
|
|
|
|
|
|
|
|
|
| Object | Type | Description |
|
|
|
|
|
|--------|------|-------------|
|
|
|
|
|
| Individual | STD | Privacy identity |
|
|
|
|
|
| Contact | STD | Contact record |
|
|
|
|
|
| Lead | STD | Lead record |
|
|
|
|
|
| ContactPointEmail | STD | Email contact points |
|
|
|
|
|
| ContactPointPhone | STD | Phone contact points |
|
|
|
|
|
| ContactPointAddress | STD | Address contact points |
|
|
|
|
|
| DataUsePurpose | STD | Purpose definitions |
|
|
|
|
|
| ContactPointConsent | STD | Consent per contact point |
|
|
|
|
|
| CommSubscription | STD | Communication subscriptions |
|
|
|
|
|
| CommSubscriptionConsent | STD | Subscription consent |
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
## Query Org Metadata (Recommended)
|
|
|
|
|
|
|
|
|
|
Enrich diagram with live org data:
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
python3 ../../scripts/query-org-metadata.py \
|
|
|
|
|
--objects Individual,ContactPointEmail,ContactPointPhone,DataUsePurpose,ContactPointConsent \
|
|
|
|
|
--target-org myorg
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
## Mermaid Template (Preferred)
|
|
|
|
|
|
|
|
|
|
Left-to-right flowchart with color coding.
|
|
|
|
|
|
|
|
|
|
```mermaid
|
|
|
|
|
%%{init: {"flowchart": {"nodeSpacing": 50, "rankSpacing": 80}} }%%
|
|
|
|
|
flowchart LR
|
|
|
|
|
%% ═══════════════════════════════════════════════════════════════
|
|
|
|
|
%% CONSENT DATA MODEL (GDPR/PRIVACY)
|
|
|
|
|
%% LEGEND: LK = Lookup (-->), MD = Master-Detail (==>)
|
|
|
|
|
%% Colors: Blue = Standard, Orange = Custom, Green = External
|
|
|
|
|
%% ═══════════════════════════════════════════════════════════════
|
|
|
|
|
|
|
|
|
|
%% Party Objects
|
|
|
|
|
Individual["Individual<br/>(count)"]
|
|
|
|
|
Contact["Contact<br/>(count)"]
|
|
|
|
|
Lead["Lead<br/>(count)"]
|
|
|
|
|
|
|
|
|
|
%% Contact Points
|
|
|
|
|
CPEmail["ContactPointEmail<br/>(count)"]
|
|
|
|
|
CPPhone["ContactPointPhone<br/>(count)"]
|
|
|
|
|
CPAddress["ContactPointAddress<br/>(count)"]
|
|
|
|
|
|
|
|
|
|
%% Consent Objects
|
|
|
|
|
DataUsePurpose["DataUsePurpose<br/>(count)"]
|
|
|
|
|
CPConsent["ContactPointConsent<br/>(count)"]
|
|
|
|
|
|
|
|
|
|
%% Subscriptions
|
|
|
|
|
CommSub["CommSubscription<br/>(count)"]
|
|
|
|
|
CommSubConsent["CommSubscriptionConsent<br/>(count)"]
|
|
|
|
|
|
|
|
|
|
%% Individual Links
|
|
|
|
|
Individual -->|"LK"| Contact
|
|
|
|
|
Individual -->|"LK"| Lead
|
|
|
|
|
|
|
|
|
|
%% Contact Points to Party
|
|
|
|
|
Individual ==>|"MD"| CPEmail
|
|
|
|
|
Individual ==>|"MD"| CPPhone
|
|
|
|
|
Individual ==>|"MD"| CPAddress
|
|
|
|
|
|
|
|
|
|
%% Consent
|
|
|
|
|
CPEmail -->|"LK"| CPConsent
|
|
|
|
|
CPPhone -->|"LK"| CPConsent
|
|
|
|
|
DataUsePurpose -->|"LK"| CPConsent
|
|
|
|
|
|
|
|
|
|
%% Subscriptions
|
|
|
|
|
CommSub ==>|"MD"| CommSubConsent
|
|
|
|
|
Contact -->|"LK"| CommSubConsent
|
|
|
|
|
|
|
|
|
|
%% Standard Objects - Sky Blue
|
|
|
|
|
style Individual fill:#bae6fd,stroke:#0369a1,color:#1f2937
|
|
|
|
|
style Contact fill:#bae6fd,stroke:#0369a1,color:#1f2937
|
|
|
|
|
style Lead fill:#bae6fd,stroke:#0369a1,color:#1f2937
|
|
|
|
|
style CPEmail fill:#bae6fd,stroke:#0369a1,color:#1f2937
|
|
|
|
|
style CPPhone fill:#bae6fd,stroke:#0369a1,color:#1f2937
|
|
|
|
|
style CPAddress fill:#bae6fd,stroke:#0369a1,color:#1f2937
|
|
|
|
|
style DataUsePurpose fill:#bae6fd,stroke:#0369a1,color:#1f2937
|
|
|
|
|
style CPConsent fill:#bae6fd,stroke:#0369a1,color:#1f2937
|
|
|
|
|
style CommSub fill:#bae6fd,stroke:#0369a1,color:#1f2937
|
|
|
|
|
style CommSubConsent fill:#bae6fd,stroke:#0369a1,color:#1f2937
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
## Key Concepts
|
|
|
|
|
|
|
|
|
|
### Individual Object
|
|
|
|
|
- **Privacy identity** that links to Contact/Lead/User
|
|
|
|
|
- Required for consent tracking
|
|
|
|
|
- Can be auto-created when Contact/Lead created
|
|
|
|
|
- Stores global privacy preferences
|
|
|
|
|
|
|
|
|
|
### Contact Points
|
|
|
|
|
| Object | Purpose |
|
|
|
|
|
|--------|---------|
|
|
|
|
|
| ContactPointEmail | Email addresses |
|
|
|
|
|
| ContactPointPhone | Phone numbers |
|
|
|
|
|
| ContactPointAddress | Physical addresses |
|
|
|
|
|
| ContactPointSocialHandle | Social media IDs |
|
|
|
|
|
|
|
|
|
|
Each contact point links to an Individual.
|
|
|
|
|
|
|
|
|
|
### Consent Model
|
2026-07-11 01:19:21 +08:00
|
|
|
```text
|
2026-06-26 20:21:51 +08:00
|
|
|
DataUsePurpose → ContactPointConsent ← ContactPoint
|
|
|
|
|
(e.g., Marketing) (Opt-In/Out) (Email/Phone)
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### Consent Values
|
|
|
|
|
| Value | Meaning |
|
|
|
|
|
|-------|---------|
|
|
|
|
|
| **OptIn** | Consent given |
|
|
|
|
|
| **OptOut** | Consent withdrawn |
|
|
|
|
|
| **Seen** | Notice displayed |
|
|
|
|
|
| **NotSeen** | Notice not yet shown |
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
## Simplified Version (Core Objects Only)
|
|
|
|
|
|
|
|
|
|
For presentations focusing on core consent flow:
|
|
|
|
|
|
|
|
|
|
```mermaid
|
|
|
|
|
%%{init: {"flowchart": {"nodeSpacing": 50, "rankSpacing": 80}} }%%
|
|
|
|
|
flowchart LR
|
|
|
|
|
Individual["Individual"]
|
|
|
|
|
CPEmail["ContactPointEmail"]
|
|
|
|
|
DataUsePurpose["DataUsePurpose"]
|
|
|
|
|
CPConsent["ContactPointConsent"]
|
|
|
|
|
|
|
|
|
|
Individual ==>|"MD"| CPEmail
|
|
|
|
|
CPEmail -->|"LK"| CPConsent
|
|
|
|
|
DataUsePurpose -->|"LK"| CPConsent
|
|
|
|
|
|
|
|
|
|
style Individual fill:#bae6fd,stroke:#0369a1,color:#1f2937
|
|
|
|
|
style CPEmail fill:#bae6fd,stroke:#0369a1,color:#1f2937
|
|
|
|
|
style DataUsePurpose fill:#bae6fd,stroke:#0369a1,color:#1f2937
|
|
|
|
|
style CPConsent fill:#bae6fd,stroke:#0369a1,color:#1f2937
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
## Communication Subscriptions Model
|
|
|
|
|
|
|
|
|
|
For email preference centers:
|
|
|
|
|
|
|
|
|
|
```mermaid
|
|
|
|
|
%%{init: {"flowchart": {"nodeSpacing": 50, "rankSpacing": 80}} }%%
|
|
|
|
|
flowchart LR
|
|
|
|
|
Contact["Contact"]
|
|
|
|
|
CommSub["CommSubscription<br/>(Newsletter)"]
|
|
|
|
|
CommSubConsent["CommSubscriptionConsent"]
|
|
|
|
|
CommChannel["CommSubscriptionChannel"]
|
|
|
|
|
|
|
|
|
|
CommSub ==>|"MD"| CommSubConsent
|
|
|
|
|
Contact -->|"LK"| CommSubConsent
|
|
|
|
|
CommSub ==>|"MD"| CommChannel
|
|
|
|
|
|
|
|
|
|
style Contact fill:#bae6fd,stroke:#0369a1,color:#1f2937
|
|
|
|
|
style CommSub fill:#bae6fd,stroke:#0369a1,color:#1f2937
|
|
|
|
|
style CommSubConsent fill:#bae6fd,stroke:#0369a1,color:#1f2937
|
|
|
|
|
style CommChannel fill:#bae6fd,stroke:#0369a1,color:#1f2937
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
## ASCII Fallback
|
|
|
|
|
|
2026-07-11 01:19:21 +08:00
|
|
|
```text
|
2026-06-26 20:21:51 +08:00
|
|
|
┌─────────────────────────────────────────────────────────────────────────────┐
|
|
|
|
|
│ CONSENT DATA MODEL (GDPR/PRIVACY) (L→R) │
|
|
|
|
|
│ Legend: LK = Lookup (-->), MD = Master-Detail (==>) │
|
|
|
|
|
└─────────────────────────────────────────────────────────────────────────────┘
|
|
|
|
|
|
|
|
|
|
┌──────────────┐
|
|
|
|
|
│ INDIVIDUAL │─────── LK ──────┬──────────────────────────────────┐
|
|
|
|
|
│ (count) │ │ │
|
|
|
|
|
└──────┬───────┘ ▼ ▼
|
|
|
|
|
│ ┌──────────────┐ ┌──────────────┐
|
|
|
|
|
│ │ CONTACT │ │ LEAD │
|
|
|
|
|
│ │ (count) │ │ (count) │
|
|
|
|
|
│ └──────────────┘ └──────────────┘
|
|
|
|
|
│
|
|
|
|
|
├═══ MD ═══>┌────────────────────┐
|
|
|
|
|
│ │ CONTACT_POINT_EMAIL│─── LK ──>┌────────────────────┐
|
|
|
|
|
│ │ (count) │ │CONTACT_POINT_ │
|
|
|
|
|
│ └────────────────────┘ │ CONSENT │
|
|
|
|
|
│ │ (count) │
|
|
|
|
|
├═══ MD ═══>┌────────────────────┐ └─────────┬──────────┘
|
|
|
|
|
│ │ CONTACT_POINT_PHONE│─── LK ───────────>│
|
|
|
|
|
│ │ (count) │ │
|
|
|
|
|
│ └────────────────────┘ │
|
|
|
|
|
│ │ LK
|
|
|
|
|
└═══ MD ═══>┌────────────────────┐ │
|
|
|
|
|
│CONTACT_POINT_ADDR │ ┌────────┴───────────┐
|
|
|
|
|
│ (count) │ │ DATA_USE_PURPOSE │
|
|
|
|
|
└────────────────────┘ │ (count) │
|
|
|
|
|
└────────────────────┘
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
## Key Relationships Summary
|
|
|
|
|
|
|
|
|
|
| Parent | Child | Type | Behavior |
|
|
|
|
|
|--------|-------|------|----------|
|
|
|
|
|
| Individual | Contact | LK | Privacy identity |
|
|
|
|
|
| Individual | Lead | LK | Privacy identity |
|
|
|
|
|
| Individual | ContactPointEmail | MD | Cascade delete |
|
|
|
|
|
| Individual | ContactPointPhone | MD | Cascade delete |
|
|
|
|
|
| Individual | ContactPointAddress | MD | Cascade delete |
|
|
|
|
|
| ContactPointEmail | ContactPointConsent | LK | Email consent |
|
|
|
|
|
| ContactPointPhone | ContactPointConsent | LK | Phone consent |
|
|
|
|
|
| DataUsePurpose | ContactPointConsent | LK | Purpose reference |
|
|
|
|
|
| CommSubscription | CommSubscriptionConsent | MD | Cascade delete |
|
|
|
|
|
| Contact | CommSubscriptionConsent | LK | Subscriber |
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
## GDPR Compliance Considerations
|
|
|
|
|
|
|
|
|
|
| Right | Implementation |
|
|
|
|
|
|-------|----------------|
|
|
|
|
|
| **Right to Access** | Query Individual + Contact Points |
|
|
|
|
|
| **Right to Rectification** | Update Contact Points |
|
|
|
|
|
| **Right to Erasure** | Delete Individual (cascades) |
|
|
|
|
|
| **Right to Restrict** | Set ConsentCaptureSource |
|
|
|
|
|
| **Right to Object** | ContactPointConsent = OptOut |
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
## Limits & Considerations
|
|
|
|
|
|
|
|
|
|
| Limit | Value |
|
|
|
|
|
|-------|-------|
|
|
|
|
|
| Contact Points per Individual | Unlimited |
|
|
|
|
|
| Data Use Purposes | Unlimited |
|
|
|
|
|
| Consent records | LDV consideration |
|
|
|
|
|
| Audit trail retention | Configurable |
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
## Best Practices
|
|
|
|
|
|
|
|
|
|
1. **Use `flowchart LR`** - Left-to-right flow for readability
|
|
|
|
|
2. **Keep objects simple** - Name + record count only
|
|
|
|
|
3. **Replace `(count)` placeholders** - With actual counts from query
|
|
|
|
|
4. **Add LDV indicator** - For objects >2M records: `LDV[~4M]`
|
|
|
|
|
5. **Color code object types** - Blue=Standard, Orange=Custom, Green=External
|