afv-library/skills/external-diagram-mermaid-generate/assets/datamodel/consent-erd.md

10 KiB

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

Enrich diagram with live org data:

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.

%%{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.

DataUsePurpose  →  ContactPointConsent  ←  ContactPoint
(e.g., Marketing)        (Opt-In/Out)        (Email/Phone)
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:

%%{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:

%%{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

┌─────────────────────────────────────────────────────────────────────────────┐
│  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