forcedotcom/sf-skills5 files

Integration Eventing Cdc Configure

Use to enable Salesforce Change Data Capture (CDC) on a standard or custom object, configure a custom event channel, set a filter expression, or add enrichment fields. TRIGGER broadly on any of: 'enable CDC', 'enable Change Data Capture', 'turn on CDC', 'subscribe X to change events', 'only emit events for', 'filter change events', 'enrich change events', 'create a custom event channel'; or any mention of CDC, change events, PlatformEventChannel, PlatformEventChannelMember, EnrichedField, ChangeEvents channel, enrichment fields, change event filter; or when the user wants a downstream system to receive Salesforce data changes; or when the user touches .platformEventChannelMember-meta.xml / .platformEventChannel-meta.xml files. SKIP when publishing platform events, Pub/Sub API or REST/SOAP (use integration-connectivity-generate), or ManagedEventSubscription (out of scope for CDC). Always use this skill for CDC channel-membership metadata.

Specification
Skill ID
forcedotcom/sf-skills/integration-eventing-cdc-configure
Publisher
forcedotcom
Repository
sf-skills
Installs
0
Files
5
Synced
Sep 23, 2026
How to use it

Open any RiverX project, open the Skills panel in the chat, and search for this identifier. The files are fetched from the source repository at install time.

forcedotcom/sf-skills/integration-eventing-cdc-configureInstalls these files
  • SKILL.md
  • assets/PlatformEventChannel-template.xml
  • assets/PlatformEventChannelMember-template.xml
  • references/deploy-troubleshooting.md
  • references/filter-expressions.md

What this skill tells the agent

Managing Change Data Capture Enablement

Generate the metadata that subscribes Salesforce objects to Change Data Capture: PlatformEventChannelMember files for the default ChangeEvents channel or a custom channel, and PlatformEventChannel files for new custom channels. Covers enrichment fields, filter expressions, and the canonical naming and value formats that the Metadata API actually accepts (which differ from values that appear in many internal test fixtures and code-search hits).

Scope

  • In scope: Generating PlatformEventChannelMember and PlatformEventChannel metadata for CDC. Subscribing standard objects, custom objects, or both. Configuring enrichment fields. Configuring filter expressions. Defining custom data channels.
  • Out of scope: Publishing custom platform events (PE) — that's a different metadata type (PlatformEvent). Pub/Sub API or external Kafka/Bayeux configuration. Pricing/limits guidance — refer the user to the CDC Developer Guide. Programmatic event-bus subscribers in Apex.

Clarifying Questions

Before generating, confirm with the user if not already clear:

  • Which entity (or entities) need CDC enablement? Standard, custom, or both?
  • Default channel (ChangeEvents) or a custom channel? If custom, what's the channel label?
  • Any enrichment fields needed? (Lookup IDs that the consumer needs even when they didn't change.)
  • Any filter expression needed? (A SOQL-WHERE-clause body that gates which change events emit.)

Required Inputs

Gather or infer before proceeding:

  • Source entity API name(s) — e.g. Account, Lead, Order__c. The skill internally translates this to the ChangeEvent entity name (see Workflow step 2).
  • Channel — either ChangeEvents (default) or the developer name of a custom channel ending in __chn.
  • Enrichment fields (optional) — list of field API names on the source object whose values should be included in every change event.
  • Filter expression (optional) — a predicate over fields on the change event payload (e.g. Status__c != null).

Defaults unless specified:

  • Channel: ChangeEvents (the default CDC channel — no path prefix).
  • Enrichment fields: none.
  • Filter expression: none.

If the user provides a clear, complete request, generate immediately without unnecessary back-and-forth.


Workflow

All steps are sequential. Do not skip or reorder.

Before generating anything, know the only valid CDC metadata types: CDC is expressed entirely through PlatformEventChannelMember (one per subscribed entity) and PlatformEventChannel (only for custom channels). Do NOT use <ChangeDataCapture>, .changeDataCapture-meta.xml, changeDataCapture/ directories, EnableChangeDataCapture, or ManagedEventSubscription — these are not in scope for CDC. If you find yourself writing any of them, stop and use a PlatformEventChannelMember file instead.

  1. Identify the channel — if the user names a custom channel, you'll generate a PlatformEventChannel file (see step 4). Otherwise use the literal value ChangeEvents for the default channel.
  1. Translate source entity to ChangeEvent entity name — <selectedEntity> is the ChangeEvent type, NOT the source object:
Source object<selectedEntity> value
AccountAccountChangeEvent
LeadLeadChangeEvent
ContactContactChangeEvent
Order__c (custom)Order__ChangeEvent
MyThing__c (custom)MyThing__ChangeEvent

For standard objects: append ChangeEvent. For custom objects: replace the trailing __c with __ChangeEvent (the double-underscore is preserved).

  1. Generate the channel-member file — one file per (entity, channel) pair. The filename and fullName always use a SINGLE underscore between the entity stem and `ChangeEvent` — this is independent of how selectedEntity is formatted in the XML body. For custom objects, drop the __c from the source name when forming the filename:
Source objectFilename (and fullName)<selectedEntity> (in XML)
AccountAccount_ChangeEvent.platformEventChannelMember-meta.xmlAccountChangeEvent
LeadLead_ChangeEvent.platformEventChannelMember-meta.xmlLeadChangeEvent
Order__cOrder_ChangeEvent.platformEventChannelMember-meta.xml (NOT Order__ChangeEvent)Order__ChangeEvent
MyThing__cMyThing_ChangeEvent.platformEventChannelMember-meta.xml (NOT MyThing__ChangeEvent)MyThing__ChangeEvent

The custom-object case is the easiest place to slip — the filename uses single underscore, the selectedEntity keeps its double underscore. Read assets/PlatformEventChannelMember-template.xml as the structural template.

  1. For a custom channel, generate a PlatformEventChannel file — required if any member references a non-default channel. Derive a DeveloperName from the user's label: strip spaces and non-alphanumeric characters, convert to CamelCase, then always append the literal suffix __chn. The filename and the channel's <eventChannel> reference must use this exact form, otherwise the deploy fails with Invalid channel name:
User saysDeveloperNameFilename
Partner SyncPartnerSync__chnPartnerSync__chn.platformEventChannel-meta.xml (NOT Partner_Sync... or PartnerSync...)
Order UpdatesOrderUpdates__chnOrderUpdates__chn.platformEventChannel-meta.xml
data syncDataSync__chnDataSync__chn.platformEventChannel-meta.xml

Members on this channel reference it by the same DeveloperName: <eventChannel>PartnerSync__chn</eventChannel>. Read assets/PlatformEventChannel-template.xml.

  1. Add enrichment fields if requested — repeat the <enrichedFields><name>FIELD_API_NAME</name></enrichedFields> block for each field. The name must be a single-hop API name on the source entity — verified working with: standard lookup IDs (OwnerId, ParentId), custom lookup fields (MyLookup__c), and custom non-relationship fields (Region__c, Status__c). Relationship traversals like Owner.Name or Parent.Account.Industry are rejected by deploy with "The selected field, X.Y, isn't valid".
  1. Add a filter expression if requested — wrap the predicate in <filterExpression>...</filterExpression>. The body is a WHERE-clause body without the WHERE keyword (e.g. Status__c != null, not WHERE Status__c != null). For supported operators, field types, and pitfalls, read references/filter-expressions.md.

Rules / Constraints

ConstraintRationale
<selectedEntity> is the ChangeEvent type name, not the source object nameThe Metadata API binds the member to a ChangeEvent entity — passing Account directly fails with "invalid event in selectedEntity".
Member fullName uses single underscore: Account_ChangeEventThe double-underscore form (Account__ChangeEvent) is parsed as <namespace>__<name> and rejected: "Cannot create a new component with the namespace: Account".
Default channel value is exactly ChangeEvents — no path prefixOlder fixtures and some docs show data/ChangeEvents; the deploy returns "Unable to find the specified channel" for that value.
Enrichment field names are single-hop API names on the source entityStandard (OwnerId), custom lookup (MyLookup__c), and custom non-relationship (Region__c) all validate. Traversals like Owner.Name are rejected: "The selected field, X.Y, isn't valid".
<filterExpression> body has no WHERE keywordDeploy returns "filter expression has syntax errors: unexpected token: 'WHERE'".
Filter cannot reference IsDeleted or do relationship traversal (Owner.Username)Deploy rejects with "field is invalid".

More from forcedotcom

Use this skill in a project

Open any RiverX project, search the Skills panel for forcedotcom/sf-skills/integration-eventing-cdc-configure, and install it in one click.

Use this skill