v1.0.0 to v1.0.1
98 added, 72 removed. Audit A to A.
---
name: health-cloud-consent-management
description: "Use this skill when configuring Health Cloud patient consent management: setting up HIPAA authorization forms, consent templates, consent tracking per patient, and withdrawal handling. NOT for querying the AuthorizationFormConsent object hierarchy or its required field values — use data/consent-data-model-health. NOT for GDPR/CCPA marketing opt-out on ContactPointTypeConsent — use security/gdpr-data-privacy."
category: admin
salesforce-version: "Spring '25+"
well-architected-pillars:
- Security
- Operational Excellence
triggers:
- "How do I set up HIPAA authorization forms and consent tracking in Health Cloud?"
- "Patient consent form is not displaying in Health Cloud enrollment workflow"
- "How does AuthorizationFormConsent work and how is it different from marketing consent objects?"
- "How to track when a patient withdraws consent for a clinical care program in Salesforce"
- "AuthorizationFormText locale must match user locale or consent document fails to display"
+ - "record a patient revoking a HIPAA authorization without deleting the consent history"
+ - "capture IP address and browser details when a patient signs an authorization form"
tags:
- health-cloud
- consent-management
- hipaa
- authorization-form
- phi-compliance
inputs:
- Health Cloud org with Consent Management feature enabled
- Patient records as Person Accounts
- Care program enrollment workflow (CareProgramEnrollee)
- DataUsePurpose records defining the clinical use cases for PHI
outputs:
- Configured AuthorizationForm hierarchy (Form → Text → DataUse → Consent)
- AuthorizationFormConsent records per patient per consent form
- Withdrawal workflow for revoking consent without deleting records
- Consent tracking integration with care program enrollment
dependencies:
- admin/health-cloud-patient-setup
- admin/care-program-management
- version: 1.0.0
+ version: 1.0.1
author: Pranav Nagrecha
- updated: 2026-04-10
+ updated: 2026-10-03
---
# Health Cloud Consent Management
- Use this skill when configuring Health Cloud patient consent management: setting up HIPAA authorization forms, creating consent templates, tracking consent status per patient, and handling withdrawal. This skill covers the clinical consent form lifecycle — template creation, enrollment-linked consent capture, and status management. It does NOT cover marketing consent objects (ContactPointTypeConsent, ContactPointConsent for GDPR/CCPA opt-out), general Experience Cloud consent flows, or consent for non-clinical purposes.
+ Use this skill when configuring patient consent in Health Cloud: HIPAA authorization forms, form text per language, consent records per patient, and withdrawal. It covers the authorization form lifecycle: template creation, enrollment-linked capture, and status management. It does NOT cover marketing consent (`ContactPointTypeConsent`, `ContactPointConsent`), general Experience Cloud consent flows, or consent for non-clinical purposes.
+ Licence and feature gate: the authorization form objects are standard objects that are "available if Data Protection and Privacy is enabled" (Object Reference). Health Cloud adds `IndustriesSettings.enableAuthorizationCustomSharingPCU` for portal sharing of consent forms.
+
---
## Before Starting
- Gather this context before working on anything in this domain:
-
- - Confirm Health Cloud is enabled and Consent Management is configured in Setup. Verify that the DataUsePurpose standard object is available — this is the root of the consent hierarchy.
- - Identify the clinical use cases that require HIPAA consent (e.g., treatment, payment, healthcare operations, research). Each becomes a separate DataUsePurpose record.
- - Confirm that every AuthorizationForm has at least one AuthorizationFormText with the `IsDefault` flag set to true. A missing default text causes the consent form to silently fail to display during enrollment.
- - Distinguish clinical consent (HIPAA Privacy Rule authorization) from marketing consent (GDPR/CCPA opt-out). These use completely different object families. Do not confuse AuthorizationFormConsent with ContactPointConsent.
+ - Confirm Data Protection and Privacy is enabled. Every object in the hierarchy (`DataUsePurpose`, `AuthorizationForm`, `AuthorizationFormText`, `AuthorizationFormDataUse`, `AuthorizationFormConsent`) carries the access rule "This object is available if Data Protection and Privacy is enabled." In metadata the switch is `PartyDataModelSettings.enableConsentManagement`, and "setting this field to false purges all data protection details, such as privacy preferences and stored consent forms."
+ - Identify each clinical purpose that needs authorization (treatment, payment, healthcare operations, research). Each becomes a `DataUsePurpose` record with a `Name` and the required `CanDataSubjectOptOut` flag, optionally linked to a `DataUseLegalBasis`.
+ - Plan the default form text. The default lives on the form, not the text: `AuthorizationForm.DefaultAuthFormTextId` is "the ID of the default authorization form text to use if text isn't available for a specific language". Earlier versions of this skill described an `IsDefault` field on `AuthorizationFormText`; that field does not exist in the Object Reference.
+ - Keep clinical authorization separate from marketing consent. `AuthorizationFormConsent` records consent to a form; `ContactPointConsent` and `ContactPointTypeConsent` record channel preferences.
---
- ## Core Concepts
+ ## Questions to Ask Before Configuring
- ### The Five-Object Consent Hierarchy
+ Ask these before creating a single form. Each one traces to a gotcha in `references/gotchas.md`.
- Health Cloud patient consent uses a five-object hierarchy:
+ | Question | Why it matters | What a good answer adds | What proper configuration adds over just doing it |
+ |---|---|---|---|
+ | "Who can turn Data Protection and Privacy off, and is that change controlled?" | Turning `enableConsentManagement` off purges stored consent forms (gotcha 1) | A named owner and a change-control rule for the setting | Consent evidence that cannot vanish through a settings deploy |
+ | "Which languages must each form be shown in, and which is the fallback?" | `DefaultAuthFormTextId` on the form is the fallback when no text matches (gotcha 2) | A text record per language and a chosen default | Every patient sees a form, in their language where one exists |
+ | "How do we record a withdrawal, and how do we prove the earlier signature?" | `Status` allows only `Rejected`, `Seen`, `Signed` (gotcha 3) | A withdrawal design that keeps the signed record and history | An audit trail that shows when consent was given and when it ended |
+ | "How is consent captured: in person, phone, web, email?" | `ConsentCapturedSourceType` is a restricted picklist and `ConsentCapturedSource` is a required free-text field (gotcha 4) | The source type per channel and what goes in the source text | Consent records that load and report cleanly |
+ | "Do we need IP, browser, email, or location evidence for e-signatures?" | `PrivacySettings` can capture these during authorization consent (gotcha 6) | The capture settings to enable | Stronger evidence without custom code |
+ | "Will portal users or caregivers manage consent forms?" | Custom sharing for consent forms is a separate setting (gotcha 7) | The external audience and what they may see | Portal consent without opening records too widely |
- 1. **DataUsePurpose** — Defines the clinical reason PHI is being used (e.g., Treatment, Payment, Research). This is the root anchor of the consent model.
- 2. **AuthorizationForm** — The form template that describes what the patient is consenting to. One form per consent type (e.g., "HIPAA Authorization for Treatment").
- 3. **AuthorizationFormText** — The actual text/content of the form in a specific language/locale. Every AuthorizationForm must have exactly one default AuthorizationFormText (`IsDefault = true`). Missing this causes the form to fail to display.
- 4. **AuthorizationFormDataUse** — Junction object linking AuthorizationForm to DataUsePurpose. Establishes which clinical use purpose each form covers.
- 5. **AuthorizationFormConsent** — The per-patient consent record. One record per patient per form with fields: `ConsentGiverId` (Individual ID), `AuthorizationFormTextId`, `ConsentCapturedSource` (how consent was obtained), `Status` (Seen, Signed, Rejected), and timestamp.
+ What a proper consent configuration adds over "just creating records": consent that renders in the patient's language, a withdrawal trail that survives audits, and a settings model that cannot silently erase evidence.
- This hierarchy separates form templates (reusable) from patient consent records (one per patient per form instance).
+ ---
- ### AuthorizationFormConsent vs. ContactPointConsent
+ ## Core Concepts
- These are architecturally distinct objects for different regulatory purposes:
+ ### The consent hierarchy
- - **AuthorizationFormConsent** — HIPAA clinical authorization. Tracks whether a patient has authorized specific uses of their PHI. Required before a `CareProgramEnrollee` can be marked Active in most implementations.
- - **ContactPointConsent / ContactPointTypeConsent** — GDPR/CCPA marketing consent. Tracks whether an individual has opted in or out of specific communication channels (email, phone, direct mail).
+ | Object | Role | Key fields (Object Reference) |
+ |---|---|---|
+ | `DataUsePurpose` | Why PHI is used (treatment, research) | `Name` (required), `CanDataSubjectOptOut` (required), `Description`, `LegalBasisId` |
+ | `AuthorizationForm` | The form and its version | `Name`, `DefaultAuthFormTextId` (required in description), `IsSignatureRequired`, `RevisionNumber`, `EffectiveFromDate`, `EffectiveToDate` |
+ | `AuthorizationFormText` | Form text in one language | `AuthorizationFormId` (required), `Locale` or `LocaleSelection` (same function), `SummaryAuthFormText`, `DetailAuthorizationFormText`, `FullAuthorizationFormUrl`, `ContentDocumentId` |
+ | `AuthorizationFormDataUse` | Links a form to a purpose | `AuthorizationFormId`, `DataUsePurposeId` (both required) |
+ | `AuthorizationFormConsent` | One person's consent to one form text | `AuthorizationFormTextId`, `ConsentGiverId`, `ConsentCapturedDateTime`, `ConsentCapturedSource`, `ConsentCapturedSourceType` (all required), `Status`, `RelatedRecordId`, `DocumentVersionId` |
- Using ContactPointConsent for HIPAA clinical authorization is a compliance violation — the objects have different fields, different reporting requirements, and different legal purposes.
+ `ConsentGiverId` is polymorphic: Account, Contact, Individual, Lead, or User. `Status` values are `Rejected`, `Seen`, and `Signed`. `ConsentCapturedSourceType` values are `Email`, `InPerson`, `MailingAddress`, `Phone`, `Social`, `Video`, and `Web`.
- ### Withdrawal Handling
+ ### Clinical authorization vs marketing consent
- When a patient withdraws consent, the correct action is to **update the Status field** on the existing `AuthorizationFormConsent` record to a terminal status value (e.g., Withdrawn or Revoked) — NOT to delete the record. Deleting the consent record destroys the audit trail required for HIPAA compliance. The consent history must be preserved to demonstrate that consent was previously obtained and when it was withdrawn.
+ `AuthorizationFormConsent` records consent to a specific form text, with its capture time and source. `ContactPointConsent` and `ContactPointTypeConsent` record communication channel preferences. Using channel consent objects for HIPAA authorization records the wrong thing.
+ ### Withdrawal
+
+ Do not delete consent records. There is no `Withdrawn` status value. Two designs keep the trail; choose one and document it:
+
+ | Design | How | Trade-off |
+ |---|---|---|
+ | New record per event | Keep the `Signed` record; insert a new `AuthorizationFormConsent` for the same giver and text with `Status = Rejected` and the withdrawal time | Full trail in data; queries must take the latest record per giver and form |
+ | Update with history | Change `Status` to `Rejected` and `ConsentCapturedDateTime` on the existing record, with field history tracking on `AuthorizationFormConsent` (and a Field Audit Trail policy where available) | One record per giver and form; the trail lives in history |
+
---
## Common Patterns
- ### Consent Capture at Care Program Enrollment
+ ### Consent capture at care program enrollment
- **When to use:** Every time a patient is enrolled in a care program and HIPAA authorization must be obtained before accessing PHI.
+ **When to use:** A patient enrolls in a care program and HIPAA authorization must be recorded first.
**How it works:**
- 1. Create `DataUsePurpose` records for each clinical use category (Treatment, Payment, Healthcare Operations).
- 2. Create `AuthorizationForm` for each use category.
- 3. Create `AuthorizationFormText` with the form content, set `IsDefault = true`, and link to the AuthorizationForm. Ensure the Locale field matches the patient's expected language/locale (or the logged-in user's locale).
- 4. Create `AuthorizationFormDataUse` linking each form to its DataUsePurpose.
- 5. During enrollment Flow, create an `AuthorizationFormConsent` record for the patient with `Status = Seen`. After the patient signs, update `Status = Signed`.
- 6. Only mark `CareProgramEnrollee` as Active after all required `AuthorizationFormConsent` records have `Status = Signed`.
-
- **Why not the alternative:** Skipping consent capture and marking enrollment as active immediately is a HIPAA Privacy Rule violation. The consent record creates the required audit trail.
+ 1. Create a `DataUsePurpose` per clinical use (for example Treatment), with `CanDataSubjectOptOut` set deliberately.
+ 2. Create the `AuthorizationForm`, then one `AuthorizationFormText` per language, then set the form's `DefaultAuthFormTextId` to the fallback text.
+ 3. Create the `AuthorizationFormDataUse` linking the form to its purpose.
+ 4. In the enrollment flow, create an `AuthorizationFormConsent` with `Status = Seen` when the form is shown, filling the required capture fields.
+ 5. On signature, set `Status = Signed` (or insert the signed record, per the chosen design).
+ 6. Mark the `CareProgramEnrollee` active only after every required authorization is `Signed`.
- ### Withdrawal Processing
+ ### Withdrawal processing
- **When to use:** A patient requests revocation of HIPAA authorization.
+ **When to use:** A patient revokes an authorization.
**How it works:**
- 1. Locate all `AuthorizationFormConsent` records for the patient (query by `ConsentGiverId = [Individual ID]`).
- 2. Update `Status` on each relevant record to a terminal value (e.g., Withdrawn).
- 3. Record `ConsentCapturedSource = Verbal` or `Written` based on how withdrawal was communicated.
- 4. Optionally update related `CareProgramEnrollee` status to reflect restricted access.
- 5. Do NOT delete the `AuthorizationFormConsent` record. The historical consent record must be preserved.
+ 1. Find the patient's consent records by `ConsentGiverId` and the form text for the purpose.
+ 2. Record the withdrawal with `Status = Rejected`, using the chosen design (new record, or update with history).
+ 3. Set `ConsentCapturedSourceType` to the channel used (for example `Phone`) and `ConsentCapturedSource` to the source detail (for example the staff member or address).
+ 4. Update the related enrollment if the withdrawal restricts it.
+ 5. Never delete consent records, and exclude them from cleanup jobs.
---
## Decision Guidance
| Situation | Recommended Approach | Reason |
|---|---|---|
- | Patient consent form not displaying at enrollment | Check AuthorizationFormText IsDefault flag and locale | Missing default text is the #1 cause of form display failure |
- | Patient withdraws HIPAA authorization | Update AuthorizationFormConsent Status to Withdrawn | Never delete — HIPAA requires audit trail |
- | Marketing email opt-out | Use ContactPointConsent, not AuthorizationFormConsent | Different regulatory purpose, different object |
- | Multiple languages needed for consent forms | Create one AuthorizationFormText per locale, one IsDefault = true | Platform uses locale matching to select the displayed text |
- | Consent needed before enrollment active | Gate CareProgramEnrollee status update on AuthorizationFormConsent.Status = Signed | Prevents PHI access before consent is captured |
+ | Form shows no text for some patients | Set `AuthorizationForm.DefaultAuthFormTextId`; add text for the missing language | The default is the fallback when no language matches |
+ | Patient withdraws | Record `Status = Rejected`; keep the `Signed` record or its history | No `Withdrawn` value exists; deletion destroys evidence |
+ | Marketing email opt-out | `ContactPointTypeConsent`, not `AuthorizationFormConsent` | Different regulatory purpose and object |
+ | Several languages | One `AuthorizationFormText` per language, one default on the form | `Locale` and `LocaleSelection` select the text |
+ | E-signature evidence needed | `PrivacySettings` authorization capture fields | Captures IP, email, browser, location during consent |
+ | Portal users manage consent | `enableAuthorizationCustomSharingPCU` and sharing design | Custom sharing for consent forms is opt-in |
---
## Recommended Workflow
- 1. **Inventory clinical consent requirements** — identify each type of PHI use that requires patient authorization (Treatment, Payment, Research, etc.). Each becomes a DataUsePurpose record. Confirm scope with compliance/legal team.
- 2. **Create the consent hierarchy** — create DataUsePurpose records, then AuthorizationForm for each form template, then AuthorizationFormText (with IsDefault = true and correct Locale), then AuthorizationFormDataUse junction records linking forms to purposes.
- 3. **Build enrollment-linked consent capture** — add consent form display and capture steps to the care program enrollment Flow. Create AuthorizationFormConsent records when the patient is shown the form (Status = Seen) and update to Signed after acknowledgment.
- 4. **Gate enrollment activation** — add a validation check in the enrollment Flow or validation rule to prevent CareProgramEnrollee from being marked Active until all required AuthorizationFormConsent records have Status = Signed.
- 5. **Configure withdrawal workflow** — build a Flow or quick action that updates AuthorizationFormConsent Status to Withdrawn when a patient revokes consent. Ensure the record is never deleted.
- 6. **Test with multiple locales** — if the org serves patients in multiple languages, test consent form display for each locale. Verify that the correct AuthorizationFormText language is displayed based on user/patient locale.
+ 1. **Secure the feature switch.** Confirm Data Protection and Privacy is on, and put `PartyDataModelSettings.enableConsentManagement` under change control (deployable settings in `references/metadata-examples.md`).
+ 2. **Inventory purposes and forms.** One `DataUsePurpose` per clinical use; one form per authorization; the languages each form needs.
+ 3. **Build the hierarchy.** Form, then texts, then set `DefaultAuthFormTextId`, then `AuthorizationFormDataUse`.
+ 4. **Build capture into enrollment.** Create consent records with all required capture fields, set `Seen` then `Signed`, and gate enrollment activation on `Signed`.
+ 5. **Build withdrawal.** Choose the new-record or update-with-history design, record `Rejected`, and exclude consent objects from every deletion job.
+ 6. **Test per language and per channel.** Show each form in each language, record consent through each channel, and confirm reporting finds the latest status per patient and form.
---
## Review Checklist
- - [ ] DataUsePurpose records created for all clinical use categories
- - [ ] Each AuthorizationForm has at least one AuthorizationFormText with IsDefault = true
- - [ ] AuthorizationFormText Locale matches the expected user/patient locale
- - [ ] AuthorizationFormDataUse junction records link all forms to their DataUsePurpose
- - [ ] Enrollment Flow creates AuthorizationFormConsent records with correct Status
- - [ ] CareProgramEnrollee activation is gated on consent Status = Signed
- - [ ] Withdrawal process updates Status (does not delete the consent record)
- - [ ] HIPAA consent objects tested end-to-end in sandbox before go-live
+ - [ ] Data Protection and Privacy enabled; `enableConsentManagement` under change control
+ - [ ] `DataUsePurpose` records created with `CanDataSubjectOptOut` set deliberately
+ - [ ] Every `AuthorizationForm` has `DefaultAuthFormTextId` set to a real text record
+ - [ ] One `AuthorizationFormText` per required language
+ - [ ] `AuthorizationFormDataUse` links every form to its purpose
+ - [ ] Enrollment flow fills every required consent field and gates activation on `Signed`
+ - [ ] Withdrawal design chosen and documented; no deletion of consent records
+ - [ ] Authorization capture settings decided
---
## Salesforce-Specific Gotchas
- 1. **Missing default AuthorizationFormText causes silent form display failure** — If an AuthorizationForm has no AuthorizationFormText with IsDefault = true, the consent form component returns no content at runtime. The patient sees nothing to consent to, and no error is shown. Always verify that exactly one AuthorizationFormText per form has IsDefault = true before testing.
-
- 2. **Locale mismatch prevents correct text selection** — AuthorizationFormText has a Locale field. If the patient's or logged-in user's locale does not match any AuthorizationFormText locale, the platform may fail to display the correct form text. Test consent display from user accounts with the exact locale your patient population uses.
+ The deep versions, with sources, live in `references/gotchas.md`.
- 3. **Deleting AuthorizationFormConsent destroys HIPAA audit trail** — The consent record must persist even after withdrawal. Update Status to Withdrawn; never delete. Bulk data cleanup processes must explicitly exclude AuthorizationFormConsent from deletion operations.
+ | # | Gotcha | One-line consequence |
+ |---|---|---|
+ | 1 | Turning off consent management purges stored consent forms | One settings deploy can erase evidence |
+ | 2 | The default text is a lookup on the form, not a flag on the text | Forms render nothing for unmatched languages |
+ | 3 | `Status` has no `Withdrawn` value | Withdrawal flows fail or overwrite the signature |
+ | 4 | Capture source type is a restricted picklist; source text is required | Loads fail on "Verbal" or "Written" |
+ | 5 | `DataUsePurpose` has no `PurposeId` field | Scripts copied from old examples fail |
+ | 6 | Evidence capture is a settings decision | IP and browser are not recorded unless enabled |
+ | 7 | Portal sharing of consent forms is opt-in | Portal users cannot see forms they must sign |
+ | 8 | Consent records do not enforce access to PHI | Sharing must be designed separately |
---
## Output Artifacts
| Artifact | Description |
|---|---|
- | DataUsePurpose records | Defines clinical use categories requiring patient authorization |
- | AuthorizationForm hierarchy | Form templates with text, locale variants, and data use linkages |
- | Enrollment Flow with consent capture | Flow that creates and updates AuthorizationFormConsent during enrollment |
- | Withdrawal workflow | Quick action or Flow that updates consent status without deleting records |
+ | Consent settings | `PartyDataModel` and `Privacy` settings files under change control |
+ | Authorization form hierarchy | Purposes, forms, language texts, default text, data-use links |
+ | Enrollment flow with consent capture | Required capture fields, `Seen` and `Signed`, enrollment gate |
+ | Withdrawal design | `Rejected` recording with preserved history, no deletion |
---
## Related Skills
- - admin/health-cloud-patient-setup — Person account and care team setup that precedes consent configuration
- - admin/care-program-management — Care program enrollment workflow that consent is integrated with
- - admin/consent-data-model-health — Detailed data model reference for the consent object hierarchy
+ - `admin/health-cloud-patient-setup`: Person Account and care team setup before consent configuration
+ - `admin/care-program-management`: enrollment workflow that consent gates
+ - `data/consent-data-model-health`: detailed data model reference for the consent objects
+ - `admin/hipaa-workflow-design`: audit trail and access design around consent