ClaudforceHLS · Provider + Payer
An ordered route from an empty Salesforce org to a working Data Cloud, Marketing Cloud Next and Agentforce demo. Written from the org it was built in, verified against that org on 3 September 2026.
Connect this to your Claude
This page is an MCP server. Point your agent at it.
Everything below is also available as tools your agent can call. Connect this server for the route, the traps and the data shapes, and connect your own Salesforce org so your agent can act on it. Neither half is enough on its own: this server knows what to build and cannot touch an org; the Salesforce MCP can touch an org and does not know this build.
1. Connect this guide
claude mcp add --transport http claudforce-hls https://claudforce-hls.thelonelyagent.com/api/public/mcpNo auth. Twelve tools: start_here first, then get_guide, get_corrections, list_sections, get_section, search_traps, verify_step, list_skills, get_skill, get_dataset_schema, get_manifest, list_downloads.
2. Connect your own Salesforce org
Point your agent at your own org with the Salesforce MCP server. That is the half that does the building. This guide never touches your org and never sees your data.
How to connect your Salesforce org, step by step
You need an External Client App. Connected Apps are not supported for MCP client connections. Verified against a live org — about five minutes of setup, plus up to thirty minutes of waiting that catches most people out.
- In Setup, go to External Client App Manager and choose New External Client App.
- Give it a name. The API Name must contain no hyphens — the label can. A hyphen in the API name is a silent failure later.
- Set the Callback URL to
https://claude.ai/api/mcp/auth_callback - Add the OAuth scopes
mcp_apiandrefresh_token. Both are required. - Under security, enable JWT-based access tokens for named users, and leave PKCE on. Uncheck everything else that is changeable.
- Set Distribution State to Local.
- Save, then wait. See the trap below.
- In Claude, add the Salesforce MCP server using the server URL from Salesforce's documentation for your setup. Standard hosted servers ship with tools already and are the fastest route; a custom server only pays off when you need to expose specific Flows, Apex or Data Cloud queries.
| Setting | Value |
|---|---|
| Where | Setup → External Client App Manager → New External Client App |
| API Name | No hyphens. The label can keep them |
| Callback URL | https://claude.ai/api/mcp/auth_callback |
| OAuth scopes | mcp_api and refresh_token |
| Security | JWT-based access tokens for named users, PKCE enabled |
| Distribution State | Local |
| Propagation | Up to 30 minutes |
Salesforce's setup guide at developer.salesforce.com/docs/platform/hosted-mcp-servers/guide/setup-overview.html is the source for the server URL and the current client list. Salesforce lists Claude as a supported client.
Reading instead? The whole document is below, or as one Markdown file at /rebuild-path.md, plain text at /rebuild-path.txt, indexed at /llms.txt.
Get everything
The downloads
Everything on this page is downloadable. The asset pack is the whole build: 37 Apex classes, 18 Lightning web components, pages, tabs, permission sets and the schema. The mock data is the thirteen scrubbed datasets on their own. The skills are five Claude skills written while building this, for driving Salesforce over its APIs: headless discovery, campaign build, web affinity, Tableau Next dashboards, and SE triage.
Claude skills
Salesforce SE skills
Five skills for driving Salesforce over its APIs, written while building this and used to build it.
5 skills · 36 KB
Download the skillsData only
Makana mock data
The thirteen datasets on their own, if you have an org and just need something in it. Scrubbed and synthetic.
13 datasets · 467 KB
Download the mock dataThe build
The asset pack
Everything behind the screenshots and videos on this page. Apex, components, page placement, data and configuration.
553 files · 1.04 MB
Full file list: /manifests/asset-pack.txt
Download the asset packMachine-readable paths and the MCP server are covered at the top of this page.
The result
What the build produces
Four short screen recordings from the finished org, so you can see where the week ends before it starts.
Scope
What you are rebuilding
A single Salesforce org carrying a full healthcare marketing demo, and it is not one undifferentiated route. The difficulty sits in the data foundation: the mock data, the data streams and the DLO to DMO mappings, identity resolution, the data graphs, the engagement data connections, consent, and the segments built on top of all of it. Everything downstream of that foundation — the Tableau Next dashboards, the custom components and the Agentforce agents — is comparatively mechanical once the foundation is correct and resolving. The foundation is where the time actually goes. The figures below are the shipped state of that org.
640
unified profiles
5,828
consent rows
6
campaigns
192
dashboard widgets, all returning Ok
4
agents
26
message variants
Every figure on this page carries a verification date. Status in a catalogue decays faster than content.
Day 0
Before you build anything
Two constraints set here shape every decision for the rest of the week.
Build
| Requirement | Why |
|---|---|
| Data Cloud provisioned, with a data space | Everything downstream of Day 1 |
| Marketing Cloud Next enabled | Campaigns, Flows, Content tabs |
| UnifiedMarketingStarterUserPermSet assigned to yourself | Blank Campaigns/Flows/Content tabs are a permissions problem, not a setup problem. Marketing Cloud Admin configures MC Next; it does not let you use it |
| Tableau Next workspace | Day 4 |
| Agentforce enabled | Day 6 |
What the source org actually holds
Verified against the source org on 3 September 2026. It is an Enterprise Edition trial, non-sandbox, expiring 11 November 2026. Every permission-set licence below expires with it. A trial gets provisioning and limits a customer org will not — treat the counts as evidence the feature was on, not as a shopping list.
| Licence or permission | Total | Used | What breaks without it |
|---|---|---|---|
| Salesforce (user licence) | 550 | 69 | Everything |
Data Cloud GenieDataPlatformStarterPsl | 200,000 | 2 | Day 1 onward. No streams, no DMOs, no identity resolution |
Customer Data Platform CdpPsl | 2,500 | 1 | Segment creation and the MarketSegment sObject |
| Customer Data Cloud for Marketing | 200,000 | 1 | Segment activation into campaigns |
Marketing Cloud MarketingCloudPsl | 36,005 | 1 | Campaigns, Flows, Content — the whole of Day 3 |
| Marketing Triggers | 5,000 | 1 | Event-driven journeys |
| Marketing Intelligence Users | 10,000 | 1 | Campaign performance reporting |
Agentforce (Default) EinsteinGPTCopilotPsl | 3,105 | 10 | Day 6. No agents in the picker |
| Einstein Prompt Templates | 3,110 | 15 | Prompt Builder |
| Einstein Agent (user licence) | 802 | 1 | Agent runtime |
| Tableau Next Creator | 10 | 1 | Day 4. Authoring dashboards |
| Tableau Next Consumer | 10 | 1 | Viewing them |
| CRM Analytics Plus | 131 | 3 | The analytics platform underneath |
| Data Pipelines Base User | 3 | 1 | Batch data prep |
| Guest User License | 25 | 9 | The anonymous web-visit capture only |
The two constraints that shape every later decision
Trap
Custom objects cannot be created over any REST surface. Tooling
CustomObjectreportscreateable: trueand rejectsFullName. There is nocreateCustomObjectaction./headless/metadatais not served.deployRequestneeds multipart. Confirmed independently four times across this project. Metadata API via thesfCLI only.Trap
Custom fields are fine over Tooling. This is the standard workaround, and it shapes the architecture: where you would reach for a new object, put fields on an existing one. Five fields on
Userreplaced a leaderboard object.B2B_Mood_Board__c, a stock SDO object, carries an entire 27-row message registry. A Tooling-created CustomField has no FLS, so SOQL and REST report No such column while Apex reads and writes it perfectly. A seed can therefore succeed against a field you cannot query.
Traps that apply all week
Trap
+,++,&and#in anexecuteAnonymousquery string.+decodes to a space;&truncates the body at that character and surfaces asMissing closing quote character 'at an unrelated column. UseString.joinand aListas a counter. Build the characters you need withString.fromCharArray(new List<Integer>{38}). This was the single most frequently recurring trap in the project.Trap
Throwing an exception to read a value out of
executeAnonymousrolls back every DML in that transaction. It once reverted 2,983 updates and silently no-opped a 1,165-row seed. Read-only probes only. To prove a write: run it plain, confirmsuccess: true, verify with a separate query.Trap
where,groupandonare reserved words in Apex.onis the nastiest:for (String on : map.keySet())fails withUnexpected token 'on'and then cascades a dozen unrelated errors below it —Extra ')',Method does not exist: void get() from the type Map<String,Integer>— none of which are real.Trap
Apex identifiers are case-insensitive. A parameter
srcsilently shadowed the constantSRCand mis-grouped every seeded row.Trap
Every out-of-the-box marketing tile defaults to Last 30 Days. Anchor every generator to
Date.today(), never a literal date. Hit three separate times; stale data is indistinguishable from a broken pipeline.
The part that takes the time
The data foundation
Dashboards, components and apps are straightforward once this exists. The foundation is where the difficulty lives, and it is the part that has to be right before anything downstream means anything. Everything here was verified against the source org.
The order
- Field inventory and design, complete, named, typed
- Create fields and field-level security
- Populate and verify in CRM by SOQL
- Create the data stream
- Map DLO to DMO, and verify the mapping by reading the DLO field list
- FULL refresh
- Dry-run the match rule, and state the predicted unified count
- Run identity resolution, reconcile against the prediction, explain any gap
- Segments, Calculated Insights, data graph
- Dashboards last
Steps 1 to 3 before step 4 is the rule that saves the most rework.
The data stream create contract
POST /services/data/v64.0/ssot/data-streams
{
"name": "Patient_Appointments_CRM",
"label": "Patient Appointments - CRM",
"datastreamType": "SFDC",
"connectorInfo": {
"connectorType": "SalesforceDotCom",
"connectorDetails": { "name": "SalesforceDotCom_Home", "sourceObject": "Patient_Appointment__c" }
},
"refreshConfig": { "refreshMode": "UPSERT", "frequency": { "frequencyType": "BATCH" } },
"sourceFields": [ { "name": "Id", "dataType": "Text" } ],
"dataLakeObjectInfo": {
"name": "Patient_Appointments_CRM__dll",
"label": "Patient Appointments - CRM",
"category": "Engagement",
"recordModifiedFieldName": "SystemModstamp",
"eventDateTimeFieldName": "Appointment_DateTime_c",
"dataspaceInfo": [ { "name": "default" } ]
}
}| Trap | Detail |
|---|---|
| No array wrapper | POST the object directly |
dataLakeObjectInfo takes no field list | Derived from sourceFields |
dataspaceInfo, lowercase s, inside dataLakeObjectInfo | Entries take name only |
sourceFields uses dataType on create | The read returns datatype |
| Source field types must match CRM exactly | Email declared as Text returns Expected EMAIL, was given Text |
No isPrimaryKey, shouldFetchImmediately or type in connectorDetails | Rejected on create, present on read |
Engagement category needs eventDateTimeFieldName | Give it the mangled DLO name, not the CRM name |
DELETE needs ?shouldDeleteDataLakeObject=true | Otherwise MALFORMED_QUERY |
The run trigger is POST /ssot/data-streams/{name}/actions/run with {"refreshType":"FULL"}, and POST /ssot/calculated-insights/{apiName}/actions/run with an empty body. Both return {"errors":[],"success":true}. /actions/refresh, /refresh and /data-refreshes all 404 and are not endpoints.
DMO mapping
Trap
Identity resolution operates on one DMO. "Add my object to identity resolution" always means mapping its DLO into
ssot__Individual__dlmplusssot__ContactPointEmail__dlm, not creating a parallel custom Profile DMO.Trap
auto-map-dlosomitsParentIdtossot__PartyId__con contact points. 887 email and 836 phone rows landed with a null party, orphaned, and the match rule needs that link. Always assertCOUNT(ssot__PartyId__c) = COUNT(*)after auto-map, before running identity resolution. Fix with the Auradeployaction and re-run a FULL refresh.Trap
auto-map-dlos500s while the DLO is stillPROCESSING. Wait about 60 seconds and retry. The 500 is a timing artefact, not a failure. It also only works for opinionated objects, Individual, ContactPointEmail, ContactPointPhone, Contact, Lead, Account, Order, and returnsmappedDloNames: []for anything else.Trap
There is no served DLO to DMO mapping API. The only route is the Aura
DataModelingController/ACTION$deployaction, which needs a live session.Trap
Field names mangle across three hops. CRM
Party_Title__cbecomes DLOParty_Title_cbecomes SQL and deploy sourceParty_Title_c__c. RunSELECT * … LIMIT 1once and read themetadatablock. Never guess.Trap
Always FULL refresh after a bulk source update or a new mapping. Incremental appends modified rows as new versions and silently duplicates. The tell is
COUNT(*) > COUNT(DISTINCT Id__c).
Identity resolution
Trap
Read the rule, do not trust its label. The reference ruleset is called "Fuzzy Name and Normalized Email" and contains no fuzzy matching. It is an AND of three exact criteria: first name exact, last name exact, email exactnormalized. Email alone will not resolve. A synthetic identity needs an Individual row with first and last name AND a linked ContactPointEmail row.
PATCH /ssot/identity-resolutions/{id} writes filters over REST:
| Constraint | Detail |
|---|---|
| Required | label, matchRules, reconciliationRules. Omitting any returns a named INVALID_INPUT |
| Rejected | objectApiName, dataSpaceName, output-only, JSON_PARSER_ERROR |
| Not allowed | Two definitions on the same field with the same operator inside one group, which returns "The filter contains a duplicate entry" |
| Use instead | NOT_IN with a comma-joined value, for example "Contact,Individual" |
| Reconciliation | Send entityName, fields, ruleType and sources only. Drop the linkDmoName and unifiedDmoName the GET returns |
| After PATCH | rulesetStatus goes PUBLISHING to PUBLISHED in about two minutes. Wait for PUBLISHED before running |
The data graph
The data graph is the grounding object. One retrieval answers who this member is, what their plan and risk look like, what their clinical picture is, and whether you may contact them. Nothing in the agent layer works properly without it.
Unified Individual HLS1 (Primary) 5 fields
└── Unified Link Individual HLS1 5
└── Individual 3 (+ Title, so role is visible on the grounding object)
├── Payer Profile 16
├── Patient Profile 14
└── Communication Consent 6 (Id, PartyId, ChannelTypeId, ConsentStatus,
ContactPointValueText, ConsentCapturedSourceName)Trap
Verify counts on the ID DMO, not the fragments.
*_FRAGMENT__dlmDMOs are empty, zero rows, on every graph checked. The*_ID__dlmobject carries one row per node and record and answers everything:SELECT object_name__c AS node, COUNT(*) AS rows_, COUNT(DISTINCT root__c) AS members FROM <Graph>_<epoch>_ID__dlm GROUP BY 1 ORDER BY 2 DESCTrap
The ID DMO's name carries a creation epoch you cannot derive. Find it with
GET /ssot/metadata?entityType=DataModelObject&entityCategory=Relatedand match on the display name.Trap
Orgs have a data graph cap. A failed build still occupies a slot, so delete it before retrying rather than creating a second.
Trap
POSTcreates on a 500 andDELETEdeletes on a 500. Read the state back rather than trusting the status code.Trap
A standard DMO works as a graph node, joined on its own foreign key to the parent.
dataType: "DATE_TIME"is valid input casing, and the output renders asDateTime.
Resolve, do not hardcode
Making it portable
This build references 49 distinct record ids across 22 key prefixes, plus about 21 platform-generated API names. All of them are org-specific. A rebuild in another org gets none of them. The rule: hardcode only names you create yourself, resolve everything else, and make every resolve a named call rather than a guess.
| Anchor | Resolver | Read |
|---|---|---|
| Identity ruleset id | GET /ssot/identity-resolutions | match label |
| Ruleset short id | same call | rulesetId |
| Unified DMO name | same call | reconciliationRules[].unifiedDmoName where entityName matches |
| Link DMO name | same call | reconciliationRules[].linkDmoName |
| Ruleset object API name | same call | objectApiName |
| Data stream record id | GET /ssot/data-streams/{name} | recordId |
| dseId | same call | dataLakeObjectInfo.id, truncated to 15 characters |
| DLO API name | same call | dataLakeObjectInfo.name |
| DMO relationship id | GET /ssot/data-model-objects/{dmo}/relationships | match sourceField.name plus targetObject.name, check status: ACTIVE |
| Data graph | SELECT Id, Name, DataGraphApiName, Status, LastRunStatus, RecordCount FROM DataGraph | match DataGraphApiName |
| Data graph ID DMO | GET /ssot/metadata?entityType=DataModelObject&entityCategory=Related | match displayName equal to <Label> Id |
| Segment | GET /ssot/segments | match displayName |
| Segment root DMO id | same call | segmentOnId |
| Data space | SELECT Id, Name FROM DataSpace | match Name |
Day 1
The identity spine
Nothing else works until this does. Every segment, dashboard and agent resolves through it.
Build
- Patient spine →
Patient_Spine_CRMdata stream → Individual + ContactPointEmail. There is no 520-row source object: 520 is the overlap between the payer and patient enrichment sets onMemberID__c. The remaining 120 rows on each side are sample-data leftovers. Plan for the overlap, not the total. - Role attributes, two CRM data streams:
Individual_Enrichment_Payer__c→Payer_Profile__dlm(640 rows, 42 fields 1:1) andPatients__c→Patient_Profile__dlm(640). - Appointment enrichment →
Patient_Appointment__c→Individual_Enrichment_Data_Patient__dlm. 2,989 rows, verified 3 September 2026. Earlier versions of this material said 3,725;queryAllconfirms 2,989 and the discrepancy is unexplained.Individual_Enrichment_Data_Patient__cdoes not exist in the org — the CRM-side object isPatient_Appointment__c. - Contact points: Individual / ContactPointEmail / ContactPointPhone streams. 887 email, 836 phone.
- Identity ruleset →
UnifiedssotIndividualHls1__dlm. Verified live: 784 unified profiles (759 known, 25 anonymous) from 3,482 source records, 77% consolidation.
Traps at this step
Trap
Corrected: DLO schema is not frozen at stream creation. This was published as a trap and it is wrong.
PATCH /ssot/data-streams/{name}with an extendedsourceFieldslist adds a column to a live DLO,PROCESSINGfor about 60 seconds, thenACTIVE. The dead end that produced the myth wasDELETE …?shouldDeleteDataLakeObject=truereturning 412 while identity resolution holds the DLO. Designing the full field set up front is still cheaper, but it is no longer mandatory.Trap
auto-map-dlos omits
ParentId → ssot__PartyId__con contact points. 887 email and 836 phone rows land with a null party, and the match rule needs that link. The mapping call 500s while the DLO is still PROCESSING — retry after 60 seconds. Einstein auto-map also omits the primary key and saves happily. Fix: assertCOUNT(ssot__PartyId__c) = COUNT(*)after auto-map, then fix with the Aura deploy action and a FULL refresh.Trap
DMOs union rows, they do not join columns. Mapping a second DLO into an existing DMO doubles its row count and breaks every segment built on it. Fix: map into the same standard DMO and let identity resolution collapse them, or build a related DMO.
Trap
Field name double-mangling.
X__cin CRM becomesX_cin the DLO becomesX_c__cin SQL.Trap
CRM nulls arrive as empty strings.
IS NOT NULLis therefore always true — a care-gap measure returned 2,989 instead of 482. Always test<> ''.Trap
Incremental refresh appends modified rows as new versions. 9,000 duplicates from one refresh. A mapping change needs a Full refresh; new mappings never backfill. Corrected: a data-stream refresh endpoint does exist,
POST /ssot/data-streams/{name}/actions/runwith{"refreshType":"FULL"}.Trap
Identity resolution's Source Profile Filter is inverted relative to its own UI text and silently drops NULL-valued profiles. A filter keying on a field one source did not populate admitted 146 physicians, and a reported 62% consolidation rate represented zero actual merging. Corrected: these filters are not UI-only,
PATCH /ssot/identity-resolutions/{id}writes them. Fix: OR'd filter groups keyed onData Source Object, which every source populates.Trap
Reconcile at unified grain, never row grain. 640 payer rows resolve to 619 unified individuals; row-grain counts overstate by up to 3.
How you know it worked

Day 2
Consent, then segments
Consent first. It gates every campaign number you will later quote, and retrofitting it invalidates every count you have already shown someone.
Build
- Individuals, contact points, per-subscription consent: 891 Individuals, 1,723 contact point type consents, 5,828 consent rows (verified). Generator:
SEEConsentSeed. - Mobile numbers: 836 of 889 Contacts, area code derived from MailingState, line number hashed. Generator:
SEEMobileSeed. - Four CommSubscriptions × Email and SMS channel types = 8 combinations.
- Segments: six
cld_campaign audiences over theMarketSegmentsObject.
Segment creation, the working route
PATCH /services/data/vXX/sobjects/MarketSegment/{1sg...} with IncludeCriteria as a string. Returns 204, the post-commit hook fires on plain DML, SegmentStatus goes to COUNTING within seconds and LastSegmentMemberCount lands in 30–60 seconds. This supersedes every earlier note saying segment criteria need a browser.
PATCH /ssot/segments/{apiName} is dead — it fails on referredColumns, a server-derived value the Connect path cannot compute and which is never a valid input. POST /ssot/segments does accept includeCriteria on create.
Traps at this step
Trap
One headless segment = one predicate. Compound criteria save with SUCCESS and are silently ignored.
Trap
NO_REFRESHis the default and it is permanent. Frozen membership behind a green status.Trap
A segment can report
lastSegmentMemberCountwhilesegmentMembershipTableis null and have never materialised. Reading the count alone injects phantom people. This project documented that trap and then committed it:cld_2027 Win-Back Eligiblewas catalogued as a real audience on the strength of a 784 count that was the entire population. A full sweep on 3 September found it is four segments, not one —cld_2027 Win-Back Eligible(784),Members - No Upcoming Appointments(479 of 779), and twozz_probes. All four report a count withSegmentMembershipTable,PublishStatusandLastPublishedEndDateTimeall null. Check all three fields, never the count.Trap
A segment can have working criteria that no API will show you.
HLS - No Upcoming Appointmentshas a materialised membership table and 366 real members, so it demonstrably has criteria — yetIncludeCriteriais null on the sObject and the segment is absent from/ssot/segments. Five segments in this org are in that state. A REST-only audit will report them as criteria-free, and they are not.Trap
Segments write into a shared membership table — four of them in this org, not one.
Delta_Type__ccarriesnewandexistingfor the same person, so any count not usingCOUNT(DISTINCT Id__c)is silently doubled.Trap
MarketSegmenthas noDeveloperNameorApiNamecolumn. The API name lives onMarketSegmentDefinition, which neither the data API, the Tooling API nor Apex SOQL will query. UseConnectApi.CdpSegment.getSegmentsPaginated(batchSize, offset, orderBy)— batch size first, and an offset past the end returns an empty list rather than an error.Trap
Segments cannot be deleted headlessly, and not at all once an Activation references them. Never create probe segments.
Trap
excludeCriteriais not exposed by the REST read. A REST-only audit shows a filtered segment as criteria-free.Trap
Consent specifics.
CommSubscriptionConsent.ContactPointValuecaps at 40 characters, so 216 of this org's email addresses cannot be keyed on it — join on PartyId instead. Consent value casing here isOptIn, notOPT_IN. Every create of a Custom Preference Page also sets it as that channel's default, displacing the existing one.


Waterfall segments — the contract
A waterfall is an ordered list of up to 20 segments sharing one Segment On entity, evaluated top down, first match wins, every person in exactly one bucket.
An earlier version of this material said MarketSegment exposes no SegmentType field, so a waterfall cannot be created headlessly — it is UI-only. That was wrong on both counts. The field is MarketSegmentType (values UI, DBT, Lookalike, EinsteinGptSegmentsUI, Waterfall, Realtime, Dynamic). It is createable: false on the sObject, so the sObject cannot create one — but the ordered child list is not a child object at all. It is the waterfall's own IncludeCriteria, and IncludeCriteria is plainly updateable:
{"type":"Waterfall","segments":[
{"type":"NestedSegment","nestingType":"definition","filterId":null,
"segmentId":"<child apiName>",
"subject":{"segmentDevName":"<child apiName>",
"fieldApiName":"<child displayName>",
"nestedPublishBehavior":"useSegmentCriteria"}}
]}Array position is the priority. There is no rank or sequence field. Reordering a waterfall is one write to one field, proven live. MarketSegmentDefMapping looks like the obvious home for the child list and is a red herring.
Eligibility is the real constraint: children must share the Segment On entity, not already be in another segment, and carry no publish schedule. PublishScheduleInterval is updateable, so clearing it is also one write — but it is destructive if you do not record the old schedule first.
Coverage does not change with priority order. The union is the union; only the distribution changes. The real decision is protecting small specialised audiences from large generic ones, which is why specific first is the working default.
Day 3
Engagement, campaigns, content
This is what makes every dashboard non-empty. Skip it and Day 4 shows you zeros you cannot diagnose.
Build
| Dataset | Volume (verified) | Generator |
|---|---|---|
| Six-campaign email and SMS | 4,312 rows | cld_SixEngagementSeed |
| Six-campaign web | 240 rows — 192 pageview, 48 conversion | web() builder, UTM in the page URL |
| Win-back engagement | 666 rows reaching 235 of 268 members | cld_WinbackEngagementSeed |
| Web category affinity | 5,600 rows / 344 individuals / 8 categories | cld_WebAffinitySeed |
| Campaign members | 921 across 6 campaigns | cld_SixAudienceSeed, idempotent |
| Encounters | 1,838 — 1,330 ED, 399 IP, 109 UC, 38 readmits | SEEEncounterSeed, FNV-1a deterministic |
| Message registry | 26 usable variants on B2B_Mood_Board__c, plus one blank stock record | upsert on cld_Message_Id__c |
| CMS content | 25 pieces, 6 campaigns, all Published | build.py from specs/*.json |
CMS content — the write and read contracts
PATCH /connect/cms/contents/{id} returns 405. The write path is PUT .../variants/{variantId} on the 9Ps id and it replaces the whole variant — a partial body returns a bare 500. The API wants contentBody, not the catalogued contentData. Every block id must be a real UUID. Send raw HTML; the API escapes on write.
The escaping pipeline, both directions. On write: a URL sanitizer rewrites = to = and & to & inside quoted src and href in rawHtml, then one HTML escape runs over the whole string. The inverse is one unescape pass, then a targeted URL fix — never unescape until stable, which is destructive and silent. <p>Base hero & more</p> is stored double-escaped, so one pass restores it and a second turns the intended entity into a bare ampersand, with a 200 and no warning.
Reading content back out into flat fields an LWC can bind to: headline is the first lightning/heading, body the first lightning/paragraph, CTA the first lightning/button (text plus uri), bullets the <li> items of the first lightning/html containing <ul. Identify the hero image by width="600", never by position — every email has a logo image first, sometimes lightning/html at 200px, sometimes a native lightning/image at 210. And harvest only from contentBody.sfdc_cms:block: sfdc_cms:variants[] carries alternate heroes on the same block id, so a whole-document scan picks the personalization image over the base one in most cases.
attributes.uri on a button is a plain JSON string, not escaped HTML, and still arrives with a literal & between UTM parameters. Written through unchanged, it stores a broken link.
Traps at this step
Trap
Modulo rate allocation only hits its target at multiples of 100. At n=66, a 38% target produced 58%. Use Bresenham.
Trap
String.hashCode()changes by exactly 1 when the last character does.id + '#' + saltyields correlated draws and a bimodal distribution. Salt first, then mix, in Long space.Trap
Unordered SOQL breaks first-wins de-duplication. Generator and verifier picked different winners and produced 13 phantom mismatches.
ORDER BY Idin both.Trap
MC Next dashboard tiles need exact vocabulary:
SENT/NOT_SENT,HARD_BOUNCE/SOFT_BOUNCE. Not uppercase everything —Bouncedmust becomeNOT_SENT. A missingSENDzeroes six tiles at once, and the diagnostic signature is unmistakable: CTR works while everything else reads zero.Trap
The column names are not what you would guess. The action column is
ssot__EngagementChannelActionId__c, not...ActionTypeId__c.ssot__UtmCampaignName__cholds the subject line; the campaign id is inssot__UtmId__c. The org field is literally misspelledemailConversionGaolAchieved__c.Trap
Two contaminating sources must be excluded inside every measure expression, never as a dashboard filter.
Marketing_Performance_Mock_Data(19,529 rows, correct attribution, broken identity) and legacy web ingestion (20,033 rows, stale since 2026-02-18, zero UTM). Filter onssot__DataSourceId__c = 'Salesforce_Home'.
How you know it worked


Day 4
Dashboards
Every widget can return Ok and the story on the page can still be wrong. Those are two separate checks.
Build
Two semantic models, then vizzes, then dashboards. HLS_Member_360_SDM (73 fields, 16 metrics, 4 HEDIS calculated measurements) and Marketing_Performance_Semantic_Mod_f001 (278 fields, 52 metrics, 99 calculated measurements). Then six dashboards: Population Health (43 widgets, 2 Sankeys, 2 condition-by-tier heat maps), Membership Overview (40), MI Home (30), MI Segment Overview (28), MI A/B Testing (22), Campaign Deliverability (29, app-installed).
Traps at this step
Trap
The v65 / v66 / v67 split is a per-asset property, not a required API version. Each dashboard and visualization carries its own
Versioncolumn — in this org, five dashboards at 67 and one at 65; visualizations split 5 / 30 / 3 across 65, 66 and 67. Every one of them reads cleanly over the v66.0 endpoint regardless of its own value. A re-test on 3 September 2026 could not reproduce aDOWNGRADE_VERSION_ERRORon any read at either version.
What does happen, and reads exactly like a permissions fault:GET /analytics/dashboards/{0Tr…}returns 400INSUFFICIENT_ACCESSidentically at v66.0 and v67.0. That is the CRM Analytics route refusing a Tableau Next asset — wrong endpoint family, not wrong version and not wrong permissions./wave/dashboards/{id}returns 400,/connect/analytics/dashboards/{id}and/analytics/visualizations/{id}return 404, at both versions. Read these objects over SOQL instead.
Scope of this correction: the retest covered reads only. The original claim may still hold on write paths, which were not re-exercised.Trap
Most of a Tableau Next dashboard cannot be exported. Of 195 widgets across six dashboards, 78 have a retrievable definition and 117 do not: all 81 text widgets return only an id and a parent id, so every heading and caption has to be retyped; all 33 filter widgets carry no field reference; and
AnalyticsDashboardViewDefreturns zero rows, so no per-widget placement survives — only the grid (72 columns, 12px rows, 1150px max width). Semantic models have no read endpoint at all —AnalyticsSemanticModelandSemanticModelareINVALID_TYPEon both APIs, and/ssot/semantic-models404s. Only the semantic object names each visualization binds to survive. This is an export limit, not a build limit: the self-service authoring API writes visualizations, widget placement and global filters, so the dashboards are a spec-and-replay problem.Trap
PATCHis full replace on both vizzes and dashboards. A partial PATCH once wiped a dashboard to a single widget. GET first, send the whole document. Widgetsourcemust be stripped to{id, name}.Trap
A reference line needs both
visualSpecification.referenceLines[key]andstyle.referenceLines[key]. PATCH returns 200 with only the first and the chart renders Can't show visualization.Trap
A field carrying a filter cannot also carry a sort. Use
style.allHeaders.fields.<key>.hiddenValuesso the sort survives. Mandatory for funnels.Trap
Aggregation vocabulary differs by API on the same platform:
Avgin visualizations,Averagein metrics.Trap
A dashboard filter silently ignores any tile whose metric
additionalDimensionslacks the field. EmptywidgetIdsunderfilterMode: includemeans the widget answers to nothing. And a filter widget binds to exactly one semantic model — plan mixed-model dashboards rather than discovering them.Trap
The semantic layer renames colliding fields with a numeric suffix —
AgebecomesAge1. Read the real names off the create response.Trap
Per-category colour mapping, gradients and the entire radial family are not available over REST. Build in the UI, then place by
source: {id, name}.Trap
analytics_embedding:dashboardwithdashboardId = INVALID_DASHBOARDmakes a FlexiPage permanently unsaveable over the API. Build a new page; never try to repair in place. Three pages in this org carry it.
How you know it worked

Day 5
Custom components
Build the capability layer before anything that binds to data. It was missing from the original catalogue entirely, and that is the most consequential omission in it.
Build
cld_OrgCapability and cld_EngagementSchema are the reason every controller in this pack deploys and runs in an org that has none of the objects it expects. They resolve object and field names at runtime, return empty rather than throwing when something is absent, and let a component degrade instead of failing.
Then the components, in rough order of dependency: campaign record page tabs (Audience, Members, Content, Outcomes, A/B), the 360 pages, then the standalone app pages.
The LWC deployment sequence
Three project documents disagreed about this. Resolved:
POST LightningComponentBundle— accepts scalars only.Metadata.targetsdoes not stick and no.js-meta.xmlis auto-created.POSTthe.jsresource. Before the.html, or you getNo base file for markup://c:<name>.POSTthe.html.POSTthe.js-meta.xmlexplicitly,Format: "xml". It is a normal writable resource and the only way to settargets.POSTthe.css.- Reference the component from a FlexiPage. This is the compile check. A resource POST succeeds even when the template will not compile; the FlexiPage write is what forces evaluation. Treat its 204 as the green light, not the 201 on the bundle.
LightningComponentResource.Source is plain text, not base64 — the bundle create's lwcResources is base64, and two documents recorded this backwards. Payloads truncate above roughly 8 KB. LightningComponentBundleId is insert-only.
Updating Apex that an LWC already binds to
ApexClass.Body cannot be PATCHed, and delete-and-repost fails with DEPENDENCY_EXISTS once a component binds. Use: POST MetadataContainer (name caps at 32 characters) → POST ApexClassMember {MetadataContainerId, ContentEntityId, Body} → POST ContainerAsyncRequest {IsCheckOnly:false} → poll State. A container is single-use after success, and a failed container rolls back everything including members that reported success. On failure ErrorMsg is null — the real messages are in DeployDetails.componentFailures, fetched by record id.
Traps at this step
Trap
:rootis rejected in LWC scoped CSS (LWC1535). Put design tokens on:hostor the component's own root class; dark mode via a plain@media (prefers-color-scheme: dark)block. The:root[data-theme="dark"]pattern that works in a hosted page does not compile here.Trap
fetch('/services/data/...')from an LWC returns 401. A Lightning session cookie is not an API session, and no header orcredentialsoption changes that. Before designing around a browser fetch, look for aConnectApiApex equivalent — many Connect resources have one, and it needs no callout, no named credential and no connected app.Trap
A wire parameter bound to an undefined
$recordIdnever fires and renders an empty state with no error. Bind to a field set inconnectedCallback.Trap
A getter that reads selection state must not be read by the model that selection depends on. Stamping a
rowClassonto each row by comparing againstselectedKeymade the model depend on the selection while the selection resolved back through the model — an infinite getter cycle. Selection-dependent decoration belongs in per-view getters.Trap
A LongTextArea cannot be filtered in SOQL at all, not merely aggregated.
WHERE cld_Preview_Body__c != nullreturnsINVALID_FIELD ... can not be filtered in a query call. Select it and test in memory.Trap
FlexiPage.Metadata.descriptioncaps at 255 and fails with no field named in the error, so it reads as a body-shape problem rather than a length one.itemInstancesrequire a uniqueidentifier(undocumented).CustomTab.Metadata.availablebreaks the JSON parser — omit it.Trap
Canvas 2D and WebGL do work in LWC under Lightning Web Security. No iframe needed.
Tabs, and why eight successful steps still show nothing
PermissionSetTabSetting.Visibility is DefaultOn, not Visible, and .Name takes the bare developer name — the standard- prefix is for standard tabs only. SetupEntityAccess.SetupEntityType is not writable on insert; send only ParentId and SetupEntityId. A tab listed in CustomApplication.Metadata.tabs is invisible without a PermissionSetTabSetting. CustomApplication PATCH needs the full envelope — label, navType, uiType, tabs, formFactors, brand, utilityBar — or it fails with a misleading Lightning apps only.
And then: all eight steps can succeed and the tab still not appear, because a user's personalized app navigation is authoritative and does not absorb newly added tabs. Diagnose by comparing the rendered nav against Metadata.tabs, and check /lightning/n/<tab> directly first. Querying PermissionSetTabSetting without a ParentId filter returns zero rows with HTTP 200, which reads exactly like a failed write and is not.
How you know it worked


Day 6
Agents
One irreversible field decides whether anyone can ever see the agent.
Build
Four agents, not five: Makana_Data_Agent (InternalCopilot, v3 Active, picker-visible), Makana_Segmentation_Assistant (InternalCopilot, v1 Active, picker-visible), HLS_Member_360_Agent (ExternalCopilot, v2 Active, not picker-visible), and Makana_Analytics_Agent (ExternalCopilot, v1 Inactive — a complete, never-activated duplicate). Four Apex actions: HLSAnalyticsQueryAction, HLSMemberProfileAction, HLSCareGapCohortAction, HLSSegmentCatalogAction.
Traps at this step
Trap
Without
agent_type: "AgentforceEmployeeAgent"the compiler defaults to a service agent that never appears in the in-org picker.config.agent_typeis immutable after first publish, and publish is not reversible over the API — a wrong publish leaves an undeletable orphan. This org has one.Trap
Picker visibility additionally requires a
SetupEntityAccessrow of typeBotDefinition. Active is necessary and not sufficient, and System Administrator is not exempt.GenAiPlanneris not a validSetupEntityType. Confirmed by extraction:SetupEntityAccessreturns exactly two rows across all four agents and all seven planners. The two picker-visible agents have one each. The two that are not visible fail both tests at once — wrong immutableagent_typeand noSetupEntityAccessrow — so fixing either one alone would not have surfaced them.Trap
Publish returns an
errorsarray even on success. Readseverity, not emptiness.Trap
Numeric Apex outputs need
type: objectpluscomplex_data_type_name: lightning__numberType. Compile passes; publish fails.Trap
Skip
/nextgen-authoring/.../validate. It reads the request body, not the saved asset.publishis the real validation.Trap
A Decision element in a Flow cannot see profile attributes unless a Data Graph exposes them.
How you know it worked
Section 5
Customer evidence
Every quote below is verbatim from a meeting transcript, anonymised to a segment descriptor. 205 meetings across five months, all first-party. Where a theme has no evidence, it says so.
The themes are ordered by evidence strength, not by build effort. Two of them disagree with where the work actually went. That disagreement is the point of doing the pass.
| Rank | Theme | Evidence | What it leads with |
|---|---|---|---|
| 1 | Identity resolution and duplicates | 6 quotes, 2 accounts | Unified profile, identity ruleset |
| 2 | Consent and true reachability | 5 quotes, 4 accounts | Consent model, reachability waterfall |
| 3 | Segmentation self-service | 6 quotes, 5 accounts | Segment API over REST, segmentation agent |
| 4 | Campaign build speed | 6 quotes, 3 accounts | Six-campaign pack, the rebuild path itself |
| 5 | Trust in the numbers | 4 quotes, 3 accounts | Engagement vocabulary, contamination filtering |
| 6 | Compliance and legal exposure | 5 quotes, 3 accounts | Regulatory Watch |
| 7 | Consumption cost predictability | 4 quotes, 4 accounts | Consumption rate card |
| 8 | Anonymous-to-known web behaviour | 2 quotes | Web affinity wheel |
| 9 | Adoption | 3 quotes | Trailblazer Tank, Plan Year |
| 10 | Care gaps and Star Ratings | 3 quotes, quantified | HEDIS measures, Population Health |
| 11 | Proving marketing worked | aspiration only | Campaign Outcomes, attribution models |
| 12 | Dashboards | reframed — see below | Dataviz standard |
| 13 | Portability | thin | This guide |
| 14 | Audience overlap | no demand signal — see below | Audience Priority |
| — | Network adequacy | absent — cut from the page | — |
1 · Identity resolution and duplicates
when we have a patient subscriber who does not have an email address … data cloud is somehow pulling in teammate email addresses and merging it into those subscriber records. And what we’ve seen is, at least for one poor teammate, she’s tagged on about 15 different subscriber records. And so anytime we try to send a message to one of those patients, she’s getting the email.
Somebody keyed in the wrong phone number into our patient registration system … Turns out it’s not the patient’s phone number. It belongs to rando dude. You know, three houses away.
in these five systems you’ve got Bob Smith here and Bob Smith here — are they the same Bob Smith?
2 · Consent and true reachability
A what in place? Sorry. … I don’t know what that is. … Oh, like, I don’t know. I didn’t set any of that up.
We have had tremendous challenge with opt-in. Just we send a campaign and then it goes to 50% of the audience because the other 50% has not been opted in.
SMS is kind of an embattled channel right now … we just don’t have critical mass in the channel at all right now.
3 · Segmentation self-service
[a] certified Salesforce admin, platform app builder, query guru … is working with MDM teams and database teams and everybody for weeks to try to figure out how do I structure this segment so that I get all of the people that I need?
we send a campaign, look at the insights and deliverability. See that a large percentage did not receive it. We build a report for that audience who didn’t get it, download the report, upload it to consent, opt them in manually and then resend the campaign.
we’re generating these lists twice a week. It’s just not real time, and anything short of real time is not timely in the modern world.
4 · Campaign build speed
Launching from the segment, we would typically take a sprint which is two weeks … pretty much we take about three weeks to four weeks from end to end.
we are hoping that within one or two years we will be in a better place. But for now we don’t have any ETA on when this will all be resolved. But every campaign is a struggle.
[they] want to turn this around in three weeks when this new legislation launches. And I’m like … I can’t help you in three weeks.
5 · Trust in the numbers
we sent the summer newsletter in the middle of July … and we realized that the deliverability rate had dropped to 72%, which was really alarming because the data does not change drastically from one newsletter to the other.
when I do a count of accounts where the person email is null and the status is active … I get 113,000.
if this message does not go to some patient — how do we know which message? Because there’s so many messages going in a day.
6 · Compliance and legal exposure
our legal team did not allow us to use anything beyond a patient identifier to unify patients … the only thing that was legally blessed to bring patient data together.
If you’re the same human going to [the .com] or having a registration on [the portal], I actually do not link that together, even if I know that you’re the same human. And that’s all because of just legal guidance … it is slow. And it is self inflicted.
Everyone’s so scared of TCPA compliance as well that it’s like, hesitant to make any big decisions there.
7 · Consumption cost predictability
[other cloud vendors] are all giving us sandbox for free right now … So it’s like why would we do it … and pay a premium cost just to even prove it out that it works? We are not going to get that approved, period.
can it be pulled in and referenced by these agents without incurring that data cloud cost?
we don’t want to over-engineer, and that’s probably more from a cost perspective than anything else.
8 · Anonymous-to-known web behaviour
someone could have been browsing the site for kidney-related resources for months, maybe even years, and then ultimately they become a patient … we want to understand that journey long term. What content were they consuming? When did they turn from prospect to patient? That has vast implications for our business.

9 · Adoption
I’ve tried. I have tried. I’ve clawed my way and I’ve gotten almost, but then I get stuck. It’s too techy.
we just don’t know what we don’t know.
10 · Care gaps and Star Ratings
if you were to look at [us] on the whole, you’d say that our goals were to improve our stars measures … improving med adherence, improving the CAHPS survey responses.
the people involved in the med adherence journeys are becoming compliant on their med schedules at like an 88 rate. Now, we don’t have a lift number on that because out of an abundance of caution, we didn’t have a control group.
12 · Dashboards — the theme was framed wrong
The original framing was dashboards are inventories nobody can act on. No customer said that. Nobody rejected a dashboard, called reports unread, or asked so what. The evidence says something more uncomfortable: they never got as far as a dashboard.
We actually have the engagement metrics going into the data cloud but we are not utilising them.
A year and 27 million records later and zero campaigns. We turned off the integration and we purged the data. Because it wasn’t fulfilling a purpose.
That second line is the strongest in the entire corpus, and it argues for measuring fewer things and acting on them.
14 · Audience overlap — the honest negative result
The compliance layer says the same thing from the other direction. Regulatory Watch’s top open finding in this org reads: 47 CFR 64.1200(a)(2) — the healthcare exemption permits 1 message per day and 3 per week per provider. This org has zero DataCommunicationCap records, so nothing enforces any ceiling. The marketers have no word for the problem. The regulation already does.
Cut from the page: network adequacy and access. No transcript evidence across all 205 meetings. These accounts engage on marketing and CDP, not network operations. Care Access maps and drive-time matrices stay in the build inventory; they do not get a customer-problem slide.
Section 6
Verification
Five read-only sweeps, reproducible in about four minutes, run against the live org before any demo. Everything in this document was checked against them on 3 September 2026.
Status in a catalogue decays faster than content. Every drifted number in that report was correct when written, some within the same week. Carry a verification date per section and a way to re-run the check — never a static badge.
What you inherit as broken
Honest list. These are real in the source org today and a rebuild will reproduce them unless you fix them deliberately.
Broken
| Gap | Detail |
|---|---|
| Identity resolution stale | Last ran 2026-08-29, doesRunAutomatically: false |
Decision_Authority__cio | PROCESSING_FAILED since 2026-08-21 on an hourly schedule |
| Seven Calculated Insights | Never executed. Return 0 rows with no error |
| Hero imagery | None for Flu Shot or Primary Care — the two largest audiences. One asset has a ContentVersion with no ContentDistribution |
| Female member portraits | 340 uncovered of 640 |
| Volume | Target architecture calls for ~9,500 in Tier 2; 520–640 exist. Every dashboard is built on a hero-sized dataset |
| Six orphaned LWC bundles | cldAbVariantCompare, cldAudienceOverlap, cldAudiencePriority, cldAudienceWarnings, cldPreviewHarvest, and cldPopulationHealth — the last was previously miscounted as live. Population_Health_Page hosts the Tableau dashboard via analytics_embedding:dashboard, not the component |
| Six compliance objects | Designed, packaged, never deployed — they need the Metadata API |
cld_Affinity Womens Health Interest | Publishes SUCCESS, resolves to 0 members |
| Win-Back campaign structure | Parent holds 0 members; 33 of 268 children have no engagement |
| A/B console segment link | cld_AbTestConsoleController hardcodes one segment id, so the open segment link shows the Win-Back audience on every campaign. Wrong for six of seven campaign families |
| Harmonized attribute escaping | The unified profile renders Surgical & Procedural as literal text — one unescape pass missing on the EHR service-line tile |
| Two identity rulesets consolidate nothing | HLS Physicians reports a 93% consolidation rate against zero matched source profiles over 1,951 records. ACCT - 001 resolves 91 accounts to 91 |
Closes_Care_Gap__c | All 2,989 appointments. The care-gap flag the campaign story is built on is never set |
| Five segments have unreadable criteria | Including one with 366 materialised members |
| Consent could not be joined to contacts | Contact.IndividualId was missing from the original export; consent hangs off Individual.PartyId. Fixed in the asset pack, but any export that omits that one column produces consent rows that join to nothing |
Deliberate defects, which are not gaps
79 + 11 corrupted state codes, 53 stripped-leading-zero zips, 123 of 130 Payer Age versus Contact Birthdate conflicts over three years, 9,000 duplicate engagement rows from an incremental refresh. These exist on purpose, so that harmonization has something to fix and the before state is real. Do not clean them without deciding to.
Section 7
Traps index
Every trap in this document, in one place. Each one cost at least an hour. Filter by the day you are on or the surface you are fighting.
Trap
Custom objects cannot be created over any REST surface. Tooling
CustomObjectreportscreateable: trueand rejectsFullName. There is nocreateCustomObjectaction./headless/metadatais not served.deployRequestneeds multipart. Confirmed independently four times across this project. Metadata API via thesfCLI only.Trap
Custom fields are fine over Tooling. This is the standard workaround, and it shapes the architecture: where you would reach for a new object, put fields on an existing one. Five fields on
Userreplaced a leaderboard object.B2B_Mood_Board__c, a stock SDO object, carries an entire 27-row message registry. A Tooling-created CustomField has no FLS, so SOQL and REST report No such column while Apex reads and writes it perfectly. A seed can therefore succeed against a field you cannot query.Trap
+,++,&and#in anexecuteAnonymousquery string.+decodes to a space;&truncates the body at that character and surfaces asMissing closing quote character 'at an unrelated column. UseString.joinand aListas a counter. Build the characters you need withString.fromCharArray(new List<Integer>{38}). This was the single most frequently recurring trap in the project.Trap
Throwing an exception to read a value out of
executeAnonymousrolls back every DML in that transaction. It once reverted 2,983 updates and silently no-opped a 1,165-row seed. Read-only probes only. To prove a write: run it plain, confirmsuccess: true, verify with a separate query.Trap
where,groupandonare reserved words in Apex.onis the nastiest:for (String on : map.keySet())fails withUnexpected token 'on'and then cascades a dozen unrelated errors below it —Extra ')',Method does not exist: void get() from the type Map<String,Integer>— none of which are real.Trap
Apex identifiers are case-insensitive. A parameter
srcsilently shadowed the constantSRCand mis-grouped every seeded row.Trap
Every out-of-the-box marketing tile defaults to Last 30 Days. Anchor every generator to
Date.today(), never a literal date. Hit three separate times; stale data is indistinguishable from a broken pipeline.Trap
Corrected: DLO schema is not frozen at stream creation. This was published as a trap and it is wrong.
PATCH /ssot/data-streams/{name}with an extendedsourceFieldslist adds a column to a live DLO,PROCESSINGfor about 60 seconds, thenACTIVE. The dead end that produced the myth wasDELETE …?shouldDeleteDataLakeObject=truereturning 412 while identity resolution holds the DLO. Designing the full field set up front is still cheaper, but it is no longer mandatory.Trap
auto-map-dlos omits
ParentId → ssot__PartyId__con contact points. 887 email and 836 phone rows land with a null party, and the match rule needs that link. The mapping call 500s while the DLO is still PROCESSING — retry after 60 seconds. Einstein auto-map also omits the primary key and saves happily. Fix: assertCOUNT(ssot__PartyId__c) = COUNT(*)after auto-map, then fix with the Aura deploy action and a FULL refresh.Trap
DMOs union rows, they do not join columns. Mapping a second DLO into an existing DMO doubles its row count and breaks every segment built on it. Fix: map into the same standard DMO and let identity resolution collapse them, or build a related DMO.
Trap
Field name double-mangling.
X__cin CRM becomesX_cin the DLO becomesX_c__cin SQL.Trap
CRM nulls arrive as empty strings.
IS NOT NULLis therefore always true — a care-gap measure returned 2,989 instead of 482. Always test<> ''.Trap
Incremental refresh appends modified rows as new versions. 9,000 duplicates from one refresh. A mapping change needs a Full refresh; new mappings never backfill. Corrected: a data-stream refresh endpoint does exist,
POST /ssot/data-streams/{name}/actions/runwith{"refreshType":"FULL"}.Trap
Identity resolution's Source Profile Filter is inverted relative to its own UI text and silently drops NULL-valued profiles. A filter keying on a field one source did not populate admitted 146 physicians, and a reported 62% consolidation rate represented zero actual merging. Corrected: these filters are not UI-only,
PATCH /ssot/identity-resolutions/{id}writes them. Fix: OR'd filter groups keyed onData Source Object, which every source populates.Trap
Reconcile at unified grain, never row grain. 640 payer rows resolve to 619 unified individuals; row-grain counts overstate by up to 3.
Trap
A data graph node's join key must also be a projected field on that node. The build returns
status: ERRORwith no message. Fix: GET the graph and assertpath[0].fieldNameis present on every non-root node before waiting on a build.Trap
Category cannot be changed after stream creation. Fix: decide it before you create the stream, because a data graph root must be Unified Individual.
Trap
There is no REST endpoint to run an identity resolution ruleset.
/actions/runand/jobsboth 404. Fix: the Run Ruleset button, found viaGET /ui-api/actions/record/{id}asIdentityResolutionRunNowAction, or the AuraIdentityResolutionController/ACTION$runNow.Trap
Identity resolution operates on one DMO. "Add my object to identity resolution" always means mapping its DLO into
ssot__Individual__dlmplusssot__ContactPointEmail__dlm, not creating a parallel custom Profile DMO.Trap
There is no served DLO to DMO mapping API. The only route is the Aura
DataModelingController/ACTION$deployaction, which needs a live session.Trap
Read the rule, do not trust its label. The reference ruleset is called "Fuzzy Name and Normalized Email" and contains no fuzzy matching. It is an AND of three exact criteria. Email alone will not resolve: a synthetic identity needs an Individual row with first and last name AND a linked ContactPointEmail row.
Trap
Verify data graph counts on the ID DMO, not the fragments.
*_FRAGMENT__dlmDMOs are empty, zero rows, on every graph checked. The*_ID__dlmobject carries one row per node and record and answers everything. Its name carries a creation epoch you cannot derive, so find it withGET /ssot/metadata?entityType=DataModelObject&entityCategory=Relatedand match on the display name.Trap
Orgs have a data graph cap, and a failed build still occupies a slot. Delete the failed graph before retrying rather than creating a second.
Trap
On data graphs,
POSTcreates on a 500 andDELETEdeletes on a 500. Read the state back rather than trusting the status code.Trap
One headless segment = one predicate. Compound criteria save with SUCCESS and are silently ignored.
Trap
NO_REFRESHis the default and it is permanent. Frozen membership behind a green status.Trap
A segment can report
lastSegmentMemberCountwhilesegmentMembershipTableis null and have never materialised. Reading the count alone injects phantom people. This project documented that trap and then committed it:cld_2027 Win-Back Eligiblewas catalogued as a real audience on the strength of a 784 count that was the entire population. A full sweep on 3 September found it is four segments, not one —cld_2027 Win-Back Eligible(784),Members - No Upcoming Appointments(479 of 779), and twozz_probes. All four report a count withSegmentMembershipTable,PublishStatusandLastPublishedEndDateTimeall null. Check all three fields, never the count.Trap
A segment can have working criteria that no API will show you.
HLS - No Upcoming Appointmentshas a materialised membership table and 366 real members, so it demonstrably has criteria — yetIncludeCriteriais null on the sObject and the segment is absent from/ssot/segments. Five segments in this org are in that state. A REST-only audit will report them as criteria-free, and they are not.Trap
Segments write into a shared membership table — four of them in this org, not one.
Delta_Type__ccarriesnewandexistingfor the same person, so any count not usingCOUNT(DISTINCT Id__c)is silently doubled.Trap
MarketSegmenthas noDeveloperNameorApiNamecolumn. The API name lives onMarketSegmentDefinition, which neither the data API, the Tooling API nor Apex SOQL will query. UseConnectApi.CdpSegment.getSegmentsPaginated(batchSize, offset, orderBy)— batch size first, and an offset past the end returns an empty list rather than an error.Trap
Segments cannot be deleted headlessly, and not at all once an Activation references them. Never create probe segments.
Trap
excludeCriteriais not exposed by the REST read. A REST-only audit shows a filtered segment as criteria-free.Trap
Consent specifics.
CommSubscriptionConsent.ContactPointValuecaps at 40 characters, so 216 of this org's email addresses cannot be keyed on it — join on PartyId instead. Consent value casing here isOptIn, notOPT_IN. Every create of a Custom Preference Page also sets it as that channel's default, displacing the existing one.Trap
Modulo rate allocation only hits its target at multiples of 100. At n=66, a 38% target produced 58%. Use Bresenham.
Trap
String.hashCode()changes by exactly 1 when the last character does.id + '#' + saltyields correlated draws and a bimodal distribution. Salt first, then mix, in Long space.Trap
Unordered SOQL breaks first-wins de-duplication. Generator and verifier picked different winners and produced 13 phantom mismatches.
ORDER BY Idin both.Trap
MC Next dashboard tiles need exact vocabulary:
SENT/NOT_SENT,HARD_BOUNCE/SOFT_BOUNCE. Not uppercase everything —Bouncedmust becomeNOT_SENT. A missingSENDzeroes six tiles at once, and the diagnostic signature is unmistakable: CTR works while everything else reads zero.Trap
The column names are not what you would guess. The action column is
ssot__EngagementChannelActionId__c, not...ActionTypeId__c.ssot__UtmCampaignName__cholds the subject line; the campaign id is inssot__UtmId__c. The org field is literally misspelledemailConversionGaolAchieved__c.Trap
Two contaminating sources must be excluded inside every measure expression, never as a dashboard filter.
Marketing_Performance_Mock_Data(19,529 rows, correct attribution, broken identity) and legacy web ingestion (20,033 rows, stale since 2026-02-18, zero UTM). Filter onssot__DataSourceId__c = 'Salesforce_Home'.Trap
The v65 / v66 / v67 split is a per-asset property, not a required API version. Each dashboard and visualization carries its own
Versioncolumn — in this org, five dashboards at 67 and one at 65; visualizations split 5 / 30 / 3 across 65, 66 and 67. Every one of them reads cleanly over the v66.0 endpoint regardless of its own value. A re-test on 3 September 2026 could not reproduce aDOWNGRADE_VERSION_ERRORon any read at either version.
What does happen, and reads exactly like a permissions fault:GET /analytics/dashboards/{0Tr…}returns 400INSUFFICIENT_ACCESSidentically at v66.0 and v67.0. That is the CRM Analytics route refusing a Tableau Next asset — wrong endpoint family, not wrong version and not wrong permissions./wave/dashboards/{id}returns 400,/connect/analytics/dashboards/{id}and/analytics/visualizations/{id}return 404, at both versions. Read these objects over SOQL instead.
Scope of this correction: the retest covered reads only. The original claim may still hold on write paths, which were not re-exercised.Trap
Most of a Tableau Next dashboard cannot be exported. Of 195 widgets across six dashboards, 78 have a retrievable definition and 117 do not: all 81 text widgets return only an id and a parent id, so every heading and caption has to be retyped; all 33 filter widgets carry no field reference; and
AnalyticsDashboardViewDefreturns zero rows, so no per-widget placement survives — only the grid (72 columns, 12px rows, 1150px max width). Semantic models have no read endpoint at all —AnalyticsSemanticModelandSemanticModelareINVALID_TYPEon both APIs, and/ssot/semantic-models404s. Only the semantic object names each visualization binds to survive. This is an export limit, not a build limit: the self-service authoring API writes visualizations, widget placement and global filters, so the dashboards are a spec-and-replay problem.Trap
PATCHis full replace on both vizzes and dashboards. A partial PATCH once wiped a dashboard to a single widget. GET first, send the whole document. Widgetsourcemust be stripped to{id, name}.Trap
A reference line needs both
visualSpecification.referenceLines[key]andstyle.referenceLines[key]. PATCH returns 200 with only the first and the chart renders Can't show visualization.Trap
A field carrying a filter cannot also carry a sort. Use
style.allHeaders.fields.<key>.hiddenValuesso the sort survives. Mandatory for funnels.Trap
Aggregation vocabulary differs by API on the same platform:
Avgin visualizations,Averagein metrics.Trap
A dashboard filter silently ignores any tile whose metric
additionalDimensionslacks the field. EmptywidgetIdsunderfilterMode: includemeans the widget answers to nothing. And a filter widget binds to exactly one semantic model — plan mixed-model dashboards rather than discovering them.Trap
The semantic layer renames colliding fields with a numeric suffix —
AgebecomesAge1. Read the real names off the create response.Trap
Per-category colour mapping, gradients and the entire radial family are not available over REST. Build in the UI, then place by
source: {id, name}.Trap
analytics_embedding:dashboardwithdashboardId = INVALID_DASHBOARDmakes a FlexiPage permanently unsaveable over the API. Build a new page; never try to repair in place. Three pages in this org carry it.Trap
:rootis rejected in LWC scoped CSS (LWC1535). Put design tokens on:hostor the component's own root class; dark mode via a plain@media (prefers-color-scheme: dark)block. The:root[data-theme="dark"]pattern that works in a hosted page does not compile here.Trap
fetch('/services/data/...')from an LWC returns 401. A Lightning session cookie is not an API session, and no header orcredentialsoption changes that. Before designing around a browser fetch, look for aConnectApiApex equivalent — many Connect resources have one, and it needs no callout, no named credential and no connected app.Trap
A wire parameter bound to an undefined
$recordIdnever fires and renders an empty state with no error. Bind to a field set inconnectedCallback.Trap
A getter that reads selection state must not be read by the model that selection depends on. Stamping a
rowClassonto each row by comparing againstselectedKeymade the model depend on the selection while the selection resolved back through the model — an infinite getter cycle. Selection-dependent decoration belongs in per-view getters.Trap
A LongTextArea cannot be filtered in SOQL at all, not merely aggregated.
WHERE cld_Preview_Body__c != nullreturnsINVALID_FIELD ... can not be filtered in a query call. Select it and test in memory.Trap
FlexiPage.Metadata.descriptioncaps at 255 and fails with no field named in the error, so it reads as a body-shape problem rather than a length one.itemInstancesrequire a uniqueidentifier(undocumented).CustomTab.Metadata.availablebreaks the JSON parser — omit it.Trap
Canvas 2D and WebGL do work in LWC under Lightning Web Security. No iframe needed.
Trap
Without
agent_type: "AgentforceEmployeeAgent"the compiler defaults to a service agent that never appears in the in-org picker.config.agent_typeis immutable after first publish, and publish is not reversible over the API — a wrong publish leaves an undeletable orphan. This org has one.Trap
Picker visibility additionally requires a
SetupEntityAccessrow of typeBotDefinition. Active is necessary and not sufficient, and System Administrator is not exempt.GenAiPlanneris not a validSetupEntityType. Confirmed by extraction:SetupEntityAccessreturns exactly two rows across all four agents and all seven planners. The two picker-visible agents have one each. The two that are not visible fail both tests at once — wrong immutableagent_typeand noSetupEntityAccessrow — so fixing either one alone would not have surfaced them.Trap
Publish returns an
errorsarray even on success. Readseverity, not emptiness.Trap
Numeric Apex outputs need
type: objectpluscomplex_data_type_name: lightning__numberType. Compile passes; publish fails.Trap
Skip
/nextgen-authoring/.../validate. It reads the request body, not the saved asset.publishis the real validation.Trap
A Decision element in a Flow cannot see profile attributes unless a Data Graph exposes them.
Published changes
Corrections
Everything here was verified. When something turns out to be wrong, it gets corrected in public with a date rather than quietly edited.
| Date | What changed | Why |
|---|---|---|
| 4 September 2026 | DLO schema is frozen at stream creation was published as a trap | Wrong. PATCH /ssot/data-streams/{name} with an extended sourceFields list adds a column to a live DLO, PROCESSING for about 60 seconds, then ACTIVE. The dead end that produced the myth was DELETE …?shouldDeleteDataLakeObject=true returning 412 while identity resolution holds the DLO. Designing the full field set up front is still cheaper, but it is no longer mandatory |
| 4 September 2026 | Source profile filters are UI-only | Wrong. PATCH /ssot/identity-resolutions/{id} writes them |
| 4 September 2026 | There is no data-stream refresh endpoint | Wrong. POST /ssot/data-streams/{name}/actions/run with {"refreshType":"FULL"} |
| 4 September 2026 | Tableau Next dashboards were described as unrebuildable and requiring manual redrawing | Wrong. The authoring API exposes full widget creation with placement and filter field references, plus a promotion-package export. Reading an existing dashboard back is still not possible; building one always was |
| 4 September 2026 | Fake_Report_Data_Object__c field count corrected from 7, then 31, to 36 | The first number was the count granted by one permission set, not the object's shape |
| 3 September 2026 | An API-version trap was qualified and scoped to read operations only | It could not be reproduced on a second attempt |
Section 8
Downloads
The build
The asset pack
Everything behind the screenshots on this page. Apex, components, page placement, data and configuration.
553 files · 1.04 MB
Full file list: /manifests/asset-pack.txt
Download the asset packData only
Makana mock data
The thirteen datasets on their own, if you have an org and just need something in it. Scrubbed and synthetic.
13 datasets · 467 KB
Download the mock dataClaude skills
Salesforce SE skills
Five skills for driving Salesforce over its APIs — headless discovery, campaign build, web affinity, Tableau Next, and SE triage.
5 skills · 36 KB
Download the skillsThe thirteen datasets
| File | Rows | What it is |
|---|---|---|
appointments.csv | 2,989 | Patient appointment history, the engagement timeline on the unified profile. |
campaign-members.csv | 1,189 | Campaign membership: which contact is in which campaign, with status. |
campaigns.csv | 10 | Campaign records, including parent and child rows for the multi-content campaigns. |
cms-content.json | 25 | Salesforce CMS content pieces captured from the Marketing Cloud workspace. |
consent/comm-subscription-channel-type.csv | 11 | Subscription and channel pairings, the join between subscription and engagement channel. |
consent/comm-subscription-consent.csv | 5,828 | The consent grants themselves, one row per party, subscription and channel. |
consent/comm-subscription.csv | 7 | The subscription definitions consent rows point at. |
consent/contact-point-type-consent.csv | 1,723 | Per contact-point consent, email and phone, separate from subscription consent. |
consent/engagement-channel-type.csv | 2 | The engagement channel lookup: email and SMS. |
contacts.csv | 890 | Patient-facing contacts. The spine every other dataset joins to. |
message-registry.csv | 27 | Marketing Cloud Next message registry rows, one per campaign and channel. |
patients.csv | 640 | Clinical patient records on Patients__c, keyed to contacts by email. |
payer-enrichment.csv | 640 | Payer and plan enrichment on Individual_Enrichment_Payer__c. |
The five skills, in full
claudforce-hls-rebuildUse when the user wants to build, rebuild or stand up a healthcare Salesforce demo org with Data Cloud, Marketing Cloud Next and Agentforce, or asks to follow the Claudforce HLS rebuild path.
---
name: claudforce-hls-rebuild
description: Use when the user wants to build, rebuild or stand up a healthcare Salesforce demo org with Data Cloud, Marketing Cloud Next and Agentforce, or asks to follow the Claudforce HLS rebuild path.
---
# Claudforce HLS rebuild
Routing only. The material lives in the tools, not here. Do not restate the guide.
## Two servers
- **Claudforce HLS MCP** carries the knowledge: the ordered route, the verified traps, the skills,
the dataset shapes, the verifications. It has no access to any Salesforce org and never will.
- **Salesforce MCP**, connected to the org being built in, issues every call.
If only one is connected, stop and say which is missing. Neither half builds anything alone.
## Procedure
1. Call `start_here` before anything else.
2. Read the route: `get_guide`, or `list_sections` then `get_section`.
3. Build the data foundation first, in the documented order, before dashboards, components or
agents. Everything downstream inherits its defects.
4. Before each Data Cloud step, call `search_traps` filtered to that surface. Read the result
before issuing the call, not after it fails.
5. After each step, call `verify_step` and run the query it returns against the target org.
Reconcile the result against the stated expectation. Report any gap as a finding.
6. Never trust a status code. A 200 means the parser accepted the request. Several operations in
this build create on a 500, succeed while doing nothing, or discard half the payload.
7. Resolve every org anchor at runtime: record ids, DMO names, ruleset ids, graph epochs, content
keys. Ids in the guide belong to the org it was written from. Query for the anchor, never reuse
one from documentation.
8. `get_dataset_schema` before loading data, `get_manifest` before trusting a download's contents,
`get_skill` for the surface-specific procedures.
## Stop conditions
- A verification fails and you cannot explain the gap. Report it; do not proceed downstream.
- A step has no verification available. Say so explicitly rather than declaring it done.
- An anchor cannot be resolved from the target org. Ask; do not guess a value.salesforce-se-osOne triage entry point for Solutions Engineer work, built to run off call transcripts and pasted context rather than a live CRM connection.
---
name: salesforce-se-os
description: One triage entry point for Solutions Engineer work, built to run off call transcripts and pasted context rather than a live CRM connection. Use this skill whenever the user wants to analyze a customer call, build a follow-up, plan next steps, prep for an upcoming conversation, research a product/competitor/technical topic, or scope a Salesforce solution. Trigger on phrases like "analyze this call", "what did I miss on this call", "draft a follow-up", "prep me for [account]", "what do I need to know before [meeting]", "what does this customer actually need", "how would I solution [use case]", "research [topic/competitor]", or any customer-conversation, follow-up, planning, research, or solutioning ask — even when the user doesn't name which mode they want. The skill self-routes and shows the routing decision back. Built for a marketing-focused SE who covers all clouds, so assume multi-cloud solutions are common. Always use this over generic prep, note-summarizing, or research when the request is SE-shaped.
---
# Salesforce SE OS
One entry point for Solutions Engineer work. Read the request, route it to the right mode, and always show the routing decision back so the user can see what was chosen and what was rejected.
**This skill runs off what the user gives you — call transcripts, notes, emails, deal descriptions, and pasted context — not a live CRM.** Claude is not connected to Salesforce CRM here. Treat transcripts and pasted context as the primary source of truth. If the user happens to paste CRM fields, use them; otherwise never assume CRM data exists and never invent it.
The user is a Solutions Engineer at Salesforce, marketing-focused but covering all clouds. Solutions frequently span more than one cloud (e.g. Marketing Cloud + Data Cloud + core Sales/Service), so never assume a single-cloud answer is complete without checking whether adjacent clouds are in play.
## The revenue + customer-success lens
Every output should name **both** sides, kept honest:
- **The customer need** — what the customer actually said they need, in their words, grounded in the transcript.
- **The Salesforce angle** — how solving that need maps to revenue (expansion, new cloud, retention) *and* to the customer's own success.
Keep the two aligned. The revenue angle must follow from a real need in the transcript — never manufacture urgency or an expansion story the call doesn't support. A follow-up that overreaches past what the customer said damages trust and the deal. When the transcript doesn't support a revenue angle, say so plainly and keep the focus on the need.
## How it works
- **Always available (no integrations):** Reasoning over whatever the user pastes — transcripts, call notes, emails, deal descriptions, product docs — plus general product and market knowledge.
- **If connected (web search, uploaded files, or user-provided context):** Live web and developer-doc search, enablement content, and any CRM fields the user chooses to paste.
- If a source isn't available, don't fabricate it. Say so in the footer and continue with what's provided.
## Phase 1 — Triage
Classify the request into exactly one mode:
- **Call Analysis** — "analyze this call", "what did I miss", "what were the signals", "summarize this transcript". Input is a transcript or notes.
- **Follow-up / Planning** — "draft a follow-up", "what are my next steps", "build the plan for this account", "what should I send". Turns a call or context into action.
- **Conversation Prep** — an upcoming call, meeting, or QBR, or "what do I need to know about [account]" before talking to them.
- **Research** — a product, market, competitor, or technical topic with no specific call tied to it.
- **Solutioning** — designing, scoping, or troubleshooting a solution or use case for a customer.
- **General/Unclear** — doesn't cleanly fit, or spans more than one.
Capture any account, topic, or use case named. If mode is ambiguous **and** no transcript/context/topic is given, ask one bundled question: "What's this for — analyzing a call, building a follow-up or plan, prepping for a conversation, research, or scoping a solution? And can you paste the transcript or context?"
If context is given but mode is unclear, infer the most likely mode and proceed — state the assumption in the footer rather than asking.
If the request spans two modes ("analyze this call and draft the follow-up"), run both phases and combine into one output with two sections. Call Analysis feeding Follow-up is the most common pairing — expect it.
**Log the fork as you go.** This skill's whole point is showing its work, so track not just what you chose but what you considered and rejected. For each decision, note in one short line (under ~15 words) *why* — which words in the request or which line in the transcript triggered it. This feeds the mandatory Triage Rationale table. Capture:
- The mode chosen **and** the modes considered but dropped, with the reason each was dropped.
- Sources used vs. skipped, and why each was skipped (unavailable, not relevant, out of scope).
- Items included vs. notable items excluded, and why the excluded ones didn't make the cut.
The rejected side matters as much as the chosen side — it's how the user checks whether the skill routed correctly.
## Phase 2 — Gather (mode-specific)
**Call Analysis:**
- Work from the transcript or notes the user pasted. Pull out: stated needs and pains, explicit and implicit requirements, objections, buying/expansion signals, competitor mentions, who was in the room and their apparent role, and any commitments made by either side.
- Separate what the customer *said* from what you're *inferring*. Label inferences as such.
- Don't invent details the transcript doesn't contain. Gaps are findings too — flag what wasn't covered but should have been.
**Follow-up / Planning:**
- Ground every action in something from the call or context — a stated need, an open question, a commitment made. Quote or reference the source line.
- Draft follow-ups (email, next-step list, mutual plan) that reflect what the customer actually asked for. Surface any commitment the SE made on the call so it doesn't get dropped.
- Flag open questions the SE still needs answered before the deal can progress.
**Conversation Prep:**
- Work from whatever the user pastes about the account — prior call notes, email threads, context. If they paste CRM fields (opportunities, amounts, stages), use them; otherwise proceed on context alone and note the absence in the footer.
- Surface: what's known about the account's needs, open threads from last contact, and what to confirm or advance in this conversation.
**Research:**
- Search the web and connected enablement content for the topic.
- For anything technical, search Salesforce developer documentation dynamically — see "Developer documentation search" below.
- No external search available → rely on general knowledge but label it unverified rather than sourced fact.
**Solutioning:**
- Work from the requirement as described in the transcript or context. Restate the use case in your own words and confirm it against what the customer said.
- Identify **which clouds the requirement touches** before searching — marketing use cases routinely pull in Data Cloud for unified profiles, core platform for records, and Service or Commerce depending on the flow. Name the cloud combination explicitly.
- Search for relevant solution patterns, architecture references, and product capabilities — see "Developer documentation search" below. Label the source of each.
### Developer documentation search
For Research and Solutioning, search Salesforce technical sources **dynamically** rather than citing a fixed link list — the right page depends on the clouds in play. When web search is available, search live and cite what you find; when it isn't, point the user to the right hub to search themselves and label it as a pointer, not a sourced answer.
Match the source to the clouds the requirement touches. Common starting points:
- **Developer hub** — `developer.salesforce.com/docs` — the index for all API, Apex, and platform references.
- **Core platform** — Apex, SOQL/SOSL, REST API, Bulk API, Metadata API references under the developer hub.
- **Marketing Cloud** — Marketing Cloud Engagement APIs and SDKs; Marketing Cloud Growth on the core platform.
- **Data Cloud** — Data Cloud developer docs (data model, ingestion, identity resolution, calculated insights) — where most modern marketing solutioning lands.
- **Reference architectures** — `architect.salesforce.com` — for solution patterns and multi-cloud blueprints.
- **Enablement framing** — Trailhead — for how to position or explain a capability.
Because solutions often span clouds, expect to search more than one of these for a single requirement, and surface related links across them rather than stopping at the first cloud that fits. Prefer live search results over general knowledge whenever search is available.
## Phase 3 — Synthesize
- Ground everything in the transcript or pasted context. Never invent financial figures, dates, stages, or commitments — if the user pasted them, use them; if not, mark "[not in transcript]" rather than guessing.
- Apply the revenue + customer-success lens: for the needs surfaced, name both the customer's success outcome and the Salesforce revenue angle, kept honest against what the call supports.
- For Research and Solutioning, tie findings back to the customer need they address (e.g. "this answers the identity-resolution need the customer raised at [point in call]"). If no need is tied, state findings as general enablement.
- For multi-cloud solutions, make the cloud dependencies explicit — which cloud owns which part of the flow — since that's where scoping and licensing questions surface.
## Phase 4 — Output
Match the output to the triaged mode, using this exact structure:
```
# [Mode]: [Account / Topic]
**Assumed mode:** [state only if inferred rather than confirmed; otherwise omit this line]
## Triage Rationale
(this is the audit — chosen vs. rejected, so you can see if it routed right)
| Decision | Chose | Rejected / skipped | Why |
|---|---|---|---|
| Mode | [mode chosen] | [modes considered and dropped] | [phrase/context that decided it] |
| Sources | [sources used] | [sources skipped, or "none"] | [why each was skipped] |
| Items | [items kept] | [notable items left out] | [why they were excluded] |
--- (if Call Analysis) ---
## What the customer said
[stated needs, pains, requirements, objections — grounded in the transcript, sourced to points in the call]
## Signals & inferences
[buying/expansion signals, competitor mentions, room dynamics — labeled as inference where not explicit]
## Gaps
[what wasn't covered but should have been]
--- (if Follow-up / Planning) ---
## Next steps
[each action tied to a source line from the call/context]
## Draft follow-up
[email or message reflecting what the customer actually asked for]
## Open questions
[what the SE still needs answered]
--- (if Conversation Prep) ---
## What's known
[account needs and open threads from prior context]
## Advance in this conversation
[what to confirm or move forward]
--- (if Research or Solutioning) ---
## Key Findings
[bulleted, each cited to source — live search / dev docs / architect.salesforce.com / general knowledge, labeled accordingly]
**Clouds involved:** [list the clouds the solution touches, or "single cloud: [name]"]
--- (all modes) ---
## Need + revenue lens
- **Customer need:** [what they actually need, from the transcript]
- **Salesforce angle:** [revenue + customer-success mapping, honest to what the call supports, or "transcript doesn't support a revenue angle yet"]
---
**Footer:** [sources used; anything skipped and why; assumptions made]
```
## Key principles
- Transcripts and pasted context are the source of truth. Claude is not connected to CRM — never assume or invent CRM data.
- Never invent financial figures, dates, stages, or commitments. Missing → "[not in transcript]".
- The revenue angle must follow from a real need in the call. Never manufacture urgency or an expansion story the transcript doesn't support — overreaching past what the customer said costs trust and the deal.
- The Triage Rationale table is mandatory on every run. Always show both the chosen and rejected side.
- Default to the mode the evidence supports; ask only when both mode and context are missing.
- Assume multi-cloud until proven otherwise for solutioning — surface adjacent clouds rather than stopping at the obvious one.
- Search developer docs dynamically and cite what you find; label general knowledge as such.sfdc-headless-discoveryFind an unknown Salesforce API contract instead of guessing or escalating to a human: the enumerators, the three oracles, route families to try in order, error messages that mislead, and the escalation gate.
---
name: sfdc-headless-discovery
description: "Find an unknown Salesforce API contract instead of guessing or escalating to a human: the enumerators, the three oracles, route families to try in order, error messages that mislead, and the escalation gate. Use whenever a Salesforce step looks impossible over the API, a name or shape is unknown, a doc says something needs the UI, or you are about to hand a step back to the user."
---
# Headless discovery
Every "impossible over the API" met so far was one of six things: a missing request field, a wrong API version, an unexamined Aura call, a stale assumption in your own docs, a name guessed instead of enumerated, or **the wrong route family**. Zero were real capability gates. Read this before recording an impossibility or asking someone to click.
## The rule
When you do not know a NAME or a SHAPE, find the thing that ENUMERATES it. The tell that you are guessing: candidates are coming from intuition rather than from a response. Bulk guessing has never converged in practice (60 rejected definition names on one occasion, 32 on another); a single enumerator call has, repeatedly.
## Enumerators by question
| Question | Enumerator |
|---|---|
| What operations exist here? | MCP `discover` in plain words, then `describe` for the path and schema |
| What buttons does a record page have? | `GET /ui-api/actions/record/{id}` |
| Is there a standard invocable? | `GET /actions/standard`, grep the name. This is how segment publish was found (`cdpPublishSegment`) |
| Is the sObject writable where Connect is not? | `GET /sobjects/{Object}/describe` and check `updateable` per field |
| What components exist and what props? | `GET /component-catalog/components?target=...`, then `/component/{ns}/{name}/{Module or Component}/source` |
| What does a valid body look like? | GET a complete existing object of the same type, ideally one the UI created |
| What does the UI call? | Intercept `POST /aura`, read the descriptor, replay it |
| What DMOs and fields exist? | `GET /ssot/metadata?entityName=...` |
## The three oracles
1. **Schema oracle.** A strict validator with `additionalProperties: false` names every rejected and required property and lists enum values. Send `{}` to learn what is required; send a batch of guesses and whatever is not named as rejected is real.
2. **Processor oracle.** On a schema free `object`, a 500 means a recognised key with a wrong shape, and a transformed read back (HTML escaping) means recognised and processed. A 200 there proves nothing.
3. **Editor oracle, the cheapest and most overlooked.** The API only names keys you send; it never volunteers one. So the fastest schema source is an object the UI already wrote. SOQL the records of that type, GET one, diff against yours. Check this FIRST in a new org. It costs one query and one GET, and it has repeatedly beaten hours of probing.
## Route families, in order
1. Connect API (`/connect/...`, `/ssot/...`)
2. **Standard invocable actions** (`/actions/standard/{name}`, invoked with `{inputs:[{...}]}`)
3. sObject API, including objects that look internal (MarketSegment, FlowRecord, ManagedContentVariant)
4. Tooling API, including `MetadataContainer` for in place Apex updates and `PackageInstallRequest` for managed packages
5. Aura capture and replay (needs a browser)
Metadata API deploys are not reachable through the MCP connector, so custom objects and org wide overrides stay clicks.
**Two routes that solved things a "proper" route could not:**
- `PackageInstallRequest` installed a data kit that the product's own deploy endpoint silently no-opped on, and unlike that endpoint it has a real per request status reader.
- `MetadataContainer` plus `ApexClassMember` plus `ContainerAsyncRequest` updates Apex in place when a `Body` PATCH is refused, without deleting a class other components depend on.
## Errors that are not what they say
| Message | Meaning |
|---|---|
| `Set the segmentType to Dbt or Lookalike` | You did not send `segmentType` |
| `Expected referredColumns to be not empty` | This route cannot write; use the sObject route |
| `500 Internal error` on a data graph write | It committed. GET before retrying |
| `No such column` right after a 201 field create | FLS. Grant it on a standalone permission set |
| Aura `200` with `actions:[]` | Wrong descriptor, or stale captured token |
| `INSUFFICIENT_ACCESS_ON_CROSS_REFERENCE_ENTITY` on a Tooling Apex Body PATCH | Use MetadataContainer |
| `AURA_COMPILE_ERROR ... missing label` on an LWC bundle POST | You sent `targetConfigs` as raw XML, or a `.js-meta.xml` |
| A list route 404 | It may need a filter parameter to serve at all. `data-model-object-mappings` only responds with `?dmoDeveloperName=` |
| Any `200` or `SUCCESS` | Nothing. Verify with an independent read |
An error naming a field is a missing field error, not a capability gate.
## Small traps that cost real time
- A `+` in an `executeAnonymous` query string decodes as a space and the compile error points at the wrong token. Build output with a `List<String>` and `String.join`.
- A `throw` in `executeAnonymous` rolls back all DML in that block.
- Never send back HTML that a GET returned. Where a write applies a sanitizer plus an escape, the correct inverse is to unescape until stable, and it must cover every text bearing field including URLs.
- `FieldPermissions` cannot be written to a permission set inside a permission set group.
- A record page that sets `parentFlexiPage` inherits regions you cannot edit or remove, and the parent may not exist in Tooling at all. Build standalone if you need control of the whole page.
- Some list endpoints page at 10 regardless of `limit` and 500 on a larger one. Read by name instead.
## When a subagent or a long run is involved
Cap each unit at roughly 20 to 25 calls and ten minutes, and report at the cap even if incomplete. A partial result with the exact blocking error is worth more than an overrun. State a hard rule that a run must not delete anything it did not create, because a delete-and-recreate that fails halfway leaves a worse state than not starting.
## Escalation gate
Hand a step to a human only when all five are true: the enumerator for this class was used and does not cover it; the newest API version was tried; the UI can do it and its captured call does not replay, or no browser is available and you say so; no OOTB or editor authored example exists to read; no equivalent route or outcome exists.
Then escalate the **cheapest possible action** ("build one in the UI once and I will read it back", "authorize the target once"), say exactly what you will do with it, and keep building everything around it.
## Doc hygiene and honesty
A documented impossibility that was never re-tested against a named endpoint is a hypothesis, not a fact. When you disprove one, correct the doc in the same pass with the route that worked, the exact body, and the trap that hid it.
Never report a UI outcome you have not seen. "Persisted and processor recognised" is a different claim from "renders in the editor", and conflating them wastes someone's afternoon.sfdc-mcnext-campaign-buildBuild Marketing Cloud Next campaigns headlessly through the Salesforce MCP connector: campaign records, Data Cloud segments with criteria and publish, email and SMS content, Dynamic Content personalization points, Journey flows with real Path Experiment elements, campaign members, and mock engagement that actually renders in the OOTB dashboards.
---
name: sfdc-mcnext-campaign-build
description: "Build Marketing Cloud Next campaigns headlessly through the Salesforce MCP connector: campaign records, Data Cloud segments with criteria and publish, email and SMS content, Dynamic Content personalization points, Journey flows with real Path Experiment elements, campaign members, and mock engagement that actually renders in the OOTB dashboards. Use when asked to create, rebuild, or package a marketing campaign, segment, flow, email or SMS content, dynamic or personalized content, campaign goals, or mock engagement data in a Salesforce demo org."
---
# MC Next campaign build, headless
Every contract here ran live in a healthcare demo org on 2026-09-01/02 through `mcp__Salesforce_-_Beta__dispatch` alone. No browser, no CLI, no Data Kit. Six campaigns end to end took about 90 minutes once these traps were known. Read the traps before the steps.
## Operating rules
- Work in units of one campaign or one layer, each under ~25 API calls, and post a one line status after each. A silent 90 call agent reads as "stuck".
- Never delete anything that existed before the run. Segments cannot be deleted over the API; name probes `zz_`.
- A 200 or 201 is a claim. Read the object back and reconcile counts against an independent `POST /ssot/queryv2` at the same grain.
- Never send back text that a GET returned (see escaping below).
- **Long waits belong outside the run.** A data stream takes 5 to 11 minutes to surface rows and an identity resolution job takes 10 to 30. Fire those and check on a later turn; never sleep inside an agent waiting for them.
- No em dashes in any generated copy.
## Order
```
campaigns -> segments -> content -> dynamic content -> flows -> members and mock engagement -> web -> dashboards
```
Ids flow downstream: campaign ids into content UTMs, segment ids into flow starts, content keys into flow sends.
## Campaigns
`POST /services/data/v67.0/composite/sobjects` with Campaign records. Put the brief in `Description`; downstream agents read it for the content angle.
## Segments, fully headless
| Step | Call |
|---|---|
| Create | `POST /ssot/segments` `{displayName, segmentOnApiName, segmentType:"EinsteinGptSegmentsUI"}` |
| Criteria | `PATCH /sobjects/MarketSegment/{1sg}` `{"IncludeCriteria":"<JSON string>"}` -> 204 |
| Schedule | same PATCH: `PublishScheduleInterval`, `PublishScheduleStartDateTime`, `PublishType`, `PublishScheduleInfo` (JSON string) |
| Publish now | `POST /actions/standard/cdpPublishSegment` `{inputs:[{segmentId}]}` |
The Connect `PATCH /ssot/segments/{apiName}` cannot write anything, not even a rename: `referredColumns` is server derived. The sObject route is the write path. `saveAndCount` and the sObject route both silently ignore compound AND/OR criteria and count everyone, so one predicate per segment; for compound audiences compute a flag field on the CRM source and segment on `contains`. `GET /ssot/segments` 500s in some orgs; use SOQL `FIELDS(STANDARD) FROM MarketSegment`. An unpublished segment has no membership rows and will not appear on a contact card.
**The segment apiName is not on the sObject.** `MarketSegment` has no `DeveloperName` and no `ApiName`. The Data Cloud api name, which Dynamic Content targeting rules require, comes only from `GET /ssot/segments/{1sg id}` -> `segments[0].apiName`. It is the display name with non-alphanumeric runs collapsed to single underscores.
Profile DMO attributes are RELATED (three hops: Unified, UnifiedLink, ssot__Individual, profile DMO). Read the path off an existing segment; never guess it.
**Audience size is a design input.** A segment returning ten people cannot express a rate: opens, clicks and bounces all round to something absurd, and any guaranteed-minimum in the mock generator dominates. Widen the predicate before that campaign goes in a demo rather than inflating its data.
## Content
Create `POST /connect/cms/contents`, publish `POST /services/data/v62.0/connect/cms/contents/publish`. Flow reference is `marketing--Default_Content_Workspace.sfdc_cms__email--<contentKey>`.
Build from a generator with JSON specs, not by hand: subject <= 50 chars, H1 <= 9 words, one paragraph with `{!$recipient.FirstName}`, one `lightning/button` with `uri`, a three item list, plain language footer. SMS is `<Brand>: <benefit <= 20 chars> <link>?src=<code> Reply STOP to opt out.` at <= 160 chars with ONE query param.
**Image hosting is the biggest time sink.** `ContentVersion` needs base64 in JSON, so the model transcribes 15 to 45 KB per image and one will come back truncated. Host hero images on the public demo website instead and reference them from a `lightning/html` img tag. Upload only small assets like a logo (a 200px lockup is about 2 KB base64).
**A PUT on a content variant is a full replace and there is no PATCH** (the route allows DELETE, GET, HEAD, PUT). A partial body returns a bare 500 UNKNOWN_EXCEPTION, not a validation error. Send the complete `contentBody` including `sfdc_cms:block` on every write.
**Locate the hero block by `width="600"` in its rawHtml**, never by position. The logo is a `lightning/html` img on some emails and a `lightning/image` contentKey block on others, so "the first lightning/html block" picks the logo on half of them.
### The escaping algorithm, and its exact inverse
The API applies two stages on write: a URL sanitizer that rewrites `=` to `=` and `&` to `&` **inside quoted src and href values inside rawHtml only**, then a single HTML escape over the whole string. The `uri` of `lightning/button` never goes through stage one, which is why it stores a bare `=` and a single `&`.
So the inverse is **one** html.unescape pass, then `=` to `=` and `&` to `&` inside quoted src and href values only.
Unescaping until the string stops changing is WRONG and silently destructive. Writing `<p>Base hero & more</p>` stores `<p>Base hero &amp; more</p>`, so one pass returns the original and a second turns an intentional `&` into a bare `&`. Write the inverse as a script, not by hand, and have it refuse to emit a body containing residual `&amp;` or `&#61;`.
The sanitizer also appends `noopener noreferrer` to every `rel` on every write, so collapse it to one pair on read; API written content then sits stably at two pairs. `'` reappearing after a write is correct. `&amp;` or `&#61;` in a button `uri` is corruption.
### Publish returns 400 when there is nothing to publish
`POST /connect/cms/contents/publish` returns `400 INVALID_API_INPUT "Your content wasn't published. Try again."` when the pieces are already Published with no pending delta. Retrying, splitting the batch and changing API version never clear it. Verify with `status.status` and `isPublished` on the variant instead of trusting the publish call, and note a single deployment can flip pieces beyond the ids you listed.
## Dynamic Content, fully headless
Three objects, not one. The email holds no rule; it holds a name reference to a decision.
**Step 1, the personalization point.** `POST /services/data/v67.0/personalization/personalization-points`:
```json
{"name":"cld_<campaign>_<piece>_v1","label":"...","description":"email:<content title>",
"dataSpaceName":"default","profileDataGraphName":"<the graph the email declares>",
"schemaEnum":"ExperienceVariation","source":"BlockBuilder",
"sourceRecordId":"<the ManagedContent 20Y id, NOT the 9Ps variant id>",
"isAuthenticationRequired":false,
"decisions":[{"name":"<decision>","label":"...","description":"...","state":"Live",
"attributeValues":[{"attributeEnum":"Variation","value":"<the SAME decision name>"}],
"targetingRules":{"operator":"And","type":"Group",
"rules":[{"operator":"IsIn","segmentName":"<segment apiName>","type":"Segment"}]}}]}
```
Do not send `status`; it is rejected and server set, going Processing then Active in seconds. Priority is the decision's `Priority`. The Default or Fallback the editor shows is not a stored object, it is the base content. One point can hold several priority-ordered decisions when you want more than two creative variants on one email.
**Step 2, bind it on the email**, in the same full body PUT:
```json
"sfdc_cms:variants":[
{"id":"<uuidA>","name":"<one variation name>","type":"personalization",
"body":{"subjectLine":"...","preheader":"..."}},
{"id":"<uuidB>","name":"<the SAME name>","type":"personalization",
"body":{"sfdc_cms:block":{"children":[{"id":"<target block id>","definition":"lightning/html",
"type":"block","attributes":{"rawHtml":"<img ... />"}}]}}}],
"sfdc_cms:operations":[
{"definition":"sfdc_cms__pspVariantOperation",
"attributes":{"personalizationPoint":{"dataspace":"default","name":"<point name>"},
"decisionToVariantList":[{"decisionName":"<decision>","variantId":"<uuidA>"}]}},
{"definition":"sfdc_cms__pspVariantOperation","targetId":"<target block id>",
"attributes":{"personalizationPoint":{"dataspace":"default","name":"<point name>"},
"decisionToVariantList":[{"decisionName":"<decision>","variantId":"<uuidB>"}]}}]
```
One variant per scope. Subject line and preheader are one scope, each overridden block is another; a variation touching both is two variants sharing one name, which is what the editor shows as Linked. `targetId` absent means email level, present means that block. The block level variant body is flat: `sfdc_cms:block.children[]` holds the overriding block with the SAME id, no section or column wrapper. `dataspace` is lowercase inside the operation and `dataSpaceName` is camelCase on the point; both are correct.
**`lightning:expressions[]` is not involved and stays empty**, including on editor authored variations. Guessing definition names there is the classic dead end; the definition you want is `sfdc_cms__pspVariantOperation`.
**Vary the image AND the copy, then prove it.** A variation whose variant hero is the same file as the base and whose subject matches the base is wired correctly and shows the recipient nothing different. Diff the variant `src` against the base `src` (compare on the `ids=` parameter or the filename, not the escaped string) before calling it done.
Design rule: target a segment OTHER than the campaign's own audience. Targeting a campaign at its own segment matches 100 percent of the send and makes the default dead.
Other traps: changing a block's `definition` after operations are bound returns `DeleteRestrictedByFkException` and writes nothing, so restructure before attaching. A point bound to content can never be deleted, even after the content is deleted; an unbound point deletes cleanly. SMS content is flat with no blocks, so it carries no dynamic image.
## Flows, with a real Path Experiment
`POST /tooling/sobjects/Flow` `{FullName:"flow_<campaignId>_<epoch>", Metadata:{processType:"Journey", status:"Draft", start:{triggerType:"Segment", segment:"<18 char MarketSegment Id>", connector}, decisions, actionCalls, waits, experiments, exitRules}}`.
**A Journey Flow POST creates the FlowRecord automatically**; FlowRecord itself has zero createable fields. Link to the campaign with `PATCH /sobjects/FlowRecord/{2aF}` `{"AssociatedRecordId":"<701>"}`.
The Path Experiment element, verified accepted:
```json
"experiments": [{
"name": "cld_Path_Experiment",
"label": "A/B: <the two angles>",
"type": "Automatic",
"testGroupPercentage": 20,
"duration": 2,
"durationUnit": "Weeks",
"fallbackMode": "BestPerformer",
"primaryMetric": "Conversion",
"paths": [
{"name":"Path_A","label":"Path A","percentage":50,"connector":{"targetReference":"Send_Email_A"}},
{"name":"Path_B","label":"Path B","percentage":50,"connector":{"targetReference":"Send_Email_B"}}
]
}]
```
Do not model an A/B split as a Decision. The real element exists and the API accepts it.
Other flow facts: `waits[]` need `defaultConnectorLabel`; `offsetUnit: "Hours"`; `SECOND()` needs `TIMEVALUE()`. A Tooling PATCH on a Draft Journey flow **re-issues the Flow Id**, so re-query `FlowDefinition.LatestVersionId` after every PATCH. `InvalidDraft` status is normal until From address, subscription, SMS sender code and a segment schedule are set, and is acceptable in a demo org.
## Members and mock engagement that actually renders
Apex generators, deployed with `POST /tooling/sobjects/ApexClass`. Use **Bresenham style allocation**, not modulo: a modulo cycle only hits the target rate when n is a multiple of 100 and is wrong in every real cell.
### The vocabulary that decides whether the OOTB dashboards show anything
This is the difference between a campaign that looks alive in the standard Insights and Deliverability tabs and one that shows a wall of zeros. Event types alone are not enough; two status fields decide it.
| Field | MUST be | Not |
|---|---|---|
| `ssot__EmailRecipientSendStatus__c` | `SENT`, and `NOT_SENT` on a bounce | `Sent`, `Bounced`, `Delivered` |
| `ssot__EmailBounceType__c` | `HARD_BOUNCE` / `SOFT_BOUNCE` | `Hard`, `Soft` |
| `ssot__EngagementChannelActionId__c` | `SEND`, `SEND_STATUS`, `OPEN`, `CLICK`, `BOUNCE`, `UNSUBSCRIBE` | anything partial |
Note the trap inside the trap: it is not "uppercase everything". `Bounced` becomes `NOT_SENT`, because that field describes whether the send succeeded, not what happened afterwards.
**The diagnostic signature: Click-Through Rate renders correctly while every other tile reads zero.** CTR is clicks over opens and applies no send-status filter; Sends, Open Rate, Click Rate, Delivery Rate, Bounces and Opt-Out Rate all count or divide by sends. If you see that pattern, it is the vocabulary, not missing data. Confirm by diffing your rows against a pre-existing dataset in the same org that does render.
More rules:
- **Emit the full lifecycle.** Missing `SEND` zeroes six tiles at once because it is the denominator.
- **Guarantee an EMAIL-channel floor.** At a realistic 1 to 2 percent, a 135 person audience can produce a single bounce and land it on SMS by chance, leaving every Email deliverability tile blank. Force the first recipient of each variant to bounce and the second to unsubscribe.
- **Bounces and unsubscribes must exist on the EMAIL channel specifically**; the Deliverability tab filters `ssot__EngagementChannelTypeId__c = EMAIL`.
- **Fill the whole 30 day window.** Anchor to `Datetime.now()` and spread sends across roughly now-26d to now-6d. Data at a fixed offset ages out of a Last 30 Days filter while the org sits idle.
- **Make the seed idempotent** (delete by a group field, re-insert) so it is safe to re-run, and re-run it after any idle period.
- Verify by joining `ssot__EmailEngagement__dlm` through `ssot__BulkEmailMessageId__c` to `ssot__BulkEmailMessage__dlm.ssot__CampaignId__c`; there is no campaign column on the engagement DMO. The action column is `ssot__EngagementChannelActionId__c`, not `...ActionTypeId__c`.
Plausible seeding ranges, so the out-of-the-box dashboards read as a real campaign rather than a wall of zeros: open 32 to 45 percent, click to open 12 to 18, SMS response 15 to 22, conversions 2 to 4 percent of sends. Click to open is the most stable of these across industries and the least distorted by Apple Mail Privacy Protection, so it is the one worth generating carefully. Make B beat A on most campaigns but not all. Cells under n = 60 cannot express a rate.
### Apex mechanics
**Updating a class in place** (a PATCH of `Body` fails with INSUFFICIENT_ACCESS_ON_CROSS_REFERENCE_ENTITY, and deleting a class an LWC or guest site depends on is unsafe):
```
POST /tooling/sobjects/MetadataContainer {"Name":"..."}
POST /tooling/sobjects/ApexClassMember {MetadataContainerId, ContentEntityId, Body}
POST /tooling/sobjects/ContainerAsyncRequest {MetadataContainerId, IsCheckOnly:false}
poll ContainerAsyncRequest for State
```
Apex traps: a `+` in an `executeAnonymous` query string decodes as a space and produces a compile error pointing at the wrong token, so build output with a `List<String>` and `String.join` and never use `i++`. A `throw` in the same block rolls back all DML, so commit with a plain call and read counts in a separate throwing call. **`when` is a reserved word** and cannot be a variable name. Apex identifiers are case insensitive, so a parameter `src` shadows a constant `SRC`. DLO columns are `<field>_c__c`, CRM fields are `<field>__c`.
Data stream refresh is `POST /ssot/data-streams/{name}/actions/run` `{}`. The verb is `run`, not `refresh`.
## Campaign outcomes and goals
Before trusting a custom-built outcomes panel, read its controller. Common defects found in one: objective and conversion signal were restricted picklists with defaults, so unset campaigns displayed a confident wrong answer instead of a blank; actual counted CampaignMembers at one specific status; channel credit was derived from the campaign **name**, making the attribution model selector inert; and the "web is not connected" caveat was a hardcoded literal that checked nothing.
Derive channel touches from real engagement rows, allocate credit per model (first, last, linear, time decay with a 7 day half life, position based), and compute percent in Apex because `SUM OVER PARTITION` is unavailable in Data Cloud SQL here. Set targets from the real converted contacts so attainment lands between roughly 60 and 115 percent with variety; every campaign at exactly 100 reads as fake.
## Reporting
Per unit: a table of ids, counts against predicted counts, every error verbatim, and the human steps that remain. Write a log doc per layer to the project.sfdc-web-affinityStand up website behavioural data in a Salesforce demo org: a portable instrumented website, category tagging, the Web SDK and connector, DLO to DMO mapping, a category affinity Calculated Insight, an affinity wheel on the contact card, a guest write endpoint for an instant web-to-contact demo, and what it actually takes to segment on any of it.
---
name: sfdc-web-affinity
description: "Stand up website behavioural data in a Salesforce demo org: a portable instrumented website, category tagging, the Web SDK and connector, DLO to DMO mapping, a category affinity Calculated Insight, an affinity wheel on the contact card, a guest write endpoint for an instant web-to-contact demo, and what it actually takes to segment on any of it. Use when asked about web engagement, affinity wheels, category tagging, web attribution, the Web SDK, personalization zones, or connecting a website to Data Cloud."
---
# Web engagement and category affinity
Built and verified 2026-09-02 in a healthcare demo org. This covers the website, the pipeline into Data Cloud, the affinity insight, the contact card component, and the limits of each.
## The chain
```
page or article tagged with one of N categories
-> event carries the category (in the URL path and as an attribute)
-> DLO
-> mapped to ssot__WebsiteEngagement__dlm.engagementServiceLine__c
-> Calculated Insight: person x category x count x last seen
-> Apex controller -> affinity wheel LWC on the Contact page
```
Two sources feed the same DMO by design: seeded mock rows through a CRM object, and live rows through a guest endpoint or the Web connector. Everything downstream is source agnostic, which lets the whole story be built and demoed before a connector exists.
## Know what the pipeline costs before promising a demo
Measured, not estimated:
| Hop | Trigger | Time |
|---|---|---|
| Browser to CRM row | immediate | under a second |
| CRM row to Data Cloud DMO | data stream run | **5 to 11 minutes** |
| DMO to affinity CI | CI run | seconds once triggered |
| CI to wheel | page load | immediate |
| CRM Contact to unified profile | identity resolution job | **10 to 30 minutes** |
Neither middle step fires on its own. A CI on a 24 hour schedule means today's clicks surface tomorrow unless you run it. Identity resolution may have `doesRunAutomatically: false`, in which case it has not run since somebody last pressed the button. **Read `lastJobCompleted` before assuming anything is current.**
Consequence for agents: never sleep inside a run waiting for these. Fire the job, end the turn, check later.
## What needs identity resolution and what does not
This distinction decides whether a demo works, and people assume wrongly in both directions.
| Capability | Needs identity resolution |
|---|---|
| Affinity wheel and recent web engagement on the contact card | **No.** Key on email and record id directly |
| Segment membership, campaign entry, activation | **Yes.** Segments run on the unified DMO |
So a person can appear on a contact card with a full affinity wheel minutes after typing their email, and still be invisible to every segment. Say this out loud when handing the kit over; a teammate will assume the wheel appearing means the person is targetable.
And even once unified, a web-only visitor matches nothing if every segment filters on payer or patient profile attributes they do not have. Behaviour-based targeting needs a segment built on web engagement or the affinity insight, not on profile fields.
## Taxonomy first, and keep it fixed
Pick 6 to 8 categories and never vary them. They appear in the site tags, the seed, the DMO field, the CI group by, and the LWC palette; changing the list means touching all five. Fewer than about six makes a thin, unconvincing wheel.
**Every category must map to something already in the org** (a condition flag, a quality measure, a campaign), or the wheel is decorative. The point is to enable "reads diabetes content and has an open A1C gap", not a pretty chart.
## Seeding realistic affinity
The weighting matters more than the volume. Per person: a dominant category at about 45 percent of their events, a secondary at 25, the rest spread over two or three others. Event counts varied (3 to 30). Timestamps across 90 days weighted recent. Derive everything from a hash of the person id so it is reproducible rather than random.
**Derive the dominant category from the person's real profile**, first match wins: diabetes flag to a diabetes category, hypertension to cardiovascular, an open screening gap to that screening category, Medicare or 60 plus to benefits, and so on, with a small percentage overridden to a rare category so it is represented.
A uniform random seed produces a flat wheel that reads as noise. Across eight categories the flat baseline is 12.5 percent; a real preference needs to sit three to four times above it. The same applies to a live visitor: four categories at two events each draws an evenly quartered wheel that is technically correct and visually meaningless, so coach the demo to click one category repeatedly.
Idempotency: a regenerate of thousands of rows exceeds the 10,000 DML row limit, so have `run(true)` purge and ask to be called again. Two calls for a clean rebuild.
## Identity: key on email, not a record id
The single most important design decision. A live visitor is identified by **email**, not a CRM record id, so seed the mock rows with the email too. `ssot__WebsiteEngagement__dlm.ssot__AccountContactId__c` declares a relationship to `ssot__ContactPointEmail__dlm.ssot__EmailAddress__c` and beacon mappings typically write the email into both that and `ssot__IndividualId__c`. Match on both, case insensitively; `LOWER()` works in the CdpQuery dialect.
Email matching email needs no identity resolution, which is what makes a live demo possible.
Know the limits and say them out loud: browsing done **before** someone identifies themselves carries no email and never joins. That is true of every web personalization story, not a defect.
## DLO to DMO mapping contract
| Fact | Detail |
|---|---|
| List | `GET /ssot/data-model-object-mappings?dmoDeveloperName=<dmo>`. **The bare list route 404s**; the query parameter is what makes it serve |
| Item route | `GET`, `HEAD`, `DELETE` only. `PATCH` returns METHOD_NOT_ALLOWED |
| Adding a field | Delete the mapping, re-POST the full field list plus the new pair. A second POST alongside fails with `DUPLICATE_DLO_TO_DMO_MAPPING` |
| Field name mangling | A CRM field `X__c` becomes `X_c__c` in the mapping body |
Refresh a stream with `POST /ssot/data-streams/{name}/actions/run` and an empty body. The verb is `run`, not `refresh`; `refresh` 404s.
One DLO can map into more than one DMO. If a web mapping reuses a field that an email mapping also uses (for example a send-status field carrying `utm_medium` for the web rows), never bulk-rewrite that field without excluding the web rows by channel.
## Calculated Insight contract
| Step | Call |
|---|---|
| Create | `POST /ssot/calculated-insights` with exactly `apiName`, `displayName`, `definitionType: "CALCULATED_METRIC"`, `publishScheduleInterval`, `publishScheduleStartDateTime`, `expression`. Do NOT send `dimensions`, `measures` or `dataSpace`; they are derived and the create fails |
| Interval value | `"TWENTYFOUR"`, echoed back as `TWENTY_FOUR`. `DAILY`, `Daily`, `DAY` and `Days` are all rejected |
| Run now | `POST /ssot/calculated-insights/{apiName}/actions/run` `{}` |
| Read | `GET /ssot/calculated-insights/{apiName}`. The `-definitions` path and `/runs` are 404s. Query its output at `{apiName}`, not `{apiName}__dlm` |
**Validate the SQL on queryv2 first**, but know the limit: queryv2 and the CI engine are different dialects. `DATE_SUB` exists in the CI dialect and fails on queryv2. So queryv2 validates grain, joins and aggregation only.
**Dimensions are frozen at create.** Measures and the expression patch freely; changing a dimension means delete and re-POST. Decide the grain first, and when in doubt include both candidate person keys as dimensions so the CI does not go blind when the live key differs from the seeded one. Note that a CI dimensioned on email and a CRM record id does not automatically join to the unified individual, which is the entity segmentation runs on.
## The wheel component
Apex controller plus an inline SVG donut LWC on the Contact page. Rules that matter:
- Compute percent in **Apex**, never in Data Cloud SQL (`SUM OVER PARTITION` is unavailable).
- Restrict to the known category list. The DMO field is polluted beyond null: real values include `SMS`, `WEB` and stray record ids, so filtering with `<> ''` grows junk categories.
- Always return every category, so a partial ring still draws a complete circle, and return an explicit empty flag rather than a broken wheel for people with no browsing.
- Read Data Cloud first, fall back to CRM SOQL both on exception **and on zero usable rows**, and say which path ran in a `dataSource` string. Given the 5 to 11 minute ingestion lag, the CRM fallback is what makes a live demo work at all; consider making it the primary path for records carrying the live-visitor marker.
- Use a categorical palette that cannot be confused with semantic red, amber and green used for compliance status elsewhere.
LWC bundle traps: a POST rejects a supplied `.js-meta.xml` as auto generated, and `targetConfigs` as raw XML triggers a misleading `AURA_COMPILE_ERROR` about a missing label. Send only html, js and css, and put `masterLabel`, `isExposed`, `apiVersion` and `targets` in the bundle metadata.
## Portable website
Remix rather than rebuild. Regenerating a site from a prompt produces different markup, and the sitemap binds to `data-event` attributes and path patterns, so a rebuild means re-deriving every rule.
Strip the personalization theater but **keep the identity plumbing**: the hidden admin identity page, every `data-event` attribute, the sitemap and schema, and the category tags. Removing the identity switcher kills affinity entirely.
One value cannot be copied: the beacon GUID is per connector. Put it, and any endpoint URL, in **one config file** so a teammate changes one file.
No credentials are needed anywhere. The beacon GUID is a public identifier in a CDN URL, and a Salesforce Site guest user serves anonymous traffic. If a website project asks for OAuth client secrets, something is architecturally wrong; remove it.
**Check that capture actually fires on the action the user takes.** A common and invisible failure: the handoff is called from a page-view handler, while every form submit sets local state and shows an inline success message without changing route. The forms then capture an email that never leaves the browser, and the only thing that ever posts is a later navigation. Test one form end to end and count the records; do not read the code and assume.
**Attributes are not wiring.** `data-event` attributes on buttons document intent. Unless the SDK reads them or an onClick calls the tracker, they do nothing. Check which.
**A remix call that times out has usually still succeeded.** Re-sending creates a duplicate project and burns credits; check the project list before retrying.
## The instant demo path, and the bug that will bite you
Real beacon events take minutes to reach Data Cloud, which kills a three minute demo. For the demo moment only, a guest accessible Apex REST endpoint on a Salesforce Site can take an email plus the session's browsing history, find or create a Contact, and write engagement rows directly, so the wheel paints in seconds.
**The Guest User cannot SEE Contact records under `with sharing`.** A class declared `global with sharing` runs its match query, gets zero rows every single time, and inserts a NEW Contact on every call. Eight page views produce eight duplicate contacts each holding one event, so no record ever has enough history to draw a wheel. The symptom looks like a broken affinity pipeline rather than a sharing problem, which is what makes it expensive.
Fix: put the lookup and insert in a private `without sharing` inner class, scoped as narrowly as possible, one exact-email query and one insert. Also give every event a stable id key and skip keys already stored, so a resent visit log cannot inflate the affinity.
This is a **demo only pattern, never production**. Guard it: a shared token in the body (not a secret, it ships in client JavaScript, so say so in the code), an allowlist of categories, a cap on events per call, write only with no data returned beyond the record id, and a marker field on everything created so it is deletable. Gate any created-versus-matched response behind the token or the endpoint becomes an email enumeration oracle.
Guest access needs: an Apex class grant, object create and field permissions on a permission set assigned to the site guest user (all API writable), and a `CorsWhitelistEntry` for the site origin. **Guest reachability can only be proven from a browser**; an authenticated call proves nothing.
## Before claiming a site is connected to Data Cloud
Check both halves and report which exist:
- **Site:** an SDK script tag in `index.html`, an init call, and a real beacon GUID. A `BEACON_GUID` constant whose value is the literal string `BEACON_GUID`, imported by nothing, is a placeholder.
- **Org:** a Web and Mobile App connector among the data connections, and an uploaded schema.
A site that console-logs, dispatches a `CustomEvent` and writes `localStorage` is an event-log demo, not an SDK integration, and it captures nothing anonymously. Calling that "web affinity is set up" when the affinity is entirely seeded plus one guest endpoint is the kind of claim that falls apart in front of a customer.tableau-next-dashboard-craftBuild, style and embed Tableau Next (Salesforce) dashboards, visualizations, metrics and semantic models over the REST API in any demo or customer org, with the eye of a data-viz engineer and the discipline of a technical PM.
---
name: tableau-next-dashboard-craft
description: "Build, style and embed Tableau Next (Salesforce) dashboards, visualizations, metrics and semantic models over the REST API in any demo or customer org, with the eye of a data-viz engineer and the discipline of a technical PM. Use whenever someone mentions Tableau Next, Tableau Einstein, Data 360 analytics dashboards, semantic models, metric tiles, \"Can't show visualization\", embedding analytics in a Lightning page, or wants a dashboard that looks designed (goal lines, colour by category, title cards, section bands) rather than a default grid of charts."
---
# Tableau Next dashboard craft
You are acting as a technical product manager who used to be a data-viz engineer and still cares how a dashboard feels in the hand. Two beliefs drive everything below. First, the REST API is the real authoring surface: a dashboard generated from a script is reproducible, reviewable and portable across orgs, and the UI is for discovering shapes you cannot guess. Second, a dashboard is an argument, not an inventory. Every chart title states a finding, every section answers a question, every colour means one thing.
This skill was distilled from ~35 build passes in a healthcare payer demo org (membership, population health) between Aug 29 and Sep 1 2026. Grades used throughout: **[org]** executed live; **[doc]** Salesforce Help; **[gap]** tried and rejected or never found. Do not promise a prospect anything marked [gap].
The full reference set (exact JSON contracts, design system, every gotcha, learning links, and Python generators) lives in the packaged skill folder `tableau-next-dashboard-craft/` (references/api-contract.md, references/design-system.md, references/gotchas-and-challenges.md, references/learning-links.md, scripts/), which is not included in this public pack. When those files are available, read the matching one before building. When they are not, the essentials are below.
## The workflow that works
### 0. Get the org facts first
1. Confirm Tableau Next Creator/Consumer permission set licenses are Active.
2. `GET /services/data/v67.0/tableau/workspaces` and `GET /services/data/v67.0/ssot/semantic/models`.
3. **List existing instances of whatever you are about to create** (`GET /services/data/v66.0/tableau/visualizations`, `/services/data/v67.0/tableau/dashboards`) and read one complete body. OOTB dashboards (Campaign Insights, Consumption Analytics, Marketing Performance) are the schema documentation the API does not give you. This habit cracked every blocker we hit.
4. Note the semantic model id (`2SM…`), workspace id (`1Dy…`), and the semantic **object** apiName (e.g. `PayerProfile`), which is not the DMO name.
### 1. Build bottom-up: semantic model → metrics → vizzes → dashboard → embed
- **Semantic model**: `POST /ssot/semantic/models`, then `data-objects` with `dataObjectType: "Dmo"` and `shouldIncludeAllFields: true`. Relationships use `joinType: "Auto"` and semantic field api names (digit-suffixed on collision). Calculated Insights cannot be added as data objects [gap].
- **Metrics** `POST …/models/{model}/metrics`: `aggregationType` is `Average`/`Sum`/`Count` (not `Avg`), `timeDimensionReference` required in practice, `additionalDimensions` must include every field a dashboard filter uses or the filter silently ignores the tile. PUT/DELETE only, no PATCH.
- **Visualizations** `POST /services/data/v66.0/tableau/visualizations`: v66.0, because `marks`/`rows`/`columns`/`style` cap at API 66.07 (the "not allowed for API version 67.0" error is a version window, not a permission gate). Use `viewSpecification.filters` (plural). Viz `function` is `Avg`. Label ≤ 80 chars. `style.fit: "Entire"` on every dashboard viz. `style.axis[key]` for every continuous field. PATCH is a full replace.
- **Dashboards** `POST/PATCH /services/data/v67.0/tableau/dashboards`: `workspaceIdOrApiName` is the field that unblocks create (the "ask your admin" message is a missing workspace). PATCH is a full replace: send `label`, `name`, `workspaceIdOrApiName`, `layouts`, `widgets` every time. Widget `source` on input is `{id, name}` only. Response carries `status: Ok` per widget; read it.
- **Embed**: Lightning App Builder Tableau Next Dashboard component, or Tooling API FlexiPage component `analytics_embedding:dashboard` with `dashboardId` = api name, `height`, `hideTitle true`, `navigationMode Inline`. Height ≈ rows × rowHeight + gaps + 60.
### 2. Render-breaking rules
1. A reference line needs both halves: `visualSpecification.referenceLines[key] = ["Line", {"type":"Line","fieldKey":"F2","scope":"Table","line":{"valueType":"Value","value":0.75,"label":{"type":"Custom","labelText":"Goal 75%"}}}]` AND `style.referenceLines[key] = {"isVisible":true,"lineFormat":{"color":"#B91C1C","type":"Solid"},"labelAlignment":{"vertical":"Top","horizontal":"Right"}}`. Spec alone returns 200 and renders "Can't show visualization". Read-back drops the wrapper array; restore it before the next PATCH. `Dashed` is rejected.
2. A Color encoding (`marks.ALL.encodings: [{"fieldKey":"F3","type":"Color"}]`) needs `legends.F3` with a `position`, `style.marks.ALL.color.color: ""`, and F3 absent from `allHeaders.fields`. Auto palette only; per-category colour maps, gradients, `Funnel`, `Pie` are [gap] over REST. Build in the UI, GET, copy.
3. Crosstab needs `style.axis[<MeasureValues key>]`.
4. Dashboard `maxWidth` wider than the Lightning region makes the whole canvas blurry (CSS-scaled). 1000–1150 for a full-width app page.
5. Viz label does not render on the dashboard; the row field label does. Hide it (`style.fieldLabels.rows.showLabels: false`) and use a text title card.
### 3. Design pass (where the wow comes from)
- Grid: 72 columns, `rowHeight 12`, `cellSpacingX/Y 8`. Filters 11 cols × 5 rows, brand block 17 cols × 5 rows (15px bold + 12px subtitle), divider rule 1 row, hero 8 rows, section bands 3 rows, title cards 6 rows, charts 18 rows, tiles 24 rows, tables 40. Halves and full width only; thirds clip a 13px sentence.
- Hero: one sentence with the number in it (20px bold `#2E1065` on `#EDE9FE`) plus what to do about it (13px `#5B21B6`).
- Section band: `#E8EAF0`, 4px left border in the family colour, 12px caps label.
- Title card above every chart: 13px bold ink `#042339` takeaway + 11px muted `#5A6B7B` subtitle (denominators, time frame, caveats), tinted family background, 2px family bottom rule, radius 8; chart below white with left/right/bottom `#E5E5E5` border so the pair reads as one card.
- One colour family per meaning: blue `#1D4ED8` cost, teal `#0F766E` membership/brand, purple `#6D28D9` clinical, amber `#B45309` retention, green `#15803D` quality, red `#B91C1C` goal lines and utilization pressure, slate `#5A6B7B` neutral. Tints: `#EFF6FF #F0FDFA #F5F3FF #FFFBEB #F0FDF4 #FEF2F2 #F1F5F9`.
- Metric tiles: white, 4px top border in the family colour; `insights` on for at most two headline tiles.
- Goal bars = horizontal bar + red labelled reference line. This replaces gauges and bullet graphs.
- Titles state findings with the number in them; rates over counts when cohorts differ; denominators and thin cells (n<30) in the subtitle; say "placeholder" when a goal is one.
### 4. Verify live, then write it down
PATCH → read per-widget `status` → reload the embedded page → screenshot. A 200 proves the parser accepted it, not that it renders. Log ids, accepted and rejected values. Call out anything added unasked. When an unknown shape survives three error-walk attempts, stop and build one in the UI, GET it, copy it.
## Still open (Sep 2026)
Per-category colour mapping, gradient shading, Funnel and heat-map marks, dynamic text bound to metrics, measure filters, viz-level calcs, metric value formatting (0.77 vs 77%), Flow actions, Summary/Parameter/Image widget REST shapes. All exist in the UI; REST shapes are [gap].
## Learning links
Help hub: https://help.salesforce.com/s/articleView?id=analytics.tua_create.htm · Dashboards: https://help.salesforce.com/s/articleView?id=analytics.tua_create_dashboard.htm · Reference lines: https://help.salesforce.com/s/articleView?id=analytics.tua_create_viz_reference_line_about.htm · REST API: https://developer.salesforce.com/docs/analytics/tableau-next-rest-api/overview · Semantics APIs: https://developer.salesforce.com/docs/data/semantic-layer/guide/get-started.html · Embedding SDK: https://developer.salesforce.com/docs/analytics/sdk/guide/sdk-overview.html · Trailhead trail: https://trailhead.salesforce.com/content/learn/trails/unlock-actionable-data-insights-with-tableau-next · Craft: https://www.vizwiz.com/2018/07/visual-vocabulary.html, https://www.storytellingwithdata.com/blog/2020/3/5/transforming-slide-titles, https://www.perceptualedge.com/articles/misc/Bullet_Graph_Design_Spec.pdfThe datasets: schema and first 20 rows
appointments.csv2,989 rows · 19 columns
Join keys: Patient__c -> patients.Id · Patient_Email__c -> contacts.Email
| Column | Type |
|---|---|
Id | salesforce id |
Name | text |
Patient_Email__c | text |
Patient__c | salesforce id |
Appointment_External_Id__c | text |
Appointment_DateTime__c | datetime |
Status__c | text |
Appointment_Type__c | text |
Modality__c | text |
Service_Line__c | text |
Provider_Key__c | text |
Clinic_Location__c | text |
Cancellation_Reason__c | text |
No_Show_Reason__c | text |
Lead_Time_Days__c | integer |
Booking_Channel__c | text |
Reminder_Sent__c | boolean |
Closes_Care_Gap__c | boolean |
Care_Gap_Type__c | text |
First 20 rows
| Id | Name | Patient_Email__c | Patient__c | Appointment_External_Id__c | Appointment_DateTime__c | Status__c | Appointment_Type__c | Modality__c | Service_Line__c | Provider_Key__c | Clinic_Location__c | Cancellation_Reason__c | No_Show_Reason__c | Lead_Time_Days__c | Booking_Channel__c | Reminder_Sent__c | Closes_Care_Gap__c | Care_Gap_Type__c |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| a37Hu000008OlkZIAS | APT-0000001 | arthur.ashcombe1@example.com | a2uHu00000ALL6fIAH | APT-a2uHu00000ALL6fIAH-0 | 2026-07-27T13:00:00.000+0000 | Completed | Follow Up Visit | In Person | Primary Care | PRV-000 | Makana - Greater Indianapolis | 31 | Web | True | False | |||
| a37Hu000008OlkaIAC | APT-0000002 | arthur.ashcombe1@example.com | a2uHu00000ALL6fIAH | APT-a2uHu00000ALL6fIAH-1 | 2026-07-26T14:00:00.000+0000 | Completed | Follow Up Visit | In Person | Primary Care | PRV-000 | Makana - Greater Indianapolis | 34 | Mobile App | True | False | |||
| a37Hu000008OlkbIAC | APT-0000003 | arthur.ashcombe1@example.com | a2uHu00000ALL6fIAH | APT-a2uHu00000ALL6fIAH-2 | 2026-07-25T15:00:00.000+0000 | No Show | Initial Visit | In Person | Primary Care | PRV-000 | Makana - Greater Indianapolis | Forgot | 20 | In Person | True | False | ||
| a37Hu000008OlkcIAC | APT-0000004 | arthur.ashcombe1@example.com | a2uHu00000ALL6fIAH | APT-a2uHu00000ALL6fIAH-F | 2026-09-26T16:00:00.000+0000 | Scheduled | Follow Up Visit | In Person | Primary Care | PRV-000 | Makana - Greater Indianapolis | 29 | Phone | False | False | |||
| a37Hu000008OlkdIAC | APT-0000005 | arthur.brightwater1@example.com | a2uHu00000ALL6gIAH | APT-a2uHu00000ALL6gIAH-0 | 2025-08-25T14:00:00.000+0000 | Completed | Follow Up Visit | In Person | Primary Care | PRV-017 | Makana - Chicago | 3 | Web | True | False | |||
| a37Hu000008OlkeIAC | APT-0000006 | arthur.brightwater1@example.com | a2uHu00000ALL6gIAH | APT-a2uHu00000ALL6gIAH-1 | 2025-08-26T13:00:00.000+0000 | Completed | Preventive Screening | In Person | Primary Care | PRV-017 | Makana - Chicago | 5 | Phone | True | False | |||
| a37Hu000008OlkfIAC | APT-0000007 | arthur.brightwater1@example.com | a2uHu00000ALL6gIAH | APT-a2uHu00000ALL6gIAH-F | 2026-09-29T13:00:00.000+0000 | Scheduled | Follow Up Visit | In Person | Primary Care | PRV-017 | Makana - Chicago | 32 | Phone | False | False | |||
| a37Hu000008OlkgIAC | APT-0000008 | arthur.caldwell1@example.com | a2uHu00000ALL6hIAH | APT-a2uHu00000ALL6hIAH-0 | 2025-07-18T14:00:00.000+0000 | Completed | Follow Up Visit | In Person | Primary Care | PRV-018 | Makana - Boston | 14 | Web | True | False | |||
| a37Hu000008OlkhIAC | APT-0000009 | arthur.caldwell1@example.com | a2uHu00000ALL6hIAH | APT-a2uHu00000ALL6hIAH-1 | 2025-07-17T15:00:00.000+0000 | Completed | Follow Up Visit | In Person | Primary Care | PRV-018 | Makana - Boston | 40 | In Person | True | False | |||
| a37Hu000008OlkiIAC | APT-0000010 | arthur.caldwell1@example.com | a2uHu00000ALL6hIAH | APT-a2uHu00000ALL6hIAH-2 | 2025-07-16T16:00:00.000+0000 | Cancelled | Follow Up Visit | In Person | Primary Care | PRV-018 | Makana - Boston | Patient Conflict | 42 | Phone | True | False | ||
| a37Hu000008OlkjIAC | APT-0000011 | arthur.caldwell1@example.com | a2uHu00000ALL6hIAH | APT-a2uHu00000ALL6hIAH-3 | 2025-07-15T17:00:00.000+0000 | Cancelled | Follow Up Visit | In Person | Primary Care | PRV-018 | Makana - Boston | Transportation | 12 | Mobile App | True | False | ||
| a37Hu000008OlkkIAC | APT-0000012 | arthur.caldwell1@example.com | a2uHu00000ALL6hIAH | APT-a2uHu00000ALL6hIAH-4 | 2025-07-14T18:00:00.000+0000 | Cancelled | Follow Up Visit | In Person | Primary Care | PRV-018 | Makana - Boston | Provider Rescheduled | 15 | Phone | False | False | ||
| a37Hu000008OlklIAC | APT-0000013 | arthur.caldwell1@example.com | a2uHu00000ALL6hIAH | APT-a2uHu00000ALL6hIAH-5 | 2025-07-13T19:00:00.000+0000 | Completed | Follow Up Visit | In Person | Primary Care | PRV-018 | Makana - Boston | 17 | Agentforce | True | False | |||
| a37Hu000008OlkmIAC | APT-0000014 | arthur.dunmore1@example.com | a2uHu00000ALL6iIAH | APT-a2uHu00000ALL6iIAH-0 | 2025-06-13T12:00:00.000+0000 | Completed | Follow Up Visit | In Person | Primary Care | PRV-035 | Makana - Los Angeles | 25 | In Person | True | False | |||
| a37Hu000008OlknIAC | APT-0000015 | arthur.dunmore1@example.com | a2uHu00000ALL6iIAH | APT-a2uHu00000ALL6iIAH-1 | 2025-06-12T13:00:00.000+0000 | Completed | Telehealth Consult | Virtual | Primary Care | PRV-035 | Makana - Los Angeles | 12 | Web | True | False | |||
| a37Hu000008OlkoIAC | APT-0000016 | arthur.dunmore1@example.com | a2uHu00000ALL6iIAH | APT-a2uHu00000ALL6iIAH-2 | 2025-06-11T14:00:00.000+0000 | Completed | Telehealth Consult | Virtual | Primary Care | PRV-035 | Makana - Los Angeles | 38 | Mobile App | True | False | |||
| a37Hu000008OlkpIAC | APT-0000017 | arthur.dunmore1@example.com | a2uHu00000ALL6iIAH | APT-a2uHu00000ALL6iIAH-3 | 2025-06-10T15:00:00.000+0000 | Completed | Procedure | In Person | Cardiometabolic | PRV-035 | Makana - Los Angeles | 40 | Web | True | False | |||
| a37Hu000008OlkqIAC | APT-0000018 | arthur.dunmore1@example.com | a2uHu00000ALL6iIAH | APT-a2uHu00000ALL6iIAH-4 | 2025-06-09T16:00:00.000+0000 | Rescheduled | Lab Work | In Person | Surgical & Procedural | PRV-035 | Makana - Los Angeles | 26 | Phone | True | False | |||
| a37Hu000008OlkrIAC | APT-0000019 | arthur.dunmore1@example.com | a2uHu00000ALL6iIAH | APT-a2uHu00000ALL6iIAH-F | 2026-10-29T12:00:00.000+0000 | Scheduled | Follow Up Visit | In Person | Primary Care | PRV-035 | Makana - Los Angeles | 62 | Mobile App | False | False | |||
| a37Hu000008OlksIAC | APT-0000020 | arthur.ellsworth1@example.com | a2uHu00000ALL6jIAH | APT-a2uHu00000ALL6jIAH-0 | 2024-11-07T15:00:00.000+0000 | Completed | Follow Up Visit | Virtual | Primary Care | PRV-036 | Makana - Main Campus | 37 | Agentforce | True | False |
campaign-members.csv1,189 rows · 8 columns
Join keys: CampaignId -> campaigns.Id · ContactId -> contacts.Id
| Column | Type |
|---|---|
Id | salesforce id |
CampaignId | salesforce id |
ContactId | salesforce id |
LeadId | empty |
Status | text |
HasResponded | boolean |
FirstRespondedDate | date |
CreatedDate | datetime |
First 20 rows
| Id | CampaignId | ContactId | LeadId | Status | HasResponded | FirstRespondedDate | CreatedDate |
|---|---|---|---|---|---|---|---|
| 00vHu00002z0o3uIAA | 701Hu000002dAmQIAU | 003Hu00004BF7t5IAD | Sent | False | 2026-09-01T06:25:05.000+0000 | ||
| 00vHu00002z0o4wIAA | 701Hu000002dAmQIAU | 003Hu00004BF7t6IAD | Sent | False | 2026-09-01T06:25:05.000+0000 | ||
| 00vHu00002z0o3hIAA | 701Hu000002dAmQIAU | 003Hu00004BF7tAIAT | Sent | False | 2026-09-01T06:25:05.000+0000 | ||
| 00vHu00002z0o69IAA | 701Hu000002dAmQIAU | 003Hu00004BF7tBIAT | Sent | False | 2026-09-01T06:25:05.000+0000 | ||
| 00vHu00002z0o58IAA | 701Hu000002dAmQIAU | 003Hu00004BF7tCIAT | Re-Enrolled | True | 2026-09-01 | 2026-09-01T06:25:05.000+0000 | |
| 00vHu00002z0o4AIAQ | 701Hu000002dAmQIAU | 003Hu00004BF7tEIAT | Re-Enrolled | True | 2026-09-01 | 2026-09-01T06:25:05.000+0000 | |
| 00vHu00002z0o7lIAA | 701Hu000002dAmQIAU | 003Hu00004BF7tHIAT | Sent | False | 2026-09-01T06:25:06.000+0000 | ||
| 00vHu00002z0o47IAA | 701Hu000002dAmQIAU | 003Hu00004BF7tIIAT | Sent | False | 2026-09-01T06:25:05.000+0000 | ||
| 00vHu00002z0o5PIAQ | 701Hu000002dAmQIAU | 003Hu00004BF7tLIAT | Sent | False | 2026-09-01T06:25:05.000+0000 | ||
| 00vHu00002z0o4IIAQ | 701Hu000002dAmQIAU | 003Hu00004BF7tMIAT | Responded | True | 2026-09-01 | 2026-09-01T06:25:05.000+0000 | |
| 00vHu00002z0o6KIAQ | 701Hu000002dAmQIAU | 003Hu00004BF7tTIAT | Sent | False | 2026-09-01T06:25:05.000+0000 | ||
| 00vHu00002z0o4cIAA | 701Hu000002dAmQIAU | 003Hu00004BF7tUIAT | Sent | False | 2026-09-01T06:25:05.000+0000 | ||
| 00vHu00002z0o4NIAQ | 701Hu000002dAmQIAU | 003Hu00004BF7tZIAT | Sent | False | 2026-09-01T06:25:05.000+0000 | ||
| 00vHu00002z0o4pIAA | 701Hu000002dAmQIAU | 003Hu00004BF7thIAD | Responded | True | 2026-09-01 | 2026-09-01T06:25:05.000+0000 | |
| 00vHu00002z0o51IAA | 701Hu000002dAmQIAU | 003Hu00004BF7tjIAD | Sent | False | 2026-09-01T06:25:05.000+0000 | ||
| 00vHu00002z0o3wIAA | 701Hu000002dAmQIAU | 003Hu00004BF7tlIAD | Responded | True | 2026-09-01 | 2026-09-01T06:25:05.000+0000 | |
| 00vHu00002z0o6hIAA | 701Hu000002dAmQIAU | 003Hu00004BF7toIAD | Responded | True | 2026-09-01 | 2026-09-01T06:25:05.000+0000 | |
| 00vHu00002z0o4sIAA | 701Hu000002dAmQIAU | 003Hu00004BF7ttIAD | Sent | False | 2026-09-01T06:25:05.000+0000 | ||
| 00vHu00002z0o5JIAQ | 701Hu000002dAmQIAU | 003Hu00004BF7txIAD | Sent | False | 2026-09-01T06:25:05.000+0000 | ||
| 00vHu00002z0o5DIAQ | 701Hu000002dAmQIAU | 003Hu00004BF7tzIAD | Sent | False | 2026-09-01T06:25:05.000+0000 |
campaigns.csv10 rows · 34 columns
Join keys: Id -> campaign-members.CampaignId, message-registry.cld_Campaign_Id__c · ParentId -> campaigns.Id
| Column | Type |
|---|---|
Id | salesforce id |
Name | text |
ParentId | salesforce id |
Type | text |
Status | text |
StartDate | date |
EndDate | date |
CurrencyIsoCode | text |
ExpectedRevenue | empty |
BudgetedCost | empty |
ActualCost | empty |
ExpectedResponse | integer |
IsActive | boolean |
Description | text |
NumberOfLeads | integer |
NumberOfContacts | integer |
NumberOfResponses | integer |
OwnerId | salesforce id |
CampaignMemberRecordTypeId | empty |
cld_Goal_Label__c | text |
cld_Goal_Metric__c | text |
cld_Goal_Target__c | integer |
cld_Goal_Baseline__c | integer |
cld_Goal_Direction__c | text |
cld_Goal_Period_Start__c | date |
cld_Goal_Period_End__c | date |
cld_Goal_Min_Sample__c | integer |
cld_Objective__c | text |
cld_Conversion_Signal__c | text |
cld_Conversion_Identifier__c | text |
cld_Attribution_Window_Days__c | integer |
cld_Attribution_Model__c | text |
cld_Conversion_Value__c | integer |
cld_Message_Cap_30d__c | empty |
First 20 rows
| Id | Name | ParentId | Type | Status | StartDate | EndDate | CurrencyIsoCode | ExpectedRevenue | BudgetedCost | ActualCost | ExpectedResponse | IsActive | Description | NumberOfLeads | NumberOfContacts | NumberOfResponses | OwnerId | CampaignMemberRecordTypeId | cld_Goal_Label__c | cld_Goal_Metric__c | cld_Goal_Target__c | cld_Goal_Baseline__c | cld_Goal_Direction__c | cld_Goal_Period_Start__c | cld_Goal_Period_End__c | cld_Goal_Min_Sample__c | cld_Objective__c | cld_Conversion_Signal__c | cld_Conversion_Identifier__c | cld_Attribution_Window_Days__c | cld_Attribution_Model__c | cld_Conversion_Value__c | cld_Message_Cap_30d__c |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 701Hu000002dAmLIAU | cld_2027 Plan Year Win-Back | Other | In Progress | 2026-08-10 | 2026-12-07 | USD | 0 | True | Parent campaign for the 2027 plan-year win-back program. Targets lapsed members (Renewal Status = Not Renewed) ahead of and through Medicare Advantage Annual Enrollment (Oct 15 - Dec 7 2026) for a 2027-01-01 effective date. Three consent-based child campaigns roll up here. Audience and channel eligibility are governed by the Plan and Benefits Updates communication subscription. | 0 | 0 | 0 | 005000000000000AAA | 2027 plan year re-enrollments | Re-Enrollments | 64 | 41 | Higher is better | 2026-07-01 | 2026-09-15 | 100 | Plan Re-Enrollment | Web Form Submit | cld-2027-reenroll-form | 28 | Position Based 40-20-40 | 1200 | ||||||
| 701Hu000002dAmQIAU | cld_2027 Win-Back - Email Only | 701Hu000002dAmLIAU | In Progress | 2026-08-10 | 2026-12-07 | USD | 0 | True | Lapsed members opted in to Plan and Benefits Updates on Email only. A/B on offer framing: plan value vs care continuity. | 0 | 148 | 42 | 005000000000000AAA | Re-enrollments from email-only members | Re-Enrollments | 18 | 12 | Higher is better | 2026-07-01 | 2026-09-15 | 100 | Plan Re-Enrollment | Web Form Submit | cld-2027-reenroll-form | 28 | Position Based 40-20-40 | 1200 | ||||||
| 701Hu000002dAmSIAU | cld_2027 Win-Back - Multi-Channel | 701Hu000002dAmLIAU | Other | In Progress | 2026-08-10 | 2026-12-07 | USD | 0 | True | Lapsed members opted in on both Email and SMS. A/B on channel sequence: email first with SMS nudge at 72h, vs SMS first with email detail at 72h. | 0 | 60 | 46 | 005000000000000AAA | Re-enrollments from multi-channel members | Re-Enrollments | 32 | 20 | Higher is better | 2026-07-01 | 2026-09-15 | 100 | Plan Re-Enrollment | Web Form Submit | cld-2027-reenroll-form | 28 | Position Based 40-20-40 | 1200 | |||||
| 701Hu000002dAmRIAU | cld_2027 Win-Back - SMS Only | 701Hu000002dAmLIAU | Other | In Progress | 2026-08-10 | 2026-12-07 | USD | 0 | True | Lapsed members opted in to Plan and Benefits Updates on SMS only. A/B on call to action: reply for callback vs enrollment link. | 0 | 60 | 29 | 005000000000000AAA | Re-enrollments from SMS-only members | Re-Enrollments | 14 | 9 | Higher is better | 2026-07-01 | 2026-09-15 | 100 | Plan Re-Enrollment | Web Form Submit | cld-2027-reenroll-form | 28 | Position Based 40-20-40 | 1200 | |||||
| 701Hu000002dAmWIAU | cld_Payer Improve Star Ratings before CAHPS | Other | In Progress | 2026-08-15 | 2026-11-30 | USD | 0 | True | Makana Health Plans quality and retention. Active Medicare Advantage members with an open HEDIS gap are prompted to book an Annual Wellness Visit and close the gap before the CAHPS survey window. Goal: appointment scheduled. Email A/B on motivation (your health vs your benefits), SMS reminder with one-tap booking link. | 0 | 230 | 12 | 005000000000000AAA | Annual wellness visits scheduled | Emails Delivered | 14 | 11 | Higher is better | 2026-07-25 | 2026-09-08 | 100 | Appointment Scheduled | Campaign Member Status | 45 | Last Touch | 310 | |||||||
| 701Hu000002dAmXIAU | cld_Payer Increase Mail Order Pharmacy Enrollment | Other | In Progress | 2026-08-15 | 2026-12-31 | USD | 0 | True | Makana Health Plans adherence and cost. Members managing a chronic condition on maintenance medication are enrolled in 90-day mail order. Goal: mail order enrollment completed on the member portal. Email A/B on lead benefit (never miss a refill vs save on copays), SMS with enrollment link. Drives Part D adherence Star measures and PMPM. | 0 | 126 | 7 | 005000000000000AAA | Mail order pharmacy enrollments | Emails Delivered | 8 | 6 | Higher is better | 2026-07-15 | 2026-09-13 | 100 | Mail Order Enrollment | Campaign Member Status | 60 | Last Touch | 640 | |||||||
| 701Hu000002dAmVIAU | cld_Payer Medicare Age-In | Other | In Progress | 2026-08-15 | 2026-12-07 | USD | 0 | True | Makana Health Plans acquisition. Commercial and Exchange members turning 65 within 12 months are guided to compare Medicare Advantage plans before their Initial Enrollment Period closes. Goal: plan comparison started on the website. Email A/B on framing (cost certainty vs keep your doctors), SMS nudge, paid social lookalike audience built from the segment. | 0 | 10 | 2 | 005000000000000AAA | Medicare plan comparisons started | Emails Delivered | 3 | 3 | Higher is better | 2026-08-10 | 2026-09-09 | 10 | Lead Capture | Campaign Member Status | 30 | Last Touch | 1400 | |||||||
| 701Hu000002dAmYIAU | cld_Provider Care Gap Management - Mammography | Other | In Progress | 2026-09-01 | 2026-10-31 | USD | 0 | True | Makana Health provider care-gap closure. Women overdue for breast cancer screening (HEDIS BCS non-compliant) are invited to book a mammogram during Breast Cancer Awareness Month. Goal: mammography appointment scheduled. Email A/B on tone (reassurance vs urgency), SMS with booking link. | 0 | 135 | 8 | 005000000000000AAA | Mammograms scheduled | Emails Delivered | 7 | 7 | Higher is better | 2026-08-08 | 2026-09-07 | 100 | Appointment Scheduled | Campaign Member Status | 30 | Last Touch | 290 | |||||||
| 701Hu000002dAmaIAE | cld_Provider Engage New Members for Primary Care | Other | In Progress | 2026-09-01 | 2026-12-31 | USD | 0 | True | Makana Health new-patient onboarding. Patients whose only visit was an initial visit are nurtured to establish care with a primary care provider. Goal: primary care appointment scheduled. Three-touch nurture; Email A/B on lead content (meet your care team vs what to expect), SMS check-in. | 0 | 226 | 12 | 005000000000000AAA | Primary care visits scheduled | Emails Delivered | 11 | 10 | Higher is better | 2026-07-10 | 2026-09-08 | 100 | Appointment Scheduled | Campaign Member Status | 60 | Last Touch | 520 | |||||||
| 701Hu000002dAmZIAU | cld_Provider Flu Shot Reminder | Other | In Progress | 2026-09-01 | 2026-11-15 | USD | 0 | True | Makana Health seasonal outreach. Patients with no flu vaccination on record are reminded to get vaccinated at a Makana clinic or pharmacy partner. Goal: flu shot appointment scheduled or walk-in check-in. SMS-first with email detail; Email A/B on hook (protect your family vs walk in, no appointment). | 0 | 194 | 9 | 005000000000000AAA | Flu shot appointments and walk-ins | Emails Delivered | 11 | 8 | Higher is better | 2026-07-22 | 2026-09-05 | 100 | Appointment Scheduled | Campaign Member Status | 45 | Last Touch | 95 |
cms-content.json25 rows · 22 columns
JSON, not CSV. It is the only non-CSV file in the pack and loads through a different path than the CSVs: the CSVs go in as records, these are CMS content pieces created in a content space, so they land through the CMS surface rather than a data load.
| Column | Type |
|---|---|
apiName | text |
contentBody | object |
contentFqn | text |
contentKey | text |
contentSpace | object |
contentType | object |
contentVersion | number |
createdBy | object |
createdDate | datetime |
externalId | text |
folder | object |
isPublished | boolean |
language | text |
lastModifiedBy | object |
lastModifiedDate | datetime |
managedContentId | text |
managedContentVariantId | text |
managedContentVersionId | text |
status | object |
title | text |
urlName | text |
variantVersion | text |
First 20 rows
| apiName | contentBody | contentFqn | contentKey | contentSpace | contentType | contentVersion | createdBy | createdDate | externalId | folder | isPublished | language | lastModifiedBy | lastModifiedDate | managedContentId | managedContentVariantId | managedContentVersionId | status | title | urlName | variantVersion |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| MCMS6AZLBOOFCDLB6G3MVM7YVQPQ | {"backgroundColor":"#f7f7f7","lightning:dataProviders":[{"attributes":{"dataGraphApiName":"Demo_HLS_2"},"definition":"sfdc_cms__dataGraphDataProvider","sfdcExpressionKey":"$dataGraph"}],"lightning:expressions":[],"messagePurpose":"promotional","preheader":"Compare plans, keep your doctors, and re-enroll in about five minutes.","sfdc_cms:attachments":[],"sfdc_cms:block":{"definition":"sfdc_cms/root... | marketing--Default_Content_Workspace.sfdc_cms__email--MCMS6AZLBOOFCDLB6G3MVM7YVQPQ | MCMS6AZLBOOFCDLB6G3MVM7YVQPQ | {"id":"0ZuHu000001NIHUKA4","resourceUrl":"/services/data/v66.0/connect/cms/spaces/0ZuHu000001NIHU"} | {"fullyQualifiedName":"sfdc_cms__email","name":"Email"} | 2 | {"id":"005000000000000AAA","name":"Demo Admin","resourceUrl":"/services/data/v66.0/chatter/users/005000000000000AAA"} | 2026-09-01T06:54:40.000Z | {"id":"9PuHu000001NSojKAG","resourceUrl":"/services/data/v66.0/connect/cms/folders/9PuHu000001NSojKAG"} | true | en_US | {"id":"005000000000000AAA","name":"Demo Admin","resourceUrl":"/services/data/v66.0/chatter/users/005000000000000AAA"} | 2026-09-01T21:52:19.000Z | 20YHu00000BIkFgMAL | 9PsHu00000kkFISKA2 | 5OUHu00001mR4CROA0 | {"label":"Published","status":"Published"} | cld_2027 Win-Back - Email Only Email | cld-2027-win-back---email-only-email | 2.1 | |
| MCHU35PNMRNNFJXEYOCBL5PGKAMA | {"backgroundColor":"#f7f7f7","lightning:dataProviders":[{"attributes":{"dataGraphApiName":"Demo_HLS_2"},"definition":"sfdc_cms__dataGraphDataProvider","sfdcExpressionKey":"$dataGraph"}],"lightning:expressions":[],"messagePurpose":"promotional","preheader":"Plus dental, vision, and a $0 monthly premium on select Makana plans.","sfdc_cms:attachments":[],"sfdc_cms:block":{"definition":"sfdc_cms/rootC... | marketing--Default_Content_Workspace.sfdc_cms__email--MCHU35PNMRNNFJXEYOCBL5PGKAMA | MCHU35PNMRNNFJXEYOCBL5PGKAMA | {"id":"0ZuHu000001NIHUKA4","resourceUrl":"/services/data/v66.0/connect/cms/spaces/0ZuHu000001NIHU"} | {"fullyQualifiedName":"sfdc_cms__email","name":"Email"} | 1 | {"id":"005000000000000AAA","name":"Demo Admin","resourceUrl":"/services/data/v66.0/chatter/users/005000000000000AAA"} | 2026-09-01T06:54:45.000Z | {"id":"9PuHu000001NSojKAG","resourceUrl":"/services/data/v66.0/connect/cms/folders/9PuHu000001NSojKAG"} | true | en_US | {"id":"005000000000000AAA","name":"Demo Admin","resourceUrl":"/services/data/v66.0/chatter/users/005000000000000AAA"} | 2026-09-01T20:14:27.000Z | 20YHu00000BIkFhMAL | 9PsHu00000kkFITKA2 | 5OUHu00001mR4CSOA0 | {"label":"Published","status":"Published"} | cld_2027 Win-Back - Email Only Email (1) | cld-2027-win-back---email-only-email-1 | 1.2 | |
| MC3W7PRJIAABHK3JLFHKSNFUBQAU | {"backgroundColor":"#f7f7f7","lightning:dataProviders":[{"attributes":{"dataGraphApiName":"Demo_HLS_2"},"definition":"sfdc_cms__dataGraphDataProvider","sfdcExpressionKey":"$dataGraph"}],"lightning:expressions":[],"messagePurpose":"promotional","preheader":"A licensed Makana advisor can compare plans with you in one short call.","sfdc_cms:attachments":[],"sfdc_cms:block":{"definition":"sfdc_cms/roo... | marketing--Default_Content_Workspace.sfdc_cms__email--MC3W7PRJIAABHK3JLFHKSNFUBQAU | MC3W7PRJIAABHK3JLFHKSNFUBQAU | {"id":"0ZuHu000001NIHUKA4","resourceUrl":"/services/data/v66.0/connect/cms/spaces/0ZuHu000001NIHU"} | {"fullyQualifiedName":"sfdc_cms__email","name":"Email"} | 1 | {"id":"005000000000000AAA","name":"Demo Admin","resourceUrl":"/services/data/v66.0/chatter/users/005000000000000AAA"} | 2026-09-01T06:27:09.000Z | {"id":"9PuHu000001NSojKAG","resourceUrl":"/services/data/v66.0/connect/cms/folders/9PuHu000001NSojKAG"} | true | en_US | {"id":"005000000000000AAA","name":"Demo Admin","resourceUrl":"/services/data/v66.0/chatter/users/005000000000000AAA"} | 2026-09-01T20:14:27.000Z | 20YHu00000BIkFbMAL | 9PsHu00000kkFINKA2 | 5OUHu00001mR4CMOA0 | {"label":"Published","status":"Published"} | cld_2027 Win-Back - Multi-Channel Email | cld-2027-win-back---multi-channel-email | 1.2 |
consent/comm-subscription-channel-type.csv11 rows · 19 columns
Join keys: CommunicationSubscriptionId -> consent/comm-subscription.Id · EngagementChannelTypeId -> consent/engagement-channel-type.Id
| Column | Type |
|---|---|
Id | salesforce id |
OwnerId | salesforce id |
IsDeleted | boolean |
Name | text |
CurrencyIsoCode | text |
CreatedDate | datetime |
CreatedById | salesforce id |
LastModifiedDate | datetime |
LastModifiedById | salesforce id |
SystemModstamp | datetime |
MayEdit | boolean |
IsLocked | boolean |
LastViewedDate | datetime |
LastReferencedDate | datetime |
CommunicationSubscriptionId | salesforce id |
EngagementChannelTypeId | salesforce id |
DataUsePurposeId | empty |
MessagingChannelId | empty |
MessagingChannelUsageId | empty |
First 20 rows
| Id | OwnerId | IsDeleted | Name | CurrencyIsoCode | CreatedDate | CreatedById | LastModifiedDate | LastModifiedById | SystemModstamp | MayEdit | IsLocked | LastViewedDate | LastReferencedDate | CommunicationSubscriptionId | EngagementChannelTypeId | DataUsePurposeId | MessagingChannelId | MessagingChannelUsageId |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0eBHu00000096whMAA | 005000000000000AAA | false | Appointment Reminders Email | USD | 2026-08-29T07:14:06.000+0000 | 005000000000000AAA | 2026-08-29T07:14:06.000+0000 | 005000000000000AAA | 2026-08-29T07:14:06.000+0000 | true | false | 2026-08-29T07:14:06.000+0000 | 2026-08-29T07:14:06.000+0000 | 0XlHu000000HUvpKAG | 0eFHu000000p5MJMAY | |||
| 0eBHu00000096wiMAA | 005000000000000AAA | false | Appointment Reminders SMS | USD | 2026-08-29T07:14:06.000+0000 | 005000000000000AAA | 2026-08-29T07:14:06.000+0000 | 005000000000000AAA | 2026-08-29T07:14:06.000+0000 | true | false | 2026-08-29T07:14:06.000+0000 | 2026-08-29T07:14:06.000+0000 | 0XlHu000000HUvpKAG | 0eFHu000000p5MKMAY | |||
| 0eBHu00000096wjMAA | 005000000000000AAA | false | Care Gap Outreach Email | USD | 2026-08-29T07:14:06.000+0000 | 005000000000000AAA | 2026-08-29T07:14:06.000+0000 | 005000000000000AAA | 2026-08-29T07:14:06.000+0000 | true | false | 2026-08-29T07:14:06.000+0000 | 2026-08-29T07:14:06.000+0000 | 0XlHu000000HUvqKAG | 0eFHu000000p5MJMAY | |||
| 0eBHu00000096wkMAA | 005000000000000AAA | false | Care Gap Outreach SMS | USD | 2026-08-29T07:14:06.000+0000 | 005000000000000AAA | 2026-08-29T07:14:06.000+0000 | 005000000000000AAA | 2026-08-29T07:14:06.000+0000 | true | false | 2026-08-29T07:14:06.000+0000 | 2026-08-29T07:14:06.000+0000 | 0XlHu000000HUvqKAG | 0eFHu000000p5MKMAY | |||
| 0eBHu00000096vAMAQ | 005000000000000AAA | false | Community Newsletter Email | USD | 2026-07-13T21:33:06.000+0000 | 005000000000000AAA | 2026-07-13T21:33:06.000+0000 | 005000000000000AAA | 2026-07-13T21:33:06.000+0000 | true | false | 2026-07-13T21:33:06.000+0000 | 2026-07-13T21:33:06.000+0000 | 0XlHu000000HUuSKAW | 0eFHu000000p5MJMAY | |||
| 0eBHu000000kPhUMAU | 005000000000000AAA | false | General Marketing Email | USD | 2025-11-04T06:46:15.000+0000 | 005000000000000AAA | 2026-07-13T21:34:05.000+0000 | 005000000000000AAA | 2026-07-13T21:34:05.000+0000 | true | false | 2026-07-13T21:34:05.000+0000 | 2026-07-13T21:34:05.000+0000 | 0XlHu000000obdAKAQ | 0eFHu000000p5MJMAY | |||
| 0eBHu00000096wnMAA | 005000000000000AAA | false | Health Tips Email | USD | 2026-08-29T07:14:06.000+0000 | 005000000000000AAA | 2026-08-29T07:14:06.000+0000 | 005000000000000AAA | 2026-08-29T07:14:06.000+0000 | true | false | 2026-08-29T07:14:06.000+0000 | 2026-08-29T07:14:06.000+0000 | 0XlHu000000HUvsKAG | 0eFHu000000p5MJMAY | |||
| 0eBHu00000096woMAA | 005000000000000AAA | false | Health Tips SMS | USD | 2026-08-29T07:14:06.000+0000 | 005000000000000AAA | 2026-08-29T07:14:06.000+0000 | 005000000000000AAA | 2026-08-29T07:14:06.000+0000 | true | false | 2026-08-29T07:14:06.000+0000 | 2026-08-29T07:14:06.000+0000 | 0XlHu000000HUvsKAG | 0eFHu000000p5MKMAY | |||
| 0eBHu00000096wlMAA | 005000000000000AAA | false | Plan and Benefits Email | USD | 2026-08-29T07:14:06.000+0000 | 005000000000000AAA | 2026-08-29T07:14:06.000+0000 | 005000000000000AAA | 2026-08-29T07:14:06.000+0000 | true | false | 2026-08-29T07:14:06.000+0000 | 2026-08-29T07:14:06.000+0000 | 0XlHu000000HUvrKAG | 0eFHu000000p5MJMAY | |||
| 0eBHu00000096wmMAA | 005000000000000AAA | false | Plan and Benefits SMS | USD | 2026-08-29T07:14:06.000+0000 | 005000000000000AAA | 2026-08-29T07:14:06.000+0000 | 005000000000000AAA | 2026-08-29T07:14:06.000+0000 | true | false | 2026-08-29T07:14:06.000+0000 | 2026-08-29T07:14:06.000+0000 | 0XlHu000000HUvrKAG | 0eFHu000000p5MKMAY | |||
| 0eBHu00000096vFMAQ | 005000000000000AAA | false | Research & Advancements Email | USD | 2026-07-13T21:33:49.000+0000 | 005000000000000AAA | 2026-07-13T21:33:49.000+0000 | 005000000000000AAA | 2026-07-13T21:33:49.000+0000 | true | false | 2026-07-13T21:33:49.000+0000 | 2026-07-13T21:33:49.000+0000 | 0XlHu000000HUuXKAW | 0eFHu000000p5MJMAY |
consent/comm-subscription-consent.csv5,828 rows · 27 columns
Load order: subscription, channel type, then consent. PartyId must already exist as an Individual.
Join keys: PartyId -> contacts.IndividualId · CommSubscriptionChannelTypeId -> consent/comm-subscription-channel-type.Id · EngagementChannelTypeId -> consent/engagement-channel-type.Id
| Column | Type |
|---|---|
Id | salesforce id |
OwnerId | salesforce id |
IsDeleted | boolean |
Name | text |
CurrencyIsoCode | text |
CreatedDate | datetime |
CreatedById | salesforce id |
LastModifiedDate | datetime |
LastModifiedById | salesforce id |
SystemModstamp | datetime |
MayEdit | boolean |
IsLocked | boolean |
LastViewedDate | empty |
LastReferencedDate | empty |
ConsentGiverId | empty |
ContactPointId | salesforce id |
EffectiveFromDate | date |
ConsentCapturedDateTime | datetime |
ConsentCapturedSource | text |
CommSubscriptionChannelTypeId | salesforce id |
PartyRoleId | empty |
BusinessBrandId | empty |
PrivacyConsentStatus | text |
DataUsePurposeId | empty |
EngagementChannelTypeId | salesforce id |
PartyId | salesforce id |
ContactPointValue | text |
First 20 rows
| Id | OwnerId | IsDeleted | Name | CurrencyIsoCode | CreatedDate | CreatedById | LastModifiedDate | LastModifiedById | SystemModstamp | MayEdit | IsLocked | LastViewedDate | LastReferencedDate | ConsentGiverId | ContactPointId | EffectiveFromDate | ConsentCapturedDateTime | ConsentCapturedSource | CommSubscriptionChannelTypeId | PartyRoleId | BusinessBrandId | PrivacyConsentStatus | DataUsePurposeId | EngagementChannelTypeId | PartyId | ContactPointValue |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0dYHu000000p8y2MAA | 005000000000000AAA | False | Subscription Consent | USD | 2026-08-29T08:11:27.000+0000 | 005000000000000AAA | 2026-08-29T08:32:29.000+0000 | 005000000000000AAA | 2026-08-29T08:32:29.000+0000 | True | False | 9VlHu000001kTAYKA2 | 2025-07-28 | 2025-07-28T12:00:00.000+0000 | Preference Center | 0eBHu00000096whMAA | OptIn | 0eFHu000000p5MJMAY | 0PKHu000004Y5CLOA0 | rohan.delacroix1@example.com | ||||||
| 0dYHu000000p8y3MAA | 005000000000000AAA | False | Subscription Consent | USD | 2026-08-29T08:11:27.000+0000 | 005000000000000AAA | 2026-08-29T08:32:29.000+0000 | 005000000000000AAA | 2026-08-29T08:32:29.000+0000 | True | False | 9VlHu000001kTAYKA2 | 2025-07-28 | 2025-07-28T12:00:00.000+0000 | Preference Center | 0eBHu00000096wjMAA | OptIn | 0eFHu000000p5MJMAY | 0PKHu000004Y5CLOA0 | rohan.delacroix1@example.com | ||||||
| 0dYHu000000p8y4MAA | 005000000000000AAA | False | Subscription Consent | USD | 2026-08-29T08:11:27.000+0000 | 005000000000000AAA | 2026-08-29T08:32:29.000+0000 | 005000000000000AAA | 2026-08-29T08:32:29.000+0000 | True | False | 9VlHu000001kTAYKA2 | 2025-07-28 | 2025-07-28T12:00:00.000+0000 | Preference Center | 0eBHu00000096wlMAA | OptIn | 0eFHu000000p5MJMAY | 0PKHu000004Y5CLOA0 | rohan.delacroix1@example.com | ||||||
| 0dYHu000000p8y5MAA | 005000000000000AAA | False | Subscription Consent | USD | 2026-08-29T08:11:27.000+0000 | 005000000000000AAA | 2026-08-29T08:32:29.000+0000 | 005000000000000AAA | 2026-08-29T08:32:29.000+0000 | True | False | 9VlHu000001kTAYKA2 | 2025-07-28 | 2025-07-28T12:00:00.000+0000 | Preference Center | 0eBHu00000096wnMAA | OptOut | 0eFHu000000p5MJMAY | 0PKHu000004Y5CLOA0 | rohan.delacroix1@example.com | ||||||
| 0dYHu000000p8y6MAA | 005000000000000AAA | False | Subscription Consent | USD | 2026-08-29T08:11:27.000+0000 | 005000000000000AAA | 2026-08-29T08:11:27.000+0000 | 005000000000000AAA | 2026-08-29T08:11:27.000+0000 | True | False | 9VlHu000001kTAZKA2 | 2026-07-22 | 2026-07-22T12:00:00.000+0000 | Preference Center | 0eBHu00000096whMAA | OptIn | 0eFHu000000p5MJMAY | 0PKHu000004Y5CMOA0 | |||||||
| 0dYHu000000p8y7MAA | 005000000000000AAA | False | Subscription Consent | USD | 2026-08-29T08:11:27.000+0000 | 005000000000000AAA | 2026-08-29T08:11:27.000+0000 | 005000000000000AAA | 2026-08-29T08:11:27.000+0000 | True | False | 9VlHu000001kTAZKA2 | 2026-07-22 | 2026-07-22T12:00:00.000+0000 | Preference Center | 0eBHu00000096wjMAA | OptIn | 0eFHu000000p5MJMAY | 0PKHu000004Y5CMOA0 | |||||||
| 0dYHu000000p8y8MAA | 005000000000000AAA | False | Subscription Consent | USD | 2026-08-29T08:11:27.000+0000 | 005000000000000AAA | 2026-08-29T08:11:27.000+0000 | 005000000000000AAA | 2026-08-29T08:11:27.000+0000 | True | False | 9VlHu000001kTAZKA2 | 2026-07-22 | 2026-07-22T12:00:00.000+0000 | Preference Center | 0eBHu00000096wlMAA | OptOut | 0eFHu000000p5MJMAY | 0PKHu000004Y5CMOA0 | |||||||
| 0dYHu000000p8y9MAA | 005000000000000AAA | False | Subscription Consent | USD | 2026-08-29T08:11:27.000+0000 | 005000000000000AAA | 2026-08-29T08:11:27.000+0000 | 005000000000000AAA | 2026-08-29T08:11:27.000+0000 | True | False | 9VlHu000001kTAZKA2 | 2026-07-22 | 2026-07-22T12:00:00.000+0000 | Preference Center | 0eBHu00000096wnMAA | OptIn | 0eFHu000000p5MJMAY | 0PKHu000004Y5CMOA0 | |||||||
| 0dYHu000000p8yAMAQ | 005000000000000AAA | False | Subscription Consent | USD | 2026-08-29T08:11:27.000+0000 | 005000000000000AAA | 2026-08-29T08:11:27.000+0000 | 005000000000000AAA | 2026-08-29T08:11:27.000+0000 | True | False | 9VlHu000001kTAaKAM | 2026-07-29 | 2026-07-29T12:00:00.000+0000 | Preference Center | 0eBHu00000096whMAA | OptIn | 0eFHu000000p5MJMAY | 0PKHu000004Y5CNOA0 | |||||||
| 0dYHu000000p8yBMAQ | 005000000000000AAA | False | Subscription Consent | USD | 2026-08-29T08:11:27.000+0000 | 005000000000000AAA | 2026-08-29T08:32:29.000+0000 | 005000000000000AAA | 2026-08-29T08:32:29.000+0000 | True | False | 0OwHu000002qNVNKA2 | 2026-07-29 | 2026-07-29T12:00:00.000+0000 | Preference Center | 0eBHu00000096wiMAA | OptIn | 0eFHu000000p5MKMAY | 0PKHu000004Y5CNOA0 | (317) 555-0114 | ||||||
| 0dYHu000000p8yCMAQ | 005000000000000AAA | False | Subscription Consent | USD | 2026-08-29T08:11:27.000+0000 | 005000000000000AAA | 2026-08-29T08:11:27.000+0000 | 005000000000000AAA | 2026-08-29T08:11:27.000+0000 | True | False | 9VlHu000001kTAaKAM | 2026-07-29 | 2026-07-29T12:00:00.000+0000 | Preference Center | 0eBHu00000096wjMAA | OptOut | 0eFHu000000p5MJMAY | 0PKHu000004Y5CNOA0 | |||||||
| 0dYHu000000p8yDMAQ | 005000000000000AAA | False | Subscription Consent | USD | 2026-08-29T08:11:27.000+0000 | 005000000000000AAA | 2026-08-29T08:32:29.000+0000 | 005000000000000AAA | 2026-08-29T08:32:29.000+0000 | True | False | 0OwHu000002qNVNKA2 | 2026-07-29 | 2026-07-29T12:00:00.000+0000 | Preference Center | 0eBHu00000096wkMAA | OptOut | 0eFHu000000p5MKMAY | 0PKHu000004Y5CNOA0 | (317) 555-0114 | ||||||
| 0dYHu000000p8yEMAQ | 005000000000000AAA | False | Subscription Consent | USD | 2026-08-29T08:11:27.000+0000 | 005000000000000AAA | 2026-08-29T08:11:27.000+0000 | 005000000000000AAA | 2026-08-29T08:11:27.000+0000 | True | False | 9VlHu000001kTAaKAM | 2026-07-29 | 2026-07-29T12:00:00.000+0000 | Preference Center | 0eBHu00000096wlMAA | OptIn | 0eFHu000000p5MJMAY | 0PKHu000004Y5CNOA0 | |||||||
| 0dYHu000000p8yFMAQ | 005000000000000AAA | False | Subscription Consent | USD | 2026-08-29T08:11:27.000+0000 | 005000000000000AAA | 2026-08-29T08:32:29.000+0000 | 005000000000000AAA | 2026-08-29T08:32:29.000+0000 | True | False | 0OwHu000002qNVNKA2 | 2026-07-29 | 2026-07-29T12:00:00.000+0000 | Preference Center | 0eBHu00000096wmMAA | OptIn | 0eFHu000000p5MKMAY | 0PKHu000004Y5CNOA0 | (317) 555-0114 | ||||||
| 0dYHu000000p8yGMAQ | 005000000000000AAA | False | Subscription Consent | USD | 2026-08-29T08:11:27.000+0000 | 005000000000000AAA | 2026-08-29T08:11:27.000+0000 | 005000000000000AAA | 2026-08-29T08:11:27.000+0000 | True | False | 9VlHu000001kTAaKAM | 2026-07-29 | 2026-07-29T12:00:00.000+0000 | Preference Center | 0eBHu00000096wnMAA | OptIn | 0eFHu000000p5MJMAY | 0PKHu000004Y5CNOA0 | |||||||
| 0dYHu000000p8yHMAQ | 005000000000000AAA | False | Subscription Consent | USD | 2026-08-29T08:11:27.000+0000 | 005000000000000AAA | 2026-08-29T08:32:29.000+0000 | 005000000000000AAA | 2026-08-29T08:32:29.000+0000 | True | False | 0OwHu000002qNVNKA2 | 2026-07-29 | 2026-07-29T12:00:00.000+0000 | Preference Center | 0eBHu00000096woMAA | OptOut | 0eFHu000000p5MKMAY | 0PKHu000004Y5CNOA0 | (317) 555-0114 | ||||||
| 0dYHu000000p8yIMAQ | 005000000000000AAA | False | Subscription Consent | USD | 2026-08-29T08:11:27.000+0000 | 005000000000000AAA | 2026-08-29T08:32:29.000+0000 | 005000000000000AAA | 2026-08-29T08:32:29.000+0000 | True | False | 9VlHu000001kTAbKAM | 2026-02-09 | 2026-02-09T12:00:00.000+0000 | Preference Center | 0eBHu00000096whMAA | OptIn | 0eFHu000000p5MJMAY | 0PKHu000004Y5COOA0 | andre.halloran1@example.com | ||||||
| 0dYHu000000p8yJMAQ | 005000000000000AAA | False | Subscription Consent | USD | 2026-08-29T08:11:27.000+0000 | 005000000000000AAA | 2026-08-29T08:32:29.000+0000 | 005000000000000AAA | 2026-08-29T08:32:29.000+0000 | True | False | 0OwHu000002qNVOKA2 | 2026-02-09 | 2026-02-09T12:00:00.000+0000 | Preference Center | 0eBHu00000096wiMAA | OptOut | 0eFHu000000p5MKMAY | 0PKHu000004Y5COOA0 | (317) 555-0115 | ||||||
| 0dYHu000000p8yKMAQ | 005000000000000AAA | False | Subscription Consent | USD | 2026-08-29T08:11:27.000+0000 | 005000000000000AAA | 2026-08-29T08:32:29.000+0000 | 005000000000000AAA | 2026-08-29T08:32:29.000+0000 | True | False | 9VlHu000001kTAbKAM | 2026-02-09 | 2026-02-09T12:00:00.000+0000 | Preference Center | 0eBHu00000096wjMAA | OptOut | 0eFHu000000p5MJMAY | 0PKHu000004Y5COOA0 | andre.halloran1@example.com | ||||||
| 0dYHu000000p8yLMAQ | 005000000000000AAA | False | Subscription Consent | USD | 2026-08-29T08:11:27.000+0000 | 005000000000000AAA | 2026-08-29T08:32:29.000+0000 | 005000000000000AAA | 2026-08-29T08:32:29.000+0000 | True | False | 0OwHu000002qNVOKA2 | 2026-02-09 | 2026-02-09T12:00:00.000+0000 | Preference Center | 0eBHu00000096wkMAA | OptOut | 0eFHu000000p5MKMAY | 0PKHu000004Y5COOA0 | (317) 555-0115 |
consent/comm-subscription.csv7 rows · 15 columns
Join keys: Id -> consent/comm-subscription-channel-type.CommunicationSubscriptionId
| Column | Type |
|---|---|
Id | salesforce id |
OwnerId | salesforce id |
IsDeleted | boolean |
Name | text |
CurrencyIsoCode | text |
CreatedDate | datetime |
CreatedById | salesforce id |
LastModifiedDate | datetime |
LastModifiedById | salesforce id |
SystemModstamp | datetime |
MayEdit | boolean |
IsLocked | boolean |
LastViewedDate | datetime |
LastReferencedDate | datetime |
BusinessUnitId | empty |
First 20 rows
| Id | OwnerId | IsDeleted | Name | CurrencyIsoCode | CreatedDate | CreatedById | LastModifiedDate | LastModifiedById | SystemModstamp | MayEdit | IsLocked | LastViewedDate | LastReferencedDate | BusinessUnitId |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0XlHu000000HUvpKAG | 005000000000000AAA | false | Appointment Reminders | USD | 2026-08-29T07:14:06.000+0000 | 005000000000000AAA | 2026-08-29T07:14:06.000+0000 | 005000000000000AAA | 2026-08-29T07:14:06.000+0000 | true | false | 2026-08-29T07:14:06.000+0000 | 2026-08-29T07:14:06.000+0000 | |
| 0XlHu000000HUvqKAG | 005000000000000AAA | false | Care Gap and Preventive Care Outreach | USD | 2026-08-29T07:14:06.000+0000 | 005000000000000AAA | 2026-08-29T07:14:06.000+0000 | 005000000000000AAA | 2026-08-29T07:14:06.000+0000 | true | false | 2026-08-29T07:14:06.000+0000 | 2026-08-29T07:14:06.000+0000 | |
| 0XlHu000000HUuSKAW | 005000000000000AAA | false | Community Newsletter | USD | 2026-07-13T21:33:06.000+0000 | 005000000000000AAA | 2026-07-13T21:33:06.000+0000 | 005000000000000AAA | 2026-07-13T21:33:06.000+0000 | true | false | 2026-07-13T21:33:06.000+0000 | 2026-07-13T21:33:06.000+0000 | |
| 0XlHu000000obdAKAQ | 005000000000000AAA | false | General Marketing | USD | 2025-11-04T06:46:15.000+0000 | 005000000000000AAA | 2026-07-13T21:34:05.000+0000 | 005000000000000AAA | 2026-07-13T21:34:05.000+0000 | true | false | 2026-07-13T21:34:05.000+0000 | 2026-07-13T21:34:05.000+0000 | |
| 0XlHu000000HUvsKAG | 005000000000000AAA | false | Health Tips and Wellness | USD | 2026-08-29T07:14:06.000+0000 | 005000000000000AAA | 2026-08-29T07:14:06.000+0000 | 005000000000000AAA | 2026-08-29T07:14:06.000+0000 | true | false | 2026-08-29T07:14:06.000+0000 | 2026-08-29T07:14:06.000+0000 | |
| 0XlHu000000HUvrKAG | 005000000000000AAA | false | Plan and Benefits Updates | USD | 2026-08-29T07:14:06.000+0000 | 005000000000000AAA | 2026-08-29T07:14:06.000+0000 | 005000000000000AAA | 2026-08-29T07:14:06.000+0000 | true | false | 2026-08-29T07:14:06.000+0000 | 2026-08-29T07:14:06.000+0000 | |
| 0XlHu000000HUuXKAW | 005000000000000AAA | false | Research & Advancements | USD | 2026-07-13T21:33:48.000+0000 | 005000000000000AAA | 2026-07-13T21:33:48.000+0000 | 005000000000000AAA | 2026-07-13T21:33:48.000+0000 | true | false | 2026-07-13T21:33:48.000+0000 | 2026-07-13T21:33:48.000+0000 |
consent/contact-point-type-consent.csv1,723 rows · 26 columns
Join keys: PartyId -> contacts.IndividualId
| Column | Type |
|---|---|
Id | salesforce id |
OwnerId | salesforce id |
IsDeleted | boolean |
Name | text |
CreatedDate | datetime |
CreatedById | salesforce id |
LastModifiedDate | datetime |
LastModifiedById | salesforce id |
SystemModstamp | datetime |
MayEdit | boolean |
IsLocked | boolean |
LastViewedDate | empty |
LastReferencedDate | empty |
PartyId | salesforce id |
ContactPointType | text |
DataUsePurposeId | empty |
PrivacyConsentStatus | text |
EffectiveFrom | datetime |
EffectiveTo | empty |
CaptureDate | datetime |
CaptureContactPointType | empty |
CaptureSource | text |
DoubleConsentCaptureDate | empty |
EngagementChannelTypeId | salesforce id |
PartyRoleId | empty |
BusinessBrandId | empty |
First 20 rows
| Id | OwnerId | IsDeleted | Name | CreatedDate | CreatedById | LastModifiedDate | LastModifiedById | SystemModstamp | MayEdit | IsLocked | LastViewedDate | LastReferencedDate | PartyId | ContactPointType | DataUsePurposeId | PrivacyConsentStatus | EffectiveFrom | EffectiveTo | CaptureDate | CaptureContactPointType | CaptureSource | DoubleConsentCaptureDate | EngagementChannelTypeId | PartyRoleId | BusinessBrandId |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0ZYHu000000fy0cOAA | 005000000000000AAA | False | Email Consent - Delacroix | 2026-08-29T08:11:26.000+0000 | 005000000000000AAA | 2026-08-29T08:11:26.000+0000 | 005000000000000AAA | 2026-08-29T08:11:26.000+0000 | True | False | 0PKHu000004Y5CLOA0 | OptIn | 2025-10-11T00:00:00.000+0000 | 2025-10-11T00:00:00.000+0000 | Preference Center | 0eFHu000000p5MJMAY | |||||||||
| 0ZYHu000000fy0dOAA | 005000000000000AAA | False | SMS Consent - Delacroix | 2026-08-29T08:11:26.000+0000 | 005000000000000AAA | 2026-08-29T08:11:26.000+0000 | 005000000000000AAA | 2026-08-29T08:11:26.000+0000 | True | False | 0PKHu000004Y5CLOA0 | Phone | NotSeen | 2026-04-27T00:00:00.000+0000 | 2026-04-27T00:00:00.000+0000 | Preference Center | 0eFHu000000p5MKMAY | ||||||||
| 0ZYHu000000fy0eOAA | 005000000000000AAA | False | Email Consent - Abernathy | 2026-08-29T08:11:26.000+0000 | 005000000000000AAA | 2026-08-29T08:11:26.000+0000 | 005000000000000AAA | 2026-08-29T08:11:26.000+0000 | True | False | 0PKHu000004Y5CMOA0 | OptIn | 2025-05-10T00:00:00.000+0000 | 2025-05-10T00:00:00.000+0000 | Preference Center | 0eFHu000000p5MJMAY | |||||||||
| 0ZYHu000000fy0fOAA | 005000000000000AAA | False | SMS Consent - Abernathy | 2026-08-29T08:11:26.000+0000 | 005000000000000AAA | 2026-08-29T08:11:26.000+0000 | 005000000000000AAA | 2026-08-29T08:11:26.000+0000 | True | False | 0PKHu000004Y5CMOA0 | Phone | NotSeen | 2025-03-23T00:00:00.000+0000 | 2025-03-23T00:00:00.000+0000 | Preference Center | 0eFHu000000p5MKMAY | ||||||||
| 0ZYHu000000fy0gOAA | 005000000000000AAA | False | Email Consent - Vasquez-Ruiz | 2026-08-29T08:11:26.000+0000 | 005000000000000AAA | 2026-08-29T08:11:26.000+0000 | 005000000000000AAA | 2026-08-29T08:11:26.000+0000 | True | False | 0PKHu000004Y5CNOA0 | OptIn | 2026-07-16T00:00:00.000+0000 | 2026-07-16T00:00:00.000+0000 | Preference Center | 0eFHu000000p5MJMAY | |||||||||
| 0ZYHu000000fy0hOAA | 005000000000000AAA | False | SMS Consent - Vasquez-Ruiz | 2026-08-29T08:11:26.000+0000 | 005000000000000AAA | 2026-08-29T08:11:26.000+0000 | 005000000000000AAA | 2026-08-29T08:11:26.000+0000 | True | False | 0PKHu000004Y5CNOA0 | Phone | OptIn | 2025-08-02T00:00:00.000+0000 | 2025-08-02T00:00:00.000+0000 | Preference Center | 0eFHu000000p5MKMAY | ||||||||
| 0ZYHu000000fy0iOAA | 005000000000000AAA | False | Email Consent - Halloran | 2026-08-29T08:11:26.000+0000 | 005000000000000AAA | 2026-08-29T08:11:26.000+0000 | 005000000000000AAA | 2026-08-29T08:11:26.000+0000 | True | False | 0PKHu000004Y5COOA0 | OptIn | 2025-11-06T00:00:00.000+0000 | 2025-11-06T00:00:00.000+0000 | Preference Center | 0eFHu000000p5MJMAY | |||||||||
| 0ZYHu000000fy0jOAA | 005000000000000AAA | False | SMS Consent - Halloran | 2026-08-29T08:11:26.000+0000 | 005000000000000AAA | 2026-08-29T08:11:26.000+0000 | 005000000000000AAA | 2026-08-29T08:11:26.000+0000 | True | False | 0PKHu000004Y5COOA0 | Phone | OptOut | 2026-05-03T00:00:00.000+0000 | 2026-05-03T00:00:00.000+0000 | Preference Center | 0eFHu000000p5MKMAY | ||||||||
| 0ZYHu000000fy0kOAA | 005000000000000AAA | False | Email Consent - Delacroix | 2026-08-29T08:11:26.000+0000 | 005000000000000AAA | 2026-08-29T08:11:26.000+0000 | 005000000000000AAA | 2026-08-29T08:11:26.000+0000 | True | False | 0PKHu000004Y5CPOA0 | OptIn | 2026-02-06T00:00:00.000+0000 | 2026-02-06T00:00:00.000+0000 | Preference Center | 0eFHu000000p5MJMAY | |||||||||
| 0ZYHu000000fy0lOAA | 005000000000000AAA | False | SMS Consent - Delacroix | 2026-08-29T08:11:26.000+0000 | 005000000000000AAA | 2026-08-29T08:11:26.000+0000 | 005000000000000AAA | 2026-08-29T08:11:26.000+0000 | True | False | 0PKHu000004Y5CPOA0 | Phone | NotSeen | 2026-02-25T00:00:00.000+0000 | 2026-02-25T00:00:00.000+0000 | Preference Center | 0eFHu000000p5MKMAY | ||||||||
| 0ZYHu000000fy0mOAA | 005000000000000AAA | False | Email Consent - Abernathy | 2026-08-29T08:11:26.000+0000 | 005000000000000AAA | 2026-08-29T08:11:26.000+0000 | 005000000000000AAA | 2026-08-29T08:11:26.000+0000 | True | False | 0PKHu000004Y5CQOA0 | OptIn | 2025-03-21T00:00:00.000+0000 | 2025-03-21T00:00:00.000+0000 | Preference Center | 0eFHu000000p5MJMAY | |||||||||
| 0ZYHu000000fy0nOAA | 005000000000000AAA | False | SMS Consent - Abernathy | 2026-08-29T08:11:26.000+0000 | 005000000000000AAA | 2026-08-29T08:11:26.000+0000 | 005000000000000AAA | 2026-08-29T08:11:26.000+0000 | True | False | 0PKHu000004Y5CQOA0 | Phone | OptIn | 2025-04-29T00:00:00.000+0000 | 2025-04-29T00:00:00.000+0000 | Preference Center | 0eFHu000000p5MKMAY | ||||||||
| 0ZYHu000000fy0oOAA | 005000000000000AAA | False | Email Consent - Halloran | 2026-08-29T08:11:26.000+0000 | 005000000000000AAA | 2026-08-29T08:11:26.000+0000 | 005000000000000AAA | 2026-08-29T08:11:26.000+0000 | True | False | 0PKHu000004Y5CROA0 | OptIn | 2025-08-29T00:00:00.000+0000 | 2025-08-29T00:00:00.000+0000 | Preference Center | 0eFHu000000p5MJMAY | |||||||||
| 0ZYHu000000fy0pOAA | 005000000000000AAA | False | SMS Consent - Halloran | 2026-08-29T08:11:26.000+0000 | 005000000000000AAA | 2026-08-29T08:11:26.000+0000 | 005000000000000AAA | 2026-08-29T08:11:26.000+0000 | True | False | 0PKHu000004Y5CROA0 | Phone | OptIn | 2026-07-26T00:00:00.000+0000 | 2026-07-26T00:00:00.000+0000 | Preference Center | 0eFHu000000p5MKMAY | ||||||||
| 0ZYHu000000fy0qOAA | 005000000000000AAA | False | Email Consent - Delacroix | 2026-08-29T08:11:26.000+0000 | 005000000000000AAA | 2026-08-29T08:11:26.000+0000 | 005000000000000AAA | 2026-08-29T08:11:26.000+0000 | True | False | 0PKHu000004Y5CSOA0 | OptOut | 2026-05-04T00:00:00.000+0000 | 2026-05-04T00:00:00.000+0000 | Preference Center | 0eFHu000000p5MJMAY | |||||||||
| 0ZYHu000000fy0rOAA | 005000000000000AAA | False | SMS Consent - Delacroix | 2026-08-29T08:11:26.000+0000 | 005000000000000AAA | 2026-08-29T08:11:26.000+0000 | 005000000000000AAA | 2026-08-29T08:11:26.000+0000 | True | False | 0PKHu000004Y5CSOA0 | Phone | OptIn | 2026-03-29T00:00:00.000+0000 | 2026-03-29T00:00:00.000+0000 | Preference Center | 0eFHu000000p5MKMAY | ||||||||
| 0ZYHu000000fy0sOAA | 005000000000000AAA | False | Email Consent - Abernathy | 2026-08-29T08:11:26.000+0000 | 005000000000000AAA | 2026-08-29T08:11:26.000+0000 | 005000000000000AAA | 2026-08-29T08:11:26.000+0000 | True | False | 0PKHu000004Y5CTOA0 | OptIn | 2026-04-12T00:00:00.000+0000 | 2026-04-12T00:00:00.000+0000 | Preference Center | 0eFHu000000p5MJMAY | |||||||||
| 0ZYHu000000fy0tOAA | 005000000000000AAA | False | SMS Consent - Abernathy | 2026-08-29T08:11:26.000+0000 | 005000000000000AAA | 2026-08-29T08:11:26.000+0000 | 005000000000000AAA | 2026-08-29T08:11:26.000+0000 | True | False | 0PKHu000004Y5CTOA0 | Phone | OptIn | 2025-10-15T00:00:00.000+0000 | 2025-10-15T00:00:00.000+0000 | Preference Center | 0eFHu000000p5MKMAY | ||||||||
| 0ZYHu000000fy0uOAA | 005000000000000AAA | False | Email Consent - Castellanos | 2026-08-29T08:11:26.000+0000 | 005000000000000AAA | 2026-08-29T08:11:26.000+0000 | 005000000000000AAA | 2026-08-29T08:11:26.000+0000 | True | False | 0PKHu000004Y5CUOA0 | OptOut | 2026-04-15T00:00:00.000+0000 | 2026-04-15T00:00:00.000+0000 | Preference Center | 0eFHu000000p5MJMAY | |||||||||
| 0ZYHu000000fy0vOAA | 005000000000000AAA | False | SMS Consent - Castellanos | 2026-08-29T08:11:26.000+0000 | 005000000000000AAA | 2026-08-29T08:11:26.000+0000 | 005000000000000AAA | 2026-08-29T08:11:26.000+0000 | True | False | 0PKHu000004Y5CUOA0 | Phone | OptOut | 2025-11-01T00:00:00.000+0000 | 2025-11-01T00:00:00.000+0000 | Preference Center | 0eFHu000000p5MKMAY |
consent/engagement-channel-type.csv2 rows · 17 columns
| Column | Type |
|---|---|
Id | salesforce id |
OwnerId | salesforce id |
IsDeleted | boolean |
Name | text |
CurrencyIsoCode | text |
CreatedDate | datetime |
CreatedById | salesforce id |
LastModifiedDate | datetime |
LastModifiedById | salesforce id |
SystemModstamp | datetime |
MayEdit | boolean |
IsLocked | boolean |
LastViewedDate | datetime |
LastReferencedDate | datetime |
ContactPointType | text |
IsActive | boolean |
UsageType | empty |
First 20 rows
| Id | OwnerId | IsDeleted | Name | CurrencyIsoCode | CreatedDate | CreatedById | LastModifiedDate | LastModifiedById | SystemModstamp | MayEdit | IsLocked | LastViewedDate | LastReferencedDate | ContactPointType | IsActive | UsageType |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0eFHu000000p5MJMAY | 005000000000000AAA | false | USD | 2025-11-04T06:46:15.000+0000 | 005000000000000AAA | 2026-08-29T07:49:20.000+0000 | 005000000000000AAA | 2026-08-29T07:49:20.000+0000 | true | false | 2026-08-29T07:49:20.000+0000 | 2026-08-29T07:49:20.000+0000 | true | |||
| 0eFHu000000p5MKMAY | 005000000000000AAA | false | SMS | USD | 2025-11-04T06:46:15.000+0000 | 005000000000000AAA | 2026-08-29T07:49:20.000+0000 | 005000000000000AAA | 2026-08-29T07:49:20.000+0000 | true | false | 2026-08-29T07:49:20.000+0000 | 2026-08-29T07:49:20.000+0000 | Phone | true |
contacts.csv890 rows · 16 columns
IndividualId is the key the 5,828 consent rows join on, via Individual.PartyId. An export that omits that one column produces consent rows that join to nothing.
Join keys: Id -> campaign-members.ContactId · IndividualId -> Individual.PartyId -> consent/comm-subscription-consent.PartyId · Email -> patients.Email__c, payer-enrichment.Email__c
| Column | Type |
|---|---|
Id | salesforce id |
IndividualId | salesforce id |
FirstName | text |
LastName | text |
Email | text |
Phone | text |
MobilePhone | text |
Title | text |
Department | text |
MailingStreet | text |
MailingCity | text |
MailingState | text |
MailingPostalCode | integer |
MailingCountry | text |
LeadSource | text |
AccountId | salesforce id |
First 20 rows
| Id | IndividualId | FirstName | LastName | Phone | MobilePhone | Title | Department | MailingStreet | MailingCity | MailingState | MailingPostalCode | MailingCountry | LeadSource | AccountId | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 003Hu00003zvHbmIAE | 0PKHu000004Y5QPOA0 | Allison | Andrews | allison.andrews1@example.com | (415) 555-0103 | (415) 555-0103 | 170 Post Street | San Francisco | CA | 94108 | US | ||||
| 003Hu00003zvHbnIAE | 0PKHu000004Y5QQOA0 | Brandy | Campbell | allison.andrews1@example.com | (415) 555-0103 | (415) 555-0103 | 170 Post Street | San Francisco | CA | 94108 | US | ||||
| 003Hu00003zvHboIAE | 0PKHu000004Y5QROA0 | Dan | Ellsworth | allison.andrews1@example.com | (415) 555-0103 | (415) 555-0103 | 170 Post Street, | San Francisco | CA | 94108 | US | ||||
| 003Hu00004BF7t2IAD | 0PKHu000004Y5OLOA0 | Xavier | Acme | xavier.acme1@example.com | (794) 555-0100 | (415) 555-0105 | Associate Technician | 240 E 3rd Ave | San Mateo | CA | 94401 | USA | 001Hu00003vaV50IAE | ||
| 003Hu00004BF7t3IAD | 0PKHu000004puuQOAQ | Paul | Partner | paul.partner1@example.com | (344) 555-0101 | (344) 555-0100 | Account Executive | Sales | 1 Market St | San Francisco | CA | 94105 | US | Social Media | 001Hu00003vaV50IAE |
| 003Hu00004BF7t4IAD | 0PKHu000004puuROAQ | Lauren | Bailey | lauren.bailey1@example.com | (415) 555-0111 | (415) 555-0111 | SVP, Technology | Information Technology | 1 Market St | San Francisco | CA | 94105 | US | Marketing Event | 001Hu00003vaV51IAE |
| 003Hu00004BF7t5IAD | 0PKHu000004Y5OKOA0 | Larry | Baxter | larry.baxter1@example.com | +13105550100 | (310) 555-0101 | Business Development | 1 Market St | San Francisco | CA | 94105 | US | Referral | 001Hu00003vaV52IAE | |
| 003Hu00004BF7t6IAD | 0PKHu000004Y5OMOA0 | Sarah | Phillips | sarah.phillips1@example.com | (794) 555-0100 | (317) 555-0131 | Account Executive | Sales | 240 E 3rd Ave | San Mateo | California | 94401 | USA | Data.com | 001Hu00003vaV50IAE |
| 003Hu00004BF7t7IAD | 0PKHu000004Y5ONOA0 | Joyce | Turner | joyce.turner1@example.com | (794) 555-0103 | (794) 555-0101 | Director of Sales | Sales | 6069 NE 49th Ave | Littleton | CO | 80211 | USA | Marketing Event | 001Hu00003vaV50IAE |
| 003Hu00004BF7t8IAD | 0PKHu000004Y5CGOA0 | Yvette | Acme | yvette.acme1@example.com | (794) 555-0100 | (415) 555-0106 | Lead Technician | 240 E 3rd Ave | San Mateo | CA | 94401 | USA | 001Hu00003vaV50IAE | ||
| 003Hu00004BF7t9IAD | 0PKHu000004Y5CHOA0 | Adam | Mercer | adam.mercer1@example.com | (794) 555-0102 | (794) 555-0101 | Sales Engineer | Sales | 6069 NE 49th Ave | Littleton | CO | 80211 | USA | Cold Call | 001Hu00003vaV50IAE |
| 003Hu00004BF7tAIAT | 0PKHu000004Y5OJOA0 | Chris | Post | chris.post1@example.com | (415) 555-0137 | (415) 555-0135 | Business Analyst | IT | 1 Market St. | San Francisco | CA | 94105 | USA | Referral | 001Hu00003vaV51IAE |
| 003Hu00004BF7tBIAT | 0PKHu000004puuSOAQ | Mark | Kingston | mark.kingston1@example.com | (769) 555-0102 | (804) 555-0101 | Project Manager | Engineering | 12011 Government Center Pkwy | Fairfax | VA | 22035 | USA | Cold Call | 001Hu00003vaV51IAE |
| 003Hu00004BF7tCIAT | 0PKHu000004puuTOAQ | James | Wu | james.wu1@example.com | (274) 555-0100 | VP of Sales | Sales | 1 Market St | San Francisco | CA | 94105 | US | Data.com | 001Hu00003vaV51IAE | |
| 003Hu00004BF7tDIAT | 0PKHu000004puuUOAQ | Bob | Hodges | bob.hodges1@example.com | (422) 555-0101 | (422) 555-0100 | President and CEO | CEO | 2725 Quarry Rd | Montgomery | PA | 19009 | USA | Cold Call | 001Hu00003vaV51IAE |
| 003Hu00004BF7tEIAT | 0PKHu000004puuVOAQ | Wes | Chopra | wes.chopra1@example.com | (847) 555-0102 | (310) 555-0102 | Manager, Information Technology | IT | 2110 N Rock Rd | Wichita | KS | 67208 | USA | Cold Call | 001Hu00003vaV53IAE |
| 003Hu00004BF7tFIAT | 0PKHu000004puuWOAQ | Andrea | Bowden | andrea.bowden1@example.com | (655) 555-0102 | (655) 555-0101 | Senior Vice President | Sales | 100 L Street | Boston | Massachusetts | 02051 | United States | Data.com | 001Hu00003vaV54IAE |
| 003Hu00004BF7tGIAT | 0PKHu000004Y5QTOA0 | Stewart | Anderson | (317) 555-0185 | Principal NextGen Developer | 001Hu00003vaV55IAE | |||||||||
| 003Hu00004BF7tHIAT | 0PKHu000004Y5QAOA0 | Aiden | Pearson | aiden.pearson1@example.com | (415) 555-0153 | (415) 555-0154 | Owner | CEO | 50 Fremont Street | San Francisco | CA | 94105 | USA | Social Media | 001Hu00003vaV56IAE |
| 003Hu00004BF7tIIAT | 0PKHu000004Y5QBOA0 | Brad | Anastasio | brad.anastasio1@example.com | (415) 555-0157 | SVP, Sales | Sales | 800 3rd Street | San Francisco | CA | 94105 | USA | Social Media | 001Hu00003vaV57IAE |
message-registry.csv27 rows · 21 columns
Join keys: cld_Campaign_Id__c -> campaigns.Id · cld_Channel_Type_Id__c -> consent/comm-subscription-channel-type.Id
| Column | Type |
|---|---|
Id | salesforce id |
Name | text |
cld_Message_Id__c | text |
cld_Campaign_Id__c | salesforce id |
cld_Message_Name__c | text |
cld_Subject__c | text |
cld_Channel_Type_Id__c | salesforce id |
cld_Scheduled_Date__c | datetime |
cld_Variant__c | text |
cld_Channel__c | text |
cld_Campaign__c | salesforce id |
cld_Content_Id__c | salesforce id |
cld_Preview_Subject__c | text |
cld_Preview_Preheader__c | text |
cld_Preview_Body__c | text |
cld_Variant_Id__c | salesforce id |
cld_Preview_Headline__c | text |
cld_Preview_Image_URL__c | text |
cld_Preview_Cta_Label__c | text |
cld_Preview_Cta_Url__c | text |
cld_Preview_Bullets__c | text |
First 20 rows
| Id | Name | cld_Message_Id__c | cld_Campaign_Id__c | cld_Message_Name__c | cld_Subject__c | cld_Channel_Type_Id__c | cld_Scheduled_Date__c | cld_Variant__c | cld_Channel__c | cld_Campaign__c | cld_Content_Id__c | cld_Preview_Subject__c | cld_Preview_Preheader__c | cld_Preview_Body__c | cld_Variant_Id__c | cld_Preview_Headline__c | cld_Preview_Image_URL__c | cld_Preview_Cta_Label__c | cld_Preview_Cta_Url__c | cld_Preview_Bullets__c |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| a6mHu0000006CcsIAE | MB-0009 | cld-six-age_in-em-a | 701Hu000002dAmVIAU | cld_Age-In - Email A | Turning 65? Know your Medicare costs up front | 0eBHu00000096wlMAA | 2026-08-06T19:00:21.000+0000 | Email A | 701Hu000002dAmVIAU | 20YHu00000BIkItMAL | Turning 65? Know your Medicare costs up front | Plans with $0 monthly premiums and built-in drug coverage are available in your area. | Hi {!$recipient.FirstName}, your 65th birthday is coming up, and with it your first Medicare choices. Makana Health Plans offers Medicare Advantage plans with predictable monthly premiums, $0 premium options in many areas, and prescription drug coverage built in. Compare them side by side and see what you would pay before you decide. | 9PsHu00000kkFLkKAM | Medicare costs you can plan for, month to month | https://YOUR_ORG.lightning.force.com/PLACEHOLDER_ASSET | Compare my Medicare costs | https://your-demo-site.example.com/makana/plans/medicare/compare?utm_source=email&utm_medium=owned&utm_campaign=cld_payer_age_in&utm_content=email_a | Your enrollment window. It opens three months before your birthday month and closes three months after. Whether a $0 monthly premium plan is available where you live. Whether your prescriptions are covered, and what you would pay at the pharmacy. | |
| a6mHu0000006CctIAE | MB-0010 | cld-six-age_in-em-b | 701Hu000002dAmVIAU | cld_Age-In - Email B | Turning 65? Keep the doctors you trust | 0eBHu00000096wlMAA | 2026-08-06T19:00:21.000+0000 | Email B | 701Hu000002dAmVIAU | 20YHu00000BIkIyMAL | Turning 65? Keep the doctors you trust | See whether your primary care doctor and specialists are in the Makana network. | Hi {!$recipient.FirstName}, turning 65 does not have to mean starting over with a new care team. Makana Health Plans Medicare Advantage plans include a broad network of primary care doctors and specialists. Search by name to confirm your doctors are in network, then compare the plans that keep your care where it is today. | 9PsHu00000kkFLpKAM | Keep your doctors when you move to Medicare | https://YOUR_ORG.lightning.force.com/PLACEHOLDER_ASSET | Check if my doctors are in network | https://your-demo-site.example.com/makana/plans/medicare/compare?utm_source=email&utm_medium=owned&utm_campaign=cld_payer_age_in&utm_content=email_b | Whether your primary care doctor is in the network of the plan you are considering. Whether the specialists you see today, and the hospital they use, are in network too. Whether you need a referral to see a specialist, and how that works in each plan. | |
| a6mHu0000006CcuIAE | MB-0011 | cld-six-age_in-sms | 701Hu000002dAmVIAU | cld_Age-In - SMS | Makana Health Plans: compare Medicare plans | 0eBHu00000096wmMAA | 2026-08-09T19:00:21.000+0000 | SMS | SMS | 701Hu000002dAmVIAU | 20YHu00000BIkJ3MAL | Makana Health Plans: compare Medicare plans | Makana Health Plans: $0 premium Medicare plans https://your-demo-site.example.com/makana/plans/medicare/compare?src=cld_age_in_sms Reply STOP to opt out. | 9PsHu00000kkFLuKAM | ||||||
| a6mHu0000006CcvIAE | MB-0012 | cld-six-cahps-em-a | 701Hu000002dAmWIAU | cld_CAHPS - Email A | Your wellness visit is free with your plan | 0eBHu00000096wlMAA | 2026-08-06T19:00:21.000+0000 | Email A | 701Hu000002dAmWIAU | 20YHu00000BIkJ8MAL | Your wellness visit is free with your plan | It takes about 45 minutes, and your doctor reviews your screenings and prescriptions in one sitting. | Hi {!$recipient.FirstName}, your Annual Wellness Visit is included with your Makana Health Plans coverage at no cost to you. It takes about 45 minutes. Your doctor goes over the screenings you are due for, looks at every prescription you take, and builds a simple prevention plan for the year ahead. It is the one appointment that keeps the rest of your care on track. | 9PsHu00000kkFLzKAM | One visit a year, no cost to you | https://YOUR_ORG.lightning.force.com/PLACEHOLDER_ASSET | Schedule my wellness visit | https://your-demo-site.example.com/makana/appointments/annual-wellness?utm_source=email&utm_medium=owned&utm_campaign=cld_payer_cahps&utm_content=email_a | The screenings you are due for this year, such as blood pressure, cholesterol, colon cancer, and diabetes checks. A review of every prescription you take, including over-the-counter medicines, to catch anything that no longer fits. A written prevention plan for the year, with the vaccines, tests, and follow-ups your doctor recommends. | |
| a6mHu0000006CcwIAE | MB-0013 | cld-six-cahps-em-b | 701Hu000002dAmWIAU | cld_CAHPS - Email B | The visit that unlocks your extra benefits | 0eBHu00000096wlMAA | 2026-08-06T19:00:21.000+0000 | Email B | 701Hu000002dAmWIAU | 20YHu00000BIkJDMA1 | The visit that unlocks your extra benefits | Your OTC allowance, fitness membership, and rides to appointments are already included. Here is how to start using them. | Hi {!$recipient.FirstName}, your Makana Health Plans coverage comes with extras that many members never touch: a quarterly over-the-counter allowance, a fitness membership, and rides to medical appointments. Your free Annual Wellness Visit is the easiest place to start. It takes about 45 minutes, and your doctor can point you to the benefits that fit your health. Each completed visit also helps keep the plan's quality rating high, which helps keep premiums low for everyone. | 9PsHu00000kkFM4KAM | Your plan includes more than you are using | https://YOUR_ORG.lightning.force.com/PLACEHOLDER_ASSET | Book my wellness visit | https://your-demo-site.example.com/makana/appointments/annual-wellness?utm_source=email&utm_medium=owned&utm_campaign=cld_payer_cahps&utm_content=email_b | Your over-the-counter allowance. A set amount each quarter for items like pain relievers, vitamins, and first aid supplies. Your fitness membership. Access to participating gyms and home fitness programs at no added cost. Your transportation benefit. Rides to and from medical appointments, including your wellness visit. | |
| a6mHu0000006CcxIAE | MB-0014 | cld-six-cahps-sms | 701Hu000002dAmWIAU | cld_CAHPS - SMS | Makana Health Plans: book your free wellness visit | 0eBHu00000096wmMAA | 2026-08-09T19:00:21.000+0000 | SMS | SMS | 701Hu000002dAmWIAU | 20YHu00000BIkJIMA1 | Makana Health Plans: book your free wellness visit | Makana Health Plans: Free wellness visit. https://your-demo-site.example.com/makana/appointments/annual-wellness?src=cld_cahps_sms Reply STOP to opt out. | 9PsHu00000kkFM9KAM | ||||||
| a6mHu0000006Cd4IAE | MB-0021 | cld-six-flu_shot-em-a | 701Hu000002dAmZIAU | cld_Flu Shot - Email A | A flu shot now protects everyone at home | 0eBHu00000096wlMAA | 2026-08-06T19:00:21.000+0000 | Email A | 701Hu000002dAmZIAU | 20YHu00000BIkJrMAL | A flu shot now protects everyone at home | Flu usually spreads at home first. One quick visit covers you, and kids 6 months and up can get theirs at the same time. | Hi {!$recipient.FirstName}, flu tends to spread at home before anywhere else. Getting your shot now means you are less likely to bring it back to the people you live with. Most plans cover the flu shot at no cost, and if you have kids 6 months or older, they can get theirs at the same visit. Pick a time that works for your family and we will take care of the rest. | 9PsHu00000kkFMiKAM | Protect the people you live with | https://your-demo-site.example.com/images/service-line/family_medicine-7653083.jpg | Schedule our flu shots | https://your-demo-site.example.com/makana/appointments/flu-shot?utm_source=email&utm_medium=owned&utm_campaign=cld_provider_flu&utm_content=email_a | It protects your household. Flu spreads fastest between people who share a home, so one shot helps everyone under your roof. It is covered at no cost by most plans. Bring your insurance card and there is usually nothing to pay. Kids 6 months and up can get theirs at the same visit. Book one appointment and bring the whole family. | |
| a6mHu0000006Cd5IAE | MB-0022 | cld-six-flu_shot-em-b | 701Hu000002dAmZIAU | cld_Flu Shot - Email B | Walk in for your flu shot, no appointment needed | 0eBHu00000096wlMAA | 2026-08-06T19:00:21.000+0000 | Email B | 701Hu000002dAmZIAU | 20YHu00000BIkIuMAL | Walk in for your flu shot, no appointment needed | Every Makana clinic and partner pharmacy takes walk-ins through November. It takes about 10 minutes. | Hi {!$recipient.FirstName}, getting your flu shot does not need to take a spot on your calendar. Every Makana Health clinic and partner pharmacy takes walk-ins through November, and the visit itself takes about 10 minutes. Just bring your insurance card. Evening hours are listed on the page below so you can stop by after work if that is easier. | 9PsHu00000kkFLlKAM | Walk in this week, no appointment needed | https://your-demo-site.example.com/images/service-line/urgent_care-8460229.jpg | See walk-in hours near me | https://your-demo-site.example.com/makana/appointments/flu-shot?utm_source=email&utm_medium=owned&utm_campaign=cld_provider_flu&utm_content=email_b | Walk into any Makana clinic. No appointment needed through November, and the shot takes about 10 minutes. Stop by a partner pharmacy. They take walk-ins too, so you can pair it with an errand you are already running. Come in the evening. Evening hours are listed on the page, and bringing your insurance card is all you need to do. | |
| a6mHu0000006Cd6IAE | MB-0023 | cld-six-flu_shot-sms | 701Hu000002dAmZIAU | cld_Flu Shot - SMS | Makana Health: walk in for a flu shot | 0eBHu00000096wmMAA | 2026-08-09T19:00:21.000+0000 | SMS | SMS | 701Hu000002dAmZIAU | 20YHu00000BIkJwMAL | Makana Health: Flu shots are in. Walk in today. https://your-demo-site.example.com/makana/appointments/flu-shot?src=cld_flu_sms Reply STOP to opt out. | 9PsHu00000kkFMnKAM | |||||||
| a6mHu0000006CcyIAE | MB-0015 | cld-six-mail_order-em-a | 701Hu000002dAmXIAU | cld_Mail Order - Email A | Your refills, delivered before you run out | 0eBHu00000096wlMAA | 2026-08-06T19:00:21.000+0000 | Email A | 701Hu000002dAmXIAU | 20YHu00000BIkJNMA1 | Your refills, delivered before you run out | Mail order sends a 90-day supply to your door and refills it automatically, so you never have to remember. | Hi {!$recipient.FirstName}, with Makana Health Plans mail order pharmacy, a 90-day supply of the medicines you take every day arrives at your door. Refills are set up automatically, so you do not have to call the pharmacy or watch the bottle. And if you have a question about a medicine, a Makana pharmacist is one phone call away. | 9PsHu00000kkFMEKA2 | Never miss a refill again | https://YOUR_ORG.lightning.force.com/PLACEHOLDER_ASSET | Switch to mail order | https://your-demo-site.example.com/makana/pharmacy/mail-order?utm_source=email&utm_medium=owned&utm_campaign=cld_payer_mail_order&utm_content=email_a | Trips to the pharmacy. A 90-day supply ships to your home with free standard shipping, so you fill each medicine about four times a year instead of every month. Remembering to refill. Automatic refills go out before you run low, and you get a text or email when each order ships. Waiting for answers. Call a Makana pharmacist with a question about a dose, a side effect, or how your medicines work together. | |
| a6mHu0000006CczIAE | MB-0016 | cld-six-mail_order-em-b | 701Hu000002dAmXIAU | cld_Mail Order - Email B | A 90-day supply costs less than three refills | 0eBHu00000096wlMAA | 2026-08-06T19:00:21.000+0000 | Email B | 701Hu000002dAmXIAU | 20YHu00000BIkJSMA1 | A 90-day supply costs less than three refills | On most Makana plans, one 90-day mail order copay is less than three 30-day copays at the counter, and shipping is free. | Hi {!$recipient.FirstName}, if you take a medicine every day, mail order is usually the lower-cost way to fill it. On most Makana Health Plans, one 90-day supply copay is less than three 30-day copays for the same medicine. Shipping is free, and the order comes to your door, so you skip a trip to the pharmacy every month. | 9PsHu00000kkFMJKA2 | Pay less for the same prescriptions | https://YOUR_ORG.lightning.force.com/PLACEHOLDER_ASSET | See my mail order savings | https://your-demo-site.example.com/makana/pharmacy/mail-order?utm_source=email&utm_medium=owned&utm_campaign=cld_payer_mail_order&utm_content=email_b | Lower copays. One 90-day copay is less than three 30-day copays on most Makana plans. Check your plan documents or call us for your exact amount. Free shipping. Standard shipping to your home is included with every order, with no minimum. One fewer trip. No gas, no parking, no waiting in line. Your medicines arrive at home and you keep your afternoon. | |
| a6mHu0000006Cd0IAE | MB-0017 | cld-six-mail_order-sms | 701Hu000002dAmXIAU | cld_Mail Order - SMS | Makana Health Plans: 90-day refills delivered | 0eBHu00000096wmMAA | 2026-08-09T19:00:21.000+0000 | SMS | SMS | 701Hu000002dAmXIAU | 20YHu00000BIkJXMA1 | Makana Health Plans: 90-day refills delivered | Makana Health Plans: Refills, delivered. https://your-demo-site.example.com/makana/pharmacy/mail-order?src=cld_mailorder_sms Reply STOP to opt out. | 9PsHu00000kkFMOKA2 | ||||||
| a6mHu0000006Cd1IAE | MB-0018 | cld-six-mammography-em-a | 701Hu000002dAmYIAU | cld_Mammography - Email A | Your mammogram takes less than 20 minutes | 0eBHu00000096wlMAA | 2026-08-06T19:00:21.000+0000 | Email A | 701Hu000002dAmYIAU | 20YHu00000BIkJcMAL | Your mammogram takes less than 20 minutes | No referral needed, results in a few days, and evening and Saturday slots open in October. | Hi {!$recipient.FirstName}, our records show you are due for a screening mammogram. Most screenings at Makana Health take under 20 minutes, and results are usually ready in a few days. You do not need a referral to book. In October we are adding evening and Saturday appointments at our imaging locations, so you can choose a time that fits your week. | 9PsHu00000kkFMTKA2 | A quick screening, on your schedule | https://YOUR_ORG.lightning.force.com/PLACEHOLDER_ASSET | Book my mammogram | https://your-demo-site.example.com/makana/appointments/mammography?utm_source=email&utm_medium=owned&utm_campaign=cld_provider_mammography&utm_content=email_a | Plan for about 20 minutes. Most screening mammograms are finished in that time, from check-in to done. Skip deodorant, lotion, or powder on the day of your visit. They can show up on the images and lead to a repeat picture. Results usually arrive in a few days through your Makana patient portal, and your care team will call if anything needs a closer look. | |
| a6mHu0000006Cd2IAE | MB-0019 | cld-six-mammography-em-b | 701Hu000002dAmYIAU | cld_Mammography - Email B | October is here, and your screening is due | 0eBHu00000096wlMAA | 2026-08-06T19:00:21.000+0000 | Email B | 701Hu000002dAmYIAU | 20YHu00000BIkJhMAL | October is here, and your screening is due | Breast Cancer Awareness Month is a good time to book. Extra October appointments are open now. | Hi {!$recipient.FirstName}, October is Breast Cancer Awareness Month, and our records show you are due for a screening mammogram. Screening can find changes years before symptoms appear, when treatment is simpler and more effective. We have opened extra October appointments, including evenings and Saturdays, so booking this month is easy. | 9PsHu00000kkFMYKA2 | This month, make time for your mammogram | https://your-demo-site.example.com/images/service-line/womens_imaging-screening.jpg | Book my October screening | https://your-demo-site.example.com/makana/appointments/mammography?utm_source=email&utm_medium=owned&utm_campaign=cld_provider_mammography&utm_content=email_b | You are due. Regular screening is the most reliable way to find changes early, when treatment is simplest. Screening mammograms can find changes years before you would notice a lump or any other symptom. Extra October appointments are open now, including evenings and Saturdays, and no referral is needed. | |
| a6mHu0000006Cd3IAE | MB-0020 | cld-six-mammography-sms | 701Hu000002dAmYIAU | cld_Mammography - SMS | Makana Health: schedule your mammogram | 0eBHu00000096wmMAA | 2026-08-09T19:00:21.000+0000 | SMS | SMS | 701Hu000002dAmYIAU | 20YHu00000BIkJmMAL | Makana Health: Mammogram due. Book today. https://your-demo-site.example.com/makana/appointments/mammography?src=cld_mammo_sms Reply STOP to opt out. | 9PsHu00000kkFMdKAM | |||||||
| a6mHu0000006Cd7IAE | MB-0024 | cld-six-primary_care-em-a | 701Hu000002dAmaIAE | cld_Primary Care - Email A | Meet a primary care provider who knows you | 0eBHu00000096wlMAA | 2026-08-06T19:00:21.000+0000 | Email A | 701Hu000002dAmaIAE | 20YHu00000BIkK1MAL | Meet a primary care provider who knows you | You visited us once. A primary care provider who knows your history catches things sooner, and same-week new-patient slots are open now. | Hi {!$recipient.FirstName}, you visited us once, and we would love to see you again. A primary care provider who knows your history catches things sooner and helps you stay ahead of them. Choose a provider by location, language and availability, then pick a time that fits your week. Same-week new-patient slots are open now. | 9PsHu00000kkFMsKAM | Meet your care team | https://your-demo-site.example.com/images/service-line/primary_care-5214997.jpg | Choose my provider | https://your-demo-site.example.com/makana/appointments/primary-care?utm_source=email&utm_medium=owned&utm_campaign=cld_provider_primary_care&utm_content=email_a | Knows your history. One provider who sees the whole picture notices changes early and catches things sooner. Keeps your care connected. When you need a specialist, a test or a referral, your provider coordinates it so nothing falls through the cracks. Fits your life. Choose by location, language and availability, with same-week new-patient slots ready to book. | |
| a6mHu0000006Cd8IAE | MB-0025 | cld-six-primary_care-em-b | 701Hu000002dAmaIAE | cld_Primary Care - Email B | What to expect at your first visit | 0eBHu00000096wlMAA | 2026-08-06T19:00:21.000+0000 | Email B | 701Hu000002dAmaIAE | 20YHu00000BIkK6MAL | What to expect at your first visit | About 40 minutes, a review of your health history and medications, and a plan you agree on together. | Hi {!$recipient.FirstName}, here is what happens at your first primary care visit. Plan on about 40 minutes. Your provider will review your health history and medications, talk through what matters to you, and build a plan you agree on together. Afterward, your results and messages are waiting for you in the patient portal. Bring your medication list and insurance card and we will take care of the rest. | 9PsHu00000kkFMxKAM | Your first visit, step by step | https://your-demo-site.example.com/images/health-plan/care_management-7446754.jpg | Book my first visit | https://your-demo-site.example.com/makana/appointments/primary-care?utm_source=email&utm_medium=owned&utm_campaign=cld_provider_primary_care&utm_content=email_b | Your medication list. Include prescriptions, over-the-counter medicines and supplements so your provider sees the full picture. Your insurance card. It lets us check your coverage before you arrive so there are no surprises at the front desk. Your questions. Anything you have been wondering about is worth raising, and your provider will make time for it. | |
| a6mHu0000006Cd9IAE | MB-0026 | cld-six-primary_care-sms | 701Hu000002dAmaIAE | cld_Primary Care - SMS | Makana Health: choose your primary care provider | 0eBHu00000096wmMAA | 2026-08-09T19:00:21.000+0000 | SMS | SMS | 701Hu000002dAmaIAE | 20YHu00000BIkKBMA1 | Makana Health: Meet your primary care team. https://your-demo-site.example.com/makana/appointments/primary-care?src=cld_pcp_sms Reply STOP to opt out. | 9PsHu00000kkFN2KAM | |||||||
| a6mHu0000006CckIAE | MB-0001 | cld-wb27-em-a | 701Hu000002dAmQIAU | cld_2027 Win-Back Email A - Plan Value | Your 2027 plan options are ready, Makana Health | 0eBHu00000096wlMAA | 2026-08-12T15:00:00.000+0000 | Email A - Plan Value | 701Hu000002dAmQIAU | 20YHu00000BIkFgMAL | Your 2027 plan: enroll by Dec 7 | Compare plans, keep your doctors, and re-enroll in about five minutes. | Hi {!$recipient.FirstName}, your 2027 Makana Health Plans options are published. Premiums, your doctor network, and prescription coverage are all in one place. Re-enrolling takes about five minutes. | 9PsHu00000kkFISKA2 | Your 2027 plan is ready. Enroll by December 7. | https://YOUR_ORG.lightning.force.com/PLACEHOLDER_ASSET | See my 2027 plan options | https://YOUR_ORG.my.site.com/PLACEHOLDER_LANDING_PAGE | Whether your current doctors are still in network. Whether your prescriptions are on the 2027 formulary. Whether a $0 monthly premium plan is available where you live. | |
| a6mHu0000006CclIAE | MB-0002 | cld-wb27-em-b | 701Hu000002dAmQIAU | cld_2027 Win-Back Email B - Care Continuity | Keep your care team for 2027 | 0eBHu00000096wlMAA | 2026-08-12T15:00:00.000+0000 | Email B - Care Continuity | 701Hu000002dAmQIAU | 20YHu00000BIkFhMAL | $0 primary care is back for 2027 | Plus dental, vision, and a $0 monthly premium on select Makana plans. | Hi {!$recipient.FirstName}, select Makana Health Plans now include $0 primary care visits, dental and vision coverage, and a $0 monthly premium. Your benefits are still here whenever you want to use them. | 9PsHu00000kkFITKA2 | $0 primary care visits are back for 2027. | https://YOUR_ORG.lightning.force.com/PLACEHOLDER_ASSET | See what my plan covers | https://YOUR_ORG.my.site.com/PLACEHOLDER_LANDING_PAGE | $0 primary care visits and $0 monthly premium. Dental, vision, and hearing coverage. A fitness benefit and rides to your appointments. |
patients.csv640 rows · 74 columns
Join keys: Email__c -> contacts.Email · Id -> appointments.Patient__c
| Column | Type |
|---|---|
Id | salesforce id |
Name | salesforce id |
Number_Attribute_7__c | decimal |
Number_Attribute_10__c | decimal |
Boolean_Attributes_7__c | integer |
Department__c | text |
Date_Attribute_2__c | date |
Text_Attribute_2__c | empty |
Boolean_Attributes_4__c | integer |
Clinic_Location__c | text |
emergency_contact_name__c | text |
Email__c | text |
Text_Attribute_6__c | empty |
vaccination_status__c | integer |
payment_status__c | text |
diagnosis__c | text |
medications__c | text |
Number_Attribute_6__c | decimal |
Last_Name__c | text |
insurance_provider__c | text |
Boolean_Attributes_10__c | integer |
Boolean_Attributes_3__c | integer |
Date_Attribute_3__c | date |
Text_Attribute_1__c | empty |
Number_Attribute_1__c | decimal |
Text_Attribute_10__c | empty |
Text_Attribute_9__c | empty |
Cancellation_Reason__c | empty |
Text_Attribute_5__c | empty |
Patient_MemberID__c | integer |
primary_care_physician__c | text |
Number_Attribute_9__c | decimal |
Boolean_Attributes_9__c | integer |
Number_Attribute_5__c | decimal |
Rescheduled_Date__c | empty |
Virtual_Appointment_Opt_In__c | integer |
insurance_policy_number__c | integer |
Clinic_ID__c | integer |
Number_Attribute_2__c | decimal |
Boolean_Attributes_6__c | integer |
Boolean_Attributes_2__c | integer |
emergency_contact_phone__c | text |
emergency_contact_relationship__c | text |
Text_Attribute_8__c | empty |
Appointment_Date__c | date |
Date_Attribute_4__c | date |
Text_Attribute_4__c | empty |
Appointment_Type__c | text |
procedure_code__c | text |
Provider_Name__c | text |
Number_Attribute_8__c | decimal |
First_Name__c | text |
payment_due_date__c | date |
Number_Attribute_4__c | decimal |
Appointment_Time__c | decimal |
Boolean_Attributes_8__c | integer |
Appointment_ID__c | integer |
Social_History__c | text |
No_Show_Reason__c | empty |
Number_Attribute_3__c | decimal |
Boolean_Attributes_5__c | integer |
Boolean_Attributes_1__c | integer |
Text_Attribute_7__c | empty |
Appointment_Reason__c | empty |
Date_Attribute_5__c | date |
Text_Attribute_3__c | empty |
Date_Attribute_1__c | date |
Gender__c | text |
Zip__c | integer |
City__c | text |
State__c | text |
Provider_Key__c | text |
PCP_Key__c | text |
Service_Line__c | text |
First 20 rows
| Id | Name | Number_Attribute_7__c | Number_Attribute_10__c | Boolean_Attributes_7__c | Department__c | Date_Attribute_2__c | Text_Attribute_2__c | Boolean_Attributes_4__c | Clinic_Location__c | emergency_contact_name__c | Email__c | Text_Attribute_6__c | vaccination_status__c | payment_status__c | diagnosis__c | medications__c | Number_Attribute_6__c | Last_Name__c | insurance_provider__c | Boolean_Attributes_10__c | Boolean_Attributes_3__c | Date_Attribute_3__c | Text_Attribute_1__c | Number_Attribute_1__c | Text_Attribute_10__c | Text_Attribute_9__c | Cancellation_Reason__c | Text_Attribute_5__c | Patient_MemberID__c | primary_care_physician__c | Number_Attribute_9__c | Boolean_Attributes_9__c | Number_Attribute_5__c | Rescheduled_Date__c | Virtual_Appointment_Opt_In__c | insurance_policy_number__c | Clinic_ID__c | Number_Attribute_2__c | Boolean_Attributes_6__c | Boolean_Attributes_2__c | emergency_contact_phone__c | emergency_contact_relationship__c | Text_Attribute_8__c | Appointment_Date__c | Date_Attribute_4__c | Text_Attribute_4__c | Appointment_Type__c | procedure_code__c | Provider_Name__c | Number_Attribute_8__c | First_Name__c | payment_due_date__c | Number_Attribute_4__c | Appointment_Time__c | Boolean_Attributes_8__c | Appointment_ID__c | Social_History__c | No_Show_Reason__c | Number_Attribute_3__c | Boolean_Attributes_5__c | Boolean_Attributes_1__c | Text_Attribute_7__c | Appointment_Reason__c | Date_Attribute_5__c | Text_Attribute_3__c | Date_Attribute_1__c | Gender__c | Zip__c | City__c | State__c | Provider_Key__c | PCP_Key__c | Service_Line__c |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| a2uHu000009v142IAA | a2uHu000009v142 | 1.73 | 1.73 | 0 | Women's Health | 1968-12-14 | 0 | Makana - Chicago | Renee Salyer | megan.salyer1@example.com | 1 | Pending | None | Aspirin | 1.73 | Salyer | United Healthcare | 0 | 0 | 1968-12-14 | 1.73 | 1 | Dr. Priya Castellanos | 1.73 | 0 | 1.73 | 1 | 7145631427 | 4 | 1.73 | 0 | 0 | 589-555-0100 | Spouse | 2028-10-03 | 1968-12-14 | Follow Up Visit | 0DW6X2Z | Dr. Priya Okonkwo | 1.73 | Megan | 2028-10-03 | 1.73 | 0.7092342653 | 0 | 3285 | Smoke | 1.73 | 0 | 0 | 1968-12-14 | 1968-12-14 | Female | 60602 | Chicago | IL | PRV-012 | PRV-017 | Women's Health | ||||||||||||||
| a2uHu000009v143IAA | a2uHu000009v143 | 0.64 | 0.64 | 1 | Primary Care | 1964-03-20 | 1 | Makana - Chicago | Renee Jiron | becky.jiron1@example.com | 1 | Paid | Diabetes | Antibiotics | 0.64 | Jiron | Cigna | 1 | 1 | 1964-03-20 | 0.64 | 2 | Dr. Amara Ferraro | 0.64 | 1 | 0.64 | 0 | 8018663445 | 4 | 0.64 | 1 | 1 | 904-555-0102 | Spouse | 2028-01-14 | 1964-03-20 | Initial Visit | 02UW38Z | Dr. Amara Ferraro | 0.64 | Becky | 2028-01-14 | 0.64 | 0.3999865476 | 1 | 4733 | Drink | 0.64 | 1 | 1 | 1964-03-20 | 1964-03-20 | Female | 60603 | Chicago | IL | PRV-009 | PRV-009 | Primary Care | ||||||||||||||
| a2uHu000009v144IAA | a2uHu000009v144 | 8.38 | 8.38 | 0 | Otolaryngology (ENT) | 1997-11-06 | 0 | Makana - Chicago | Renee Walsh | kevin.walsh1@example.com | 0 | Paid | Hypertension | Aspirin | 8.38 | Walsh | Medicare Advantage | 0 | 0 | 1997-11-06 | 8.38 | 3 | Dr. Priya Castellanos | 8.38 | 0 | 8.38 | 1 | 9038613687 | 4 | 8.38 | 0 | 0 | 850-555-0102 | Spouse | 2030-07-15 | 1997-11-06 | Follow Up Visit | B932Y0Z | Dr. Priya Nakamura | 8.38 | Kevin | 2030-07-15 | 8.38 | 0.89930136 | 0 | 5694 | Drink | 8.38 | 0 | 0 | 1997-11-06 | 1997-11-06 | Male | 60607 | Chicago | IL | PRV-015 | PRV-017 | Sensory & Skin | ||||||||||||||
| a2uHu000009v145IAA | a2uHu000009v145 | 5.78 | 5.78 | 1 | Internal Medicine | 2005-06-03 | 1 | Makana - Chicago | Renee Contraras | matt.contraras1@example.com | 0 | Paid | Asthma | Antibiotics | 5.78 | Contraras | Medicaid | 1 | 1 | 2005-06-03 | 5.78 | 4 | Dr. Amara Ferraro | 5.78 | 1 | 5.78 | 1 | 9878556709 | 4 | 5.78 | 1 | 1 | 330-555-0100 | Sibling | 2024-07-14 | 2005-06-03 | Initial Visit | 0MMP4ZZ | Dr. Amara Ferraro | 5.78 | Matt | 2024-07-14 | 5.78 | 0.637274358 | 1 | 10195 | Drink | 5.78 | 1 | 1 | 2005-06-03 | 2005-06-03 | Male | 60601 | Chicago | IL | PRV-009 | PRV-009 | Primary Care | ||||||||||||||
| a2uHu000009v146IAA | a2uHu000009v146 | 9.11 | 9.11 | 0 | Allergy | 1995-06-01 | 0 | Makana - Houston Medical Center | Renee Moeller | jess.moeller1@example.com | 0 | Pending | Hypertension | Antibiotics | 9.11 | Moeller | Medicaid | 0 | 0 | 1995-06-01 | 9.11 | 5 | Dr. Nadia Thibodeaux | 9.11 | 0 | 9.11 | 0 | 3431814077 | 8 | 9.11 | 0 | 0 | 852-555-0101 | Parent | 2023-03-30 | 1995-06-01 | Follow Up Visit | 0QTP0ZZ | Dr. Nadia Ferraro | 9.11 | Jess | 2023-03-30 | 9.11 | 0.8392177778 | 0 | 9153 | Smoke | 9.11 | 0 | 0 | 1995-06-01 | 1995-06-01 | Female | 77004 | Houston | TX | PRV-105 | PRV-107 | Sensory & Skin | ||||||||||||||
| a2uHu000009v147IAA | a2uHu000009v147 | 1.26 | 1.26 | 0 | Primary Care | 1949-12-01 | 0 | Makana - Hartford | Renee Rivera | reggie.jackson1@example.com | 0 | Pending | Diabetes | Aspirin | 1.26 | Jackson | Cigna | 0 | 0 | 1949-12-01 | 1.26 | 6 | Dr. Camille Nakamura | 1.26 | 0 | 1.26 | 0 | 1015092287 | 7 | 1.26 | 0 | 0 | 165-555-0100 | Guardian | 2026-03-29 | 1949-12-01 | Initial Visit | 0B547ZZ | Dr. Camille Nakamura | 1.26 | Reggie | 2026-03-29 | 1.26 | 0.5176171866 | 0 | 1807 | Drink | 1.26 | 0 | 0 | 1949-12-01 | 1949-12-01 | Male | 06106 | Hartford | CT | PRV-135 | PRV-135 | Primary Care | ||||||||||||||
| a2uHu000009v148IAA | a2uHu000009v148 | 3.31 | 3.31 | 1 | Hematology | 1991-09-10 | 1 | Makana - Hartford | Renee Conners | mary.conners1@example.com | 0 | Paid | Hypertension | Aspirin | 3.31 | Conners | Cigna | 1 | 1 | 1991-09-10 | 3.31 | 7 | Dr. Camille Thibodeaux | 3.31 | 1 | 3.31 | 1 | 7164675581 | 7 | 3.31 | 1 | 1 | 543-555-0100 | Sibling | 2030-09-21 | 1991-09-10 | Initial Visit | 09BM4ZX | Dr. Camille Castellanos | 3.31 | Mary | 2030-09-21 | 3.31 | 0.1798011614 | 1 | 10844 | Marijuana | 3.31 | 1 | 1 | 1991-09-10 | 1991-09-10 | Female | 06112 | Hartford | CT | PRV-137 | PRV-143 | Oncology & Hematology | ||||||||||||||
| a2uHu000009v149IAA | a2uHu000009v149 | 0.03 | 0.03 | 0 | Infectious Disease | 1954-04-20 | 0 | Makana - Hartford | Vincent Horst | adan.horst1@example.com | 0 | Paid | Asthma | Aspirin | 0.03 | Horst | Cigna | 0 | 0 | 1954-04-20 | 0.03 | 8 | Dr. Camille Nakamura | 0.03 | 0 | 0.03 | 1 | 9965612338 | 7 | 0.03 | 0 | 0 | 104-555-0100 | Spouse | 2027-04-26 | 1954-04-20 | Follow Up Visit | 0TC74ZZ | Dr. Camille Halloran | 0.03 | Adan | 2027-04-26 | 0.03 | 0.9157862301 | 0 | 9944 | 0.03 | 0 | 0 | 1954-04-20 | 1954-04-20 | Male | 06103 | Hartford | CT | PRV-142 | PRV-135 | Diagnostics & Rehab | |||||||||||||||
| a2uHu000009v14AIAQ | a2uHu000009v14A | 9.85 | 9.85 | 0 | Primary Care | 1968-06-07 | 0 | Makana - Hartford | Vincent Maclean | george.maclean1@example.com | 1 | Overdue | Asthma | Insulin | 9.85 | Maclean | Cigna | 0 | 0 | 1968-06-07 | 9.85 | 9 | Dr. Camille Thibodeaux | 9.85 | 0 | 9.85 | 0 | 3570678380 | 7 | 9.85 | 0 | 0 | 263-555-0101 | Parent | 2025-03-30 | 1968-06-07 | Follow Up Visit | 0D9A70Z | Dr. Camille Thibodeaux | 9.85 | George | 2025-03-30 | 9.85 | 0.940785158 | 0 | 1628 | 9.85 | 0 | 0 | 1968-06-07 | 1968-06-07 | Male | 06105 | Hartford | CT | PRV-143 | PRV-143 | Primary Care | |||||||||||||||
| a2uHu000009v14BIAQ | a2uHu000009v14B | 5.92 | 5.92 | 1 | Otolaryngology (ENT) | 1969-06-08 | 1 | Makana - Hartford | Evelyn Whitaker | rafael.stevenson1@example.com | 0 | Overdue | Asthma | Insulin | 5.92 | Stevenson | Cigna | 1 | 1 | 1969-06-08 | 5.92 | 10 | Dr. Camille Thibodeaux | 5.92 | 1 | 5.92 | 1 | 4373939587 | 7 | 5.92 | 1 | 1 | 229-555-0102 | Guardian | 2028-07-25 | 1969-06-08 | Follow Up Visit | 03QV4ZZ | Dr. Camille Ferraro | 5.92 | Rafael | 2028-07-25 | 5.92 | 0.1386751074 | 1 | 4831 | Marijuana | 5.92 | 1 | 1 | 1969-06-08 | 1969-06-08 | Male | 06112 | Hartford | CT | PRV-141 | PRV-143 | Sensory & Skin | ||||||||||||||
| a2uHu000009v14CIAQ | a2uHu000009v14C | 6.25 | 6.25 | 1 | Oncology | 1993-03-14 | 1 | Makana - Denver | Carl Mcewan | stacy.mcewan1@example.com | 0 | Pending | Hypertension | Antibiotics | 6.25 | Mcewan | Blue Cross Blue Shield | 1 | 1 | 1993-03-14 | 6.25 | 11 | Dr. Theo Ferraro | 6.25 | 1 | 6.25 | 1 | 8711331657 | 6 | 6.25 | 1 | 1 | 202-555-0100 | Spouse | 2027-04-04 | 1993-03-14 | Follow Up Visit | B2151ZZ | Dr. Theo Thibodeaux | 6.25 | Stacy | 2027-04-04 | 6.25 | 0.8795083891 | 1 | 10471 | 6.25 | 1 | 1 | 1993-03-14 | 1993-03-14 | Female | 80202 | Denver | CO | PRV-119 | PRV-117 | Oncology & Hematology | |||||||||||||||
| a2uHu000009v14DIAQ | a2uHu000009v14D | 5.69 | 5.69 | 0 | Allergy | 2005-10-16 | 0 | Makana - Los Angeles | Carl Kriegar | jeff.kriegar1@example.com | 0 | Paid | Hypertension | Insulin | 5.69 | Kriegar | Medicare Advantage | 0 | 0 | 2005-10-16 | 5.69 | 12 | Dr. Marcus Thibodeaux | 5.69 | 0 | 5.69 | 0 | 8515429905 | 13 | 5.69 | 0 | 0 | 581-555-0101 | Spouse | 2026-09-08 | 2005-10-16 | Initial Visit | 0RQBXZZ | Dr. Marcus Ferraro | 5.69 | Jeff | 2026-09-08 | 5.69 | 0.0620795617 | 0 | 8620 | Drink | 5.69 | 0 | 0 | 2005-10-16 | 2005-10-16 | Male | 90017 | Los Angeles | CA | PRV-033 | PRV-035 | Sensory & Skin | ||||||||||||||
| a2uHu000009v14EIAQ | a2uHu000009v14E | 4.26 | 4.26 | 1 | Family Medicine | 1957-11-12 | 1 | Makana - Chicago | Carl Kewo | george.kewo1@example.com | 1 | Paid | Hypertension | Aspirin | 4.26 | Kewo | United Healthcare | 1 | 1 | 1957-11-12 | 4.26 | 13 | Dr. Amara Ferraro | 4.26 | 1 | 4.26 | 0 | 8390305619 | 4 | 4.26 | 1 | 1 | 515-555-0100 | Spouse | 2026-04-29 | 1957-11-12 | Annual Physical | 0P5D0ZZ | Dr. Amara Ferraro | 4.26 | George | 2026-04-29 | 4.26 | 0.2523936736 | 1 | 407 | 4.26 | 1 | 1 | 1957-11-12 | 1957-11-12 | Male | 60603 | Chicago | IL | PRV-009 | PRV-009 | Primary Care | |||||||||||||||
| a2uHu000009v14FIAQ | a2uHu000009v14F | 7.88 | 7.88 | 1 | Anesthesiology | 1994-09-30 | 1 | Makana - Los Angeles | Carl Rodman | jeramy.rodman1@example.com | 1 | Paid | Hypertension | Insulin | 7.88 | Rodman | Aetna | 1 | 1 | 1994-09-30 | 7.88 | 14 | Dr. Marcus Thibodeaux | 7.88 | 1 | 7.88 | 1 | 5813779748 | 13 | 7.88 | 1 | 1 | 493-555-0101 | Sibling | 2028-06-02 | 1994-09-30 | Initial Visit | 30250M0 | Dr. Marcus Delacroix | 7.88 | Jeramy | 2028-06-02 | 7.88 | 0.8897531691 | 1 | 9642 | Marijuana | 7.88 | 1 | 1 | 1994-09-30 | 1994-09-30 | Male | 90064 | Los Angeles | CA | PRV-031 | PRV-035 | Surgical & Procedural | ||||||||||||||
| a2uHu000009v14GIAQ | a2uHu000009v14G | 5.78 | 5.78 | 0 | Oncology | 1970-08-23 | 0 | Makana - Chicago | Carl Slayden | katherine.slayden1@example.com | 0 | Paid | Diabetes | Aspirin | 5.78 | Slayden | Medicaid | 0 | 0 | 1970-08-23 | 5.78 | 15 | Dr. Amara Ferraro | 5.78 | 0 | 5.78 | 1 | 1592798012 | 4 | 5.78 | 0 | 0 | 206-555-0138 | Sibling | 2027-04-08 | 1970-08-23 | Follow Up Visit | 0JN93ZZ | Dr. Amara Thibodeaux | 5.78 | Katherine | 2027-04-08 | 5.78 | 0.04882267485 | 0 | 9226 | 5.78 | 0 | 0 | 1970-08-23 | 1970-08-23 | Female | 60601 | Chicago | IL | PRV-011 | PRV-009 | Oncology & Hematology | |||||||||||||||
| a2uHu000009v14HIAQ | a2uHu000009v14H | 7.72 | 7.72 | 1 | Hematology | 1989-03-20 | 1 | Makana - Dallas Medical Center | Carl Lawhon | bradford.lawhon1@example.com | 0 | Paid | Hypertension | Aspirin | 7.72 | Lawhon | Aetna | 1 | 1 | 1989-03-20 | 7.72 | 16 | Dr. Andre Castellanos | 7.72 | 1 | 7.72 | 0 | 5366431235 | 5 | 7.72 | 1 | 1 | 601-555-0102 | Sibling | 2029-12-13 | 1989-03-20 | Initial Visit | F01L6ZZ | Dr. Simone Thibodeaux | 7.72 | Bradford | 2029-12-13 | 7.72 | 0.05707258644 | 1 | 4754 | 7.72 | 1 | 1 | 1989-03-20 | 1989-03-20 | Male | 75204 | Dallas | TX | PRV-083 | PRV-089 | Oncology & Hematology | |||||||||||||||
| a2uHu000009v14IIAQ | a2uHu000009v14I | 0.29 | 0.29 | 1 | Behavioral Medicine | 1947-07-22 | 1 | Makana - Main Campus | Carl Steptoe | shannon.steptoe1@example.com | 1 | Pending | Diabetes | Aspirin | 0.29 | Steptoe | United Healthcare | 1 | 1 | 1947-07-22 | 0.29 | 17 | Dr. Elena Okonkwo | 0.29 | 1 | 0.29 | 1 | 3262321666 | 18 | 0.29 | 1 | 1 | 604-555-0100 | Sibling | 2028-01-20 | 1947-07-22 | Initial Visit | 0TCB3ZZ | Dr. Elena Castellanos | 0.29 | Shannon | 2028-01-20 | 0.29 | 0.09124366503 | 1 | 6177 | 0.29 | 1 | 1 | 1947-07-22 | 1947-07-22 | Female | 46224 | Indianapolis | IN | PRV-041 | PRV-036 | Neuro & Behavioral | |||||||||||||||
| a2uHu000009v14JIAQ | a2uHu000009v14J | 7.92 | 7.92 | 0 | Gastroenterology | 1979-04-19 | 0 | Makana - Greater Indianapolis | Priscilla Towles | brennan.towles1@example.com | 0 | Paid | Diabetes | Aspirin | 7.92 | Towles | Medicare Advantage | 0 | 0 | 1979-04-19 | 7.92 | 18 | Dr. Amara Mbeki | 7.92 | 0 | 7.92 | 1 | 2897436009 | 9 | 7.92 | 0 | 0 | 539-555-0103 | Sibling | 2023-02-06 | 1979-04-19 | Follow Up Visit | 0P9V3ZZ | Dr. Amara Abernathy | 7.92 | Brennan | 2023-02-06 | 7.92 | 0.4821277985 | 0 | 6141 | 7.92 | 0 | 0 | 1979-04-19 | 1979-04-19 | Male | 46205 | Indianapolis | IN | PRV-004 | PRV-008 | Surgical & Procedural | |||||||||||||||
| a2uHu000009v14KIAQ | a2uHu000009v14K | 2.33 | 2.33 | 1 | Internal Medicine | 1995-02-08 | 1 | Makana - New Mexico | Priscilla Larry | larry.larry1@example.com | 0 | Overdue | Asthma | Insulin | 2.33 | Larry | Medicaid | 1 | 1 | 1995-02-08 | 2.33 | 19 | Dr. Rohan Nakamura | 2.33 | 1 | 2.33 | 0 | 3299508569 | 1 | 2.33 | 1 | 1 | 982-555-0100 | Parent | 2024-08-09 | 1995-02-08 | Follow Up Visit | 0RH00BZ | Dr. Rohan Nakamura | 2.33 | Larry | 2024-08-09 | 2.33 | 0.2129759208 | 1 | 4203 | Smoke | 2.33 | 1 | 1 | 1995-02-08 | 1995-02-08 | Male | 87102 | Albuquerque | NM | PRV-063 | PRV-063 | Primary Care | ||||||||||||||
| a2uHu000009v14LIAQ | a2uHu000009v14L | 3.25 | 3.25 | 0 | Pain Management | 1982-09-04 | 0 | Makana - Tacoma | Vincent Dauphin | rene.dauphin1@example.com | 0 | Overdue | Diabetes | Antibiotics | 3.25 | Dauphin | United Healthcare | 0 | 0 | 1982-09-04 | 3.25 | 20 | Dr. Simone Okonkwo | 3.25 | 0 | 3.25 | 0 | 2910140737 | 19 | 3.25 | 0 | 0 | 430-555-0100 | Sibling | 2029-10-25 | 1982-09-04 | Follow Up Visit | 0RWWX8Z | Dr. Simone Abernathy | 3.25 | Rene | 2029-10-25 | 3.25 | 0.7553136389 | 0 | 483 | Smoke | 3.25 | 0 | 0 | 1982-09-04 | 1982-09-04 | Male | 98406 | Tacoma | WA | PRV-076 | PRV-072 | Surgical & Procedural |
payer-enrichment.csv640 rows · 108 columns
Join keys: Email__c -> contacts.Email · MemberID__c -> patients.Patient_MemberID__c
| Column | Type |
|---|---|
Id | salesforce id |
Name | text |
Policy_Number__c | text |
Coverage_Tier__c | text |
Plan_Start_Date__c | date |
Text_Attribute_9__c | empty |
Last_Portal_Login__c | date |
Lifestyle_Indicators__c | text |
Text_Attribute_5__c | empty |
Date_Attribute_5__c | date |
Gender__c | text |
Language_Preference__c | text |
Address__c | text |
Wellness_Program_Enrollment__c | integer |
Completed_Annual_Wellness_Visit__c | integer |
Optout__c | integer |
Text_Attribute_14__c | empty |
Age__c | integer |
Text_Attribute_10__c | empty |
MemberID__c | integer |
Title__c | text |
Text_Attribute_18__c | empty |
Date_Attribute_2__c | date |
Chronic_Condition_Flags__c | text |
Text_Attribute_2__c | empty |
Number_Attribute_4__c | decimal |
Email__c | text |
Plan_End_Date__c | date |
Boolean_Attributes_7__c | integer |
Boolean_Attributes_3__c | integer |
Text_Attribute_8__c | empty |
Weight__c | integer |
Number_Attribute_10__c | decimal |
Text_Attribute_4__c | empty |
Number_Attribute_8__c | decimal |
Race__c | text |
Last_PCP_Visit_Date__c | date |
Text_Attribute_13__c | empty |
Telehealth_Usage_Frequency__c | text |
Social_Determinant_of_Health__c | text |
Text_Attribute_17__c | empty |
Preventative_Care_Status__c | text |
Medical_Condition__c | text |
Text_Attribute_1__c | empty |
Number_Attribute_1__c | decimal |
Number_Attribute_5__c | decimal |
Last_Name__c | text |
Insurance_Plan_Type__c | text |
State__c | text |
Boolean_Attributes_6__c | integer |
Text_Attribute_20__c | empty |
Boolean_Attributes_2__c | integer |
Network_Participation__c | text |
First_Name__c | text |
Text_Attribute_7__c | empty |
Salutation__c | text |
Number_Attribute_9__c | decimal |
Date_Attribute_3__c | date |
Address_2__c | text |
Text_Attribute_19__c | empty |
Preferred_Communication_Channel_Optin__c | text |
Text_Attribute_12__c | empty |
Text_Attribute_16__c | empty |
Boolean_Attributes_9__c | integer |
Children_Count__c | integer |
Number_Attribute_6__c | decimal |
Benefit_Utilization_Level__c | text |
Number_Attribute_2__c | decimal |
Deceased__c | integer |
Contact_Number__c | integer |
Boolean_Attributes_1__c | integer |
Boolean_Attributes_5__c | integer |
Plan_Renewal_Date__c | date |
Member_Portal_Login_Frequency__c | text |
Text_Attribute_6__c | empty |
Date_Attribute_4__c | date |
Boolean_Attributes_10__c | integer |
Text_Attribute_11__c | empty |
Marital_Status__c | text |
Text_Attribute_15__c | empty |
Boolean_Attributes_8__c | integer |
Date_Attribute_1__c | date |
Zip__c | integer |
Number_Attribute_7__c | decimal |
Country__c | text |
Text_Attribute_3__c | empty |
Number_Attribute_3__c | decimal |
Boolean_Attributes_4__c | integer |
City__c | text |
Risk_Score__c | text |
Member_Status__c | text |
LOB__c | text |
Renewal_Status__c | text |
Risk_Tier__c | text |
PMPM__c | text |
Stars_Rating__c | text |
RAF_Score__c | decimal |
MLR__c | decimal |
OON_Claims_Count__c | integer |
OON_Claims_Pct__c | text |
ER_Visits_12mo__c | integer |
Inpatient_Admits_12mo__c | integer |
Total_Care_Gaps__c | integer |
Compliance_BP_Control__c | text |
Compliance_A1C__c | text |
Compliance_Flu_Vax__c | text |
Compliance_Breast_Screen__c | text |
cld_Audience__c | empty |
First 20 rows
| Id | Name | Policy_Number__c | Coverage_Tier__c | Plan_Start_Date__c | Text_Attribute_9__c | Last_Portal_Login__c | Lifestyle_Indicators__c | Text_Attribute_5__c | Date_Attribute_5__c | Gender__c | Language_Preference__c | Address__c | Wellness_Program_Enrollment__c | Completed_Annual_Wellness_Visit__c | Optout__c | Text_Attribute_14__c | Age__c | Text_Attribute_10__c | MemberID__c | Title__c | Text_Attribute_18__c | Date_Attribute_2__c | Chronic_Condition_Flags__c | Text_Attribute_2__c | Number_Attribute_4__c | Email__c | Plan_End_Date__c | Boolean_Attributes_7__c | Boolean_Attributes_3__c | Text_Attribute_8__c | Weight__c | Number_Attribute_10__c | Text_Attribute_4__c | Number_Attribute_8__c | Race__c | Last_PCP_Visit_Date__c | Text_Attribute_13__c | Telehealth_Usage_Frequency__c | Social_Determinant_of_Health__c | Text_Attribute_17__c | Preventative_Care_Status__c | Medical_Condition__c | Text_Attribute_1__c | Number_Attribute_1__c | Number_Attribute_5__c | Last_Name__c | Insurance_Plan_Type__c | State__c | Boolean_Attributes_6__c | Text_Attribute_20__c | Boolean_Attributes_2__c | Network_Participation__c | First_Name__c | Text_Attribute_7__c | Salutation__c | Number_Attribute_9__c | Date_Attribute_3__c | Address_2__c | Text_Attribute_19__c | Preferred_Communication_Channel_Optin__c | Text_Attribute_12__c | Text_Attribute_16__c | Boolean_Attributes_9__c | Children_Count__c | Number_Attribute_6__c | Benefit_Utilization_Level__c | Number_Attribute_2__c | Deceased__c | Contact_Number__c | Boolean_Attributes_1__c | Boolean_Attributes_5__c | Plan_Renewal_Date__c | Member_Portal_Login_Frequency__c | Text_Attribute_6__c | Date_Attribute_4__c | Boolean_Attributes_10__c | Text_Attribute_11__c | Marital_Status__c | Text_Attribute_15__c | Boolean_Attributes_8__c | Date_Attribute_1__c | Zip__c | Number_Attribute_7__c | Country__c | Text_Attribute_3__c | Number_Attribute_3__c | Boolean_Attributes_4__c | City__c | Risk_Score__c | Member_Status__c | LOB__c | Renewal_Status__c | Risk_Tier__c | PMPM__c | Stars_Rating__c | RAF_Score__c | MLR__c | OON_Claims_Count__c | OON_Claims_Pct__c | ER_Visits_12mo__c | Inpatient_Admits_12mo__c | Total_Care_Gaps__c | Compliance_BP_Control__c | Compliance_A1C__c | Compliance_Flu_Vax__c | Compliance_Breast_Screen__c | cld_Audience__c |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| a2wHu000007y0haIAA | Delia Ashcombe | Bronze | 2026-02-28 | Female | 24 | 801 | None | delia.ashcombe1@example.com | 2026-11-28 | Ashcombe | HMO | IN | Mixed | Delia | 2026-10-28 | 46201 | Indianapolis | 1 | Active | Exchange | In Progress | Low | 262.4 | 5 | 0.82 | 0.7111 | 2 | 0.6667 | 0 | 0 | 0 | Not Applicable | Not Applicable | Compliant | Not Applicable | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| a2wHu000007y0hbIAA | Delia Brightwater | Bronze | 2026-01-28 | Female | 31 | 802 | Hypertension | delia.brightwater1@example.com | 2026-12-28 | Brightwater | PPO | IL | Out-of-Network | Delia | 2026-11-28 | 60601 | Chicago | 2.3 | Active | Commercial | In Progress | Low | 465.92 | 2 | 1.456 | 0.7756 | 5 | 0.8333 | 0 | 0 | 2 | Non-Compliant | Not Applicable | Non-Compliant | Not Applicable | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| a2wHu000007y0hcIAA | Delia Caldwell | Bronze | 2025-12-28 | Female | 38 | 803 | Diabetes | delia.caldwell1@example.com | 2027-01-28 | Caldwell | EPO | MA | Out-of-Network | Delia | 2026-12-28 | 02108 | Boston | 3.6 | Active | Commercial | Renewed | Low | 557.44 | 2 | 1.742 | 0.79 | 8 | 0.8889 | 0 | 0 | 2 | Not Applicable | Non-Compliant | Non-Compliant | Not Applicable | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| a2wHu000007y0hdIAA | Delia Dunmore | Bronze | 2025-11-28 | Female | 45 | 804 | Asthma | delia.dunmore1@example.com | 2027-02-28 | Dunmore | POS | CA | Out-of-Network | Delia | SMS | 2027-01-28 | 90012 | Los Angeles | 4.9 | Active | Commercial | Renewed | Medium | 648.96 | 2 | 2.028 | 0.8044 | 11 | 0.9167 | 0 | 0 | 2 | Not Applicable | Not Applicable | Non-Compliant | Non-Compliant | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| a2wHu000007y0heIAA | Delia Ellsworth | Silver | 2025-10-28 | Female | 52 | 805 | COPD | delia.ellsworth1@example.com | 2027-03-28 | Ellsworth | HMO | NY | Out-of-Network | Delia | SMS | 2027-02-28 | 10001 | New York | 6.2 | Active | Exchange | Renewed | Medium | 971.88 | 2 | 2.314 | 0.8189 | 4 | 0.8 | 0 | 0 | 2 | Not Applicable | Not Applicable | Non-Compliant | Non-Compliant | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| a2wHu000007y0hfIAA | Delia Fairbourne | Silver | 2025-09-28 | Female | 59 | 806 | None | delia.fairbourne1@example.com | 2027-04-28 | Fairbourne | PPO | GA | Mixed | Delia | SMS | 2027-03-28 | 30303 | Atlanta | 7.5 | Active | Commercial | Renewed | High | 945 | 2 | 2.25 | 0.8333 | 7 | 0.875 | 0 | 0 | 2 | Not Applicable | Not Applicable | Non-Compliant | Non-Compliant | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| a2wHu000007y0hgIAA | Delia Gatlin | Silver | 2025-08-28 | Female | 66 | 807 | Hypertension | delia.gatlin1@example.com | 2027-05-28 | Gatlin | EPO | NM | Out-of-Network | Delia | 2027-04-28 | 87102 | Albuquerque | 8.8 | Active | Medicare Advantage | Renewed | High | 1212.12 | 3 | 2.886 | 0.8478 | 10 | 0.9091 | 0 | 0 | 2 | Non-Compliant | Not Applicable | Compliant | Non-Compliant | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| a2wHu000007y0hhIAA | Delia Harrowgate | Silver | 2025-07-28 | Female | 73 | 808 | Diabetes | delia.harrowgate1@example.com | 2027-06-28 | Harrowgate | POS | WA | Out-of-Network | Delia | 2027-05-28 | 98402 | Tacoma | 2.1 | Active | Medicare Advantage | Renewed | Low | 593.04 | 2 | 1.412 | 0.7983 | 3 | 0.75 | 0 | 0 | 3 | Not Applicable | Non-Compliant | Non-Compliant | Non-Compliant | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| a2wHu000007y0hiIAA | Delia Inglewood | Gold | 2025-06-28 | Female | 25 | 809 | Asthma | delia.inglewood1@example.com | 2027-07-28 | Inglewood | HMO | TX | Out-of-Network | Delia | 2027-06-28 | 75201 | Dallas | 3.4 | Active | Exchange | Renewed | Low | 916.92 | 2 | 1.698 | 0.7628 | 6 | 0.8571 | 0 | 0 | 1 | Not Applicable | Not Applicable | Non-Compliant | Not Applicable | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| a2wHu000007y0hjIAA | Delia Jessup | Gold | 2025-05-28 | Female | 32 | 810 | COPD | delia.jessup1@example.com | 2027-08-28 | Jessup | PPO | TN | Out-of-Network | Delia | Phone Call | 2027-07-28 | 37203 | Nashville | 4.7 | Active | Commercial | Renewed | Medium | 1071.36 | 2 | 1.984 | 0.7772 | 9 | 0.9 | 0 | 0 | 1 | Not Applicable | Not Applicable | Non-Compliant | Not Applicable | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| a2wHu000007y0hkIAA | Delia Kirkwall | Gold | 2025-04-28 | Female | 39 | 811 | None | delia.kirkwall1@example.com | 2026-11-28 | Kirkwall | EPO | TX | Mixed | Delia | Phone Call | 2026-10-28 | 77002 | Houston | 6 | Active | Commercial | In Progress | Medium | 1036.8 | 2 | 1.92 | 0.7917 | 2 | 0.6667 | 0 | 0 | 1 | Not Applicable | Not Applicable | Non-Compliant | Not Applicable | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| a2wHu000007y0hlIAA | Delia Langtry | Gold | 2025-03-28 | Female | 46 | 812 | Hypertension | delia.langtry1@example.com | 2026-12-28 | Langtry | POS | PA | Out-of-Network | Delia | Phone Call | 2026-11-28 | 19102 | Philadelphia | 7.3 | Active | Commercial | In Progress | High | 1380.24 | 2 | 2.556 | 0.8561 | 5 | 0.8333 | 0 | 0 | 3 | Non-Compliant | Not Applicable | Non-Compliant | Non-Compliant | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| a2wHu000007y0hmIAA | Delia Merriwether | Platinum | 2026-02-28 | Female | 53 | 813 | Diabetes | delia.merriwether1@example.com | 2027-01-28 | Merriwether | HMO | CO | Out-of-Network | Delia | 2026-12-28 | 80202 | Denver | 8.6 | Active | Exchange | Renewed | High | 1989.4 | 3 | 2.842 | 0.8456 | 8 | 0.8889 | 0 | 0 | 2 | Not Applicable | Non-Compliant | Compliant | Non-Compliant | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| a2wHu000007y0hnIAA | Delia Northcote | Platinum | 2026-01-28 | Female | 60 | 814 | Asthma | delia.northcote1@example.com | 2027-02-28 | Northcote | PPO | MO | Out-of-Network | Delia | 2027-01-28 | 64108 | Kansas City | 1.9 | Active | Commercial | Renewed | Low | 957.6 | 2 | 1.368 | 0.7711 | 11 | 0.9167 | 0 | 0 | 2 | Not Applicable | Not Applicable | Non-Compliant | Non-Compliant | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| a2wHu000007y0hoIAA | Delia Oakhurst | Platinum | 2025-12-28 | Female | 67 | 815 | COPD | delia.oakhurst1@example.com | 2027-03-28 | Oakhurst | EPO | CT | Out-of-Network | Delia | 2027-02-28 | 06103 | Hartford | 3.2 | Active | Medicare Advantage | Renewed | Low | 1157.8 | 2 | 1.654 | 0.7856 | 4 | 0.8 | 0 | 0 | 2 | Not Applicable | Not Applicable | Non-Compliant | Non-Compliant | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| a2wHu000007y0hpIAA | Delia Pemberton | Platinum | 2025-11-28 | Female | 74 | 816 | None | delia.pemberton1@example.com | 2027-04-28 | Pemberton | POS | NJ | Mixed | Delia | SMS | 2027-03-28 | 07302 | Jersey City | 4.5 | Active | Medicare Advantage | Renewed | Medium | 1113 | 2 | 1.59 | 0.8 | 7 | 0.875 | 0 | 0 | 2 | Not Applicable | Not Applicable | Non-Compliant | Non-Compliant | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| a2wHu000007y0hqIAA | Delia Quillon | Bronze | 2025-10-28 | Female | 26 | 817 | Hypertension | delia.quillon1@example.com | 2027-05-28 | Quillon | HMO | FL | Out-of-Network | Delia | SMS | 2027-04-28 | 32501 | Pensacola | 5.8 | Active | Exchange | Renewed | Medium | 712.32 | 2 | 2.226 | 0.8144 | 10 | 0.9091 | 0 | 0 | 2 | Non-Compliant | Not Applicable | Non-Compliant | Not Applicable | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| a2wHu000007y0hrIAA | Delia Ravenscroft | Bronze | 2025-09-28 | Female | 33 | 818 | Diabetes | delia.ravenscroft1@example.com | 2027-06-28 | Ravenscroft | PPO | IN | Out-of-Network | Delia | SMS | 2027-05-28 | 46208 | Indianapolis | 7.1 | Active | Commercial | Renewed | High | 803.84 | 2 | 2.512 | 0.8289 | 3 | 0.75 | 0 | 0 | 2 | Not Applicable | Non-Compliant | Non-Compliant | Not Applicable | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| a2wHu000007y0hsIAA | Delia Stallworth | Bronze | 2025-08-28 | Female | 40 | 819 | Asthma | delia.stallworth1@example.com | 2027-07-28 | Stallworth | EPO | IN | Out-of-Network | Delia | 2027-06-28 | 46201 | Indianapolis | 8.4 | Active | Commercial | Renewed | High | 895.36 | 3.5 | 2.798 | 0.8183 | 6 | 0.8571 | 0 | 0 | 1 | Not Applicable | Not Applicable | Compliant | Non-Compliant | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| a2wHu000007y0htIAA | Delia Thackery | Bronze | 2025-07-28 | Female | 47 | 820 | COPD | delia.thackery1@example.com | 2027-08-28 | Thackery | POS | IL | Out-of-Network | Delia | 2027-07-28 | 60601 | Chicago | 1.7 | Active | Commercial | Renewed | Low | 423.68 | 2 | 1.324 | 0.7689 | 9 | 0.9 | 0 | 0 | 2 | Not Applicable | Not Applicable | Non-Compliant | Non-Compliant |
What is in the asset pack
| Folder | Contents | Note |
|---|---|---|
00-dependencies/ | HLSMetadataSoap, HLSSiteGeocoder | Deploy first. cld_ObjectFactory will not compile without the first |
01-capability-layer/ | 3 classes | Resolve object and field names at runtime so components degrade instead of throwing |
02-controllers/ | 17 classes | Three of them hard-fail rather than degrade — see below |
03-seed-generators/ | 11 classes | Deterministic. Run last: they write on top of records that must already exist |
04-lwc/ | 18 bundles, 72 files | Every screen in the screenshots on this page |
05-placement/ | 15 FlexiPages, 11 tabs, 3 permission sets, 4 agent actions | Deploy tabs before permission sets |
06-data/ | 13 datasets, ~4.8 MB | 890 contacts, 640 payer, 640 patient, 2,989 appointments, 5,828 consent rows, 25 CMS pieces |
07-config/ | 91 files | Segments, dashboards, agents, Data Cloud. Reference material to read and adapt, not artifacts to import |
Before you deploy
- Read
SETUP.md. It carries a Replace before you deploy table: 71 hardcoded ids across the Apex, roughly 813 more across07-config/, the org id in 33 config files, and the tenant-suffixed Data Cloud tablessotIndividualHls1_Unified_SMH_1768110__dlmwhose numeric suffix is unique to this tenant and appears in four controllers. - Deploy in folder order:
00→01→02→03. - Run the seeds against synthetic data only.
SEESpinePopulateinfers gender from a name allowlist and is unsuitable for anything real. - Load the data before running the seeds.
06-data/README.mdgives the order. EveryIdcolumn is org-specific and must be re-keyed on import;contacts.IndividualIdis the key the consent files join on, and an export that omits it produces 5,828 consent rows that join to nothing.
The mock data, on its own
890 contacts, 640 payer enrichment rows, 640 patient rows, 2,989 appointments, 1,189 campaign members, 5,828 consent rows and 25 CMS content pieces. Every email address is on the reserved example.com domain and every phone number sits in the NANP reserved fictional range – 8,198 addresses and 4,591 numbers, all replaced before packaging.
Twenty documented joins resolve at their original rates. Two of them previously resolved at zero: consent hangs off Individual.PartyId, and the first export omitted Contact.IndividualId, so 5,828 consent rows joined to nothing. That one column is the difference between a usable consent model and a pile of orphans.
Every Id column is org-specific and must be re-keyed on import. 06-data/README.md gives the load order.
The skills
Five Claude skills, written while building this and used to build it. sfdc-headless-discovery is the most portable – the enumerator rule, the three oracles, and a table of Salesforce errors that do not mean what they say. tableau-next-dashboard-craft turns a day of Can’t show visualization into ten minutes. sfdc-web-affinity covers anonymous-to-known web tracking including a guest-user with sharing bug worth knowing about. sfdc-mcnext-campaign-build is the densest of the set and only useful if you build Marketing Cloud Next demo orgs. salesforce-se-os is a triage router for SE work.
A sixth was withheld. It depends on unpublished documents, and without them an agent would improvise the missing rubric and present the result as authored – which is the opposite of what this document is for. PROVENANCE.md in the pack says what was reviewed, what was changed before publication and why, and what each skill needs to run.
The schema
The pack now carries the schema as deployable metadata. 306 files – five object definitions and 279 field definitions in sf source format, under 08-schema/.
sf project deploy start --source-dir 08-schema/force-appThat replaces the paragraph above telling you to build six objects by hand. Deploy it first, before anything else in the pack.
Then assign the included cld_AssetPack_Schema_Access permission set. A metadata deploy grants no field-level security, so without it cld_OrgCapability.hasField() reports every field missing even though they deployed correctly – the capability layer does exactly what it should and degrades the whole pack to empty.
Eighteen fields are quarantined in 08-schema/quarantine/, all for one reason: their parent object is Visit, an Industries standard object that does not exist in a plain Enterprise Edition org. They are correct metadata and deploy as a second command in an org that has it.
Honest caveat: this tree was validated structurally – well-formedness, Metadata API element ordering, per-type required elements, length and precision bounds, lookup reachability – and never actually deployed. The extraction was read-only.