Skip to content
integration-eventing-cdc-configure logo

Managing Change Data Capture Enablement

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.

forcedotcom/sf-skills5.1Kinstalls1.1Kstars

SKILL.md

Full skill instructions

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.

  2. 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).

  3. 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.

  4. 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.

  5. 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".

  6. 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".
DateTime fields support only equality in filters (=, !=) — not < / >Deploy returns "Only equality operators are supported for this field type or value". Use a named date literal: LastModifiedDate = TODAY.
Filter RHS must be a literal — no field-to-field comparisonBillingCity = ShippingCity returns "unexpected token: 'ShippingCity'".
Compound fields (e.g. BillingAddress) require dotted component access in filterBillingAddress.City = 'X' deploys; flat BillingCity is rejected as "field is invalid"; raw BillingAddress is rejected as "has to be used with a component field". Note this is the OPPOSITE of <enrichedFields>, which uses flat names.
Custom channel filename ends with __chn before the meta-xml suffixSalesforce's MDAPI naming convention; mismatch causes deploy ambiguity.
Custom channel XML must include <channelType>data</​channelType>Without data, the channel is rejected for CDC (other types exist for streaming/​event channels).
Source custom objects must already exist (or be deployed in the same transaction)The ChangeEvent entity for Foo__c doesn't exist until Foo__c does; member deploy fails otherwise.
Never generate a PlatformEventChannel file for the default ChangeEvents channelThe default channel is system-provided. Reference it via <eventChannel>ChangeEvents</​eventChannel> on members, but only custom (__chn) channels need a channel-meta file.
PlatformEventChannelMember accepts ONLY four elements: <enrichedFields>, <eventChannel>, <filterExpression>, <selectedEntity>Adding <description>, <isActive>, <masterLabel>, or any other element fails XML schema validation: "Element {...} invalid at this location". Stick to the four documented elements.
PlatformEventChannel accepts ONLY two elements: <channelType> and <label>Adding <masterLabel>, <description>, etc. produces "Element {...}masterLabel invalid at this location in type PlatformEventChannel". Use <label>, not <masterLabel>.
Generated metadata files only — never run sf project deploy start from this skillThis skill produces artifacts; deployment is a separate lifecycle concern.

Gotchas

IssueResolution
Unable to find the specified channelSet <eventChannel>ChangeEvents</​eventChannel> (no data/ prefix).
The PlatformEventChannelMember can't be created because it references an invalid event in the "selectedEntity" fieldUse the ChangeEvent name, not the source object: AccountChangeEvent, not Account.
Cannot create a new component with the namespace: <Object>Rename the file to use a single underscore: Account_ChangeEvent..., not Account__ChangeEvent....
The selected field, X.Y, isn't valid (in <enrichedFields>)Replace Owner.Name with OwnerId. CDC enriches the lookup automatically; only single-hop field API names validate.
filter expression has syntax errors: unexpected token: 'WHERE'Remove the WHERE keyword. The body is the predicate only.
The BillingCity field in the filter expression is invalid (or any flat Address component)Use the compound dotted form: BillingAddress.City, not BillingCity. See references/​filter-expressions.md for the full compound-field matrix.
Custom-object member fails with "ChangeEvent doesn't exist"The source object isn't deployed yet. Ensure the Foo__c object metadata is in the same deploy or already in the org.
DUPLICATE_VALUE on second deployThe member is already subscribed. Either delete first or skip — CDC doesn't support upsert on members directly.
sf infra error (TypeInferenceError, DeployMetadata): Could not infer a metadata type for a .changeDataCapture-meta.xml fileThat file extension and metadata type don't exist. Replace the changeDataCapture/<Entity>.changeDataCapture-meta.xml file with a platformEventChannelMembers/<Entity>_ChangeEvent.platformEventChannelMember-meta.xml file.
User says "subscribe Order__c" but means standard OrderConfirm — OrderChangeEvent (standard) and Order__ChangeEvent (custom) are different entities.

Output Expectations

Deliverables:

  • One force-app/​.../​platformEventChannelMembers/<Entity>_ChangeEvent.platformEventChannelMember-meta.xml per subscribed entity.
  • One force-app/​.../​platformEventChannels/<DevName>__chn.platformEventChannel-meta.xml per custom channel (if any).

File structure follows the templates in assets/.

After receiving the generated files, the user can verify them with sf project deploy start --dry-run -d <path> --target-org <alias> before deploying. If a dry-run surfaces an unfamiliar error, references/​deploy-troubleshooting.md maps the common deploy errors to their metadata-side fixes.


Cross-Skill Integration

NeedDelegate to
Generate the source custom objectplatform-custom-object-generate skill
Generate custom fields referenced by enrichment or filterplatform-custom-field-generate skill
Build a permission set for users who consume change eventsplatform-permission-set-generate skill

Reference File Index

FileWhen to read
assets/​PlatformEventChannelMember-template.xmlStep 3 — starting structure for a channel member
assets/​PlatformEventChannel-template.xmlStep 4 — starting structure for a custom channel
references/​filter-expressions.mdStep 6 — for the supported operators and field-type matrix when writing a filter expression
references/​deploy-troubleshooting.mdWhen a user reports a dry-run deploy error and asks for help diagnosing it

More skills from forcedotcom

platform-apex-logs-debug logo
forcedotcom/sf-skills

platform-apex-logs-debug

Salesforce debug log analysis and troubleshooting with 100-point scoring. TRIGGER when: user analyzes debug logs, hits governor limits, reads stack traces, or touches .log files from Salesforce orgs. DO NOT TRIGGER when: running Apex tests (use platform-apex-test-run), generating or fixing Apex code (use platform-apex-generate), or Agentforce session tracing (use agentforce-observe).

1.1K 6.4K
View
platform-soql-query logo
forcedotcom/sf-skills

platform-soql-query

SOQL query generation, optimization, and analysis with 100-point scoring. Use this skill when the user needs SOQL/SOSL authoring or optimization: natural-language-to-query generation, relationship queries, aggregates, query-plan analysis, and performance or safety improvements for Salesforce queries. TRIGGER when: user writes, optimizes, or debugs SOQL/SOSL queries, touches .soql files, or asks about relationship queries, aggregates, or query performance. DO NOT TRIGGER when: bulk data operations (use platform-data-manage), Apex DML logic (use platform-apex-generate), or report/dashboard queries.

1.1K 6.3K
View
platform-metadata-deploy logo
forcedotcom/sf-skills

platform-metadata-deploy

Salesforce DevOps automation using sf CLI v2. TRIGGER when: user deploys metadata, creates/manages scratch orgs or sandboxes, sets up CI/CD pipelines, or troubleshoots deployment errors with sf project deploy. DO NOT TRIGGER when: writing Apex code (use platform-apex-generate), building LWC components (use experience-lwc-generate), creating metadata definitions (use platform-custom-object-generate or platform-custom-field-generate), or querying org data (use platform-data-manage).

1.1K 6.3K
View
platform-metadata-retrieve logo
forcedotcom/sf-skills

platform-metadata-retrieve

ALWAYS USE THIS SKILL to retrieve metadata from an org to your local project using the sf project retrieve start command. Supports multiple retrieval modes: retrieve all remote changes, retrieve by source directory, retrieve by metadata type with wildcards, retrieve by manifest (package.xml), or retrieve by package name. Use when the user asks to retrieve, pull, sync, or download metadata, Apex classes, custom objects, or org changes. Supports source format (default) or metadata format (ZIP). DO NOT TRIGGER for deploying metadata (use platform-metadata-deploy skill), listing metadata, or generating package.xml. NEVER use MCP tools - always use this skill and the Bash tool with sf project retrieve start.

1.1K 6.3K
View
platform-custom-field-generate logo
forcedotcom/sf-skills

platform-custom-field-generate

Use this skill when users need to create, generate, or validate Salesforce Custom Field metadata. Trigger when users mention custom fields, field types, Roll-up Summary fields, Master-Detail relationships, Lookup relationships, formula fields, picklists, dependent (controlling) picklists, referencing a value set from a field, or scoping/limiting picklist values for a specific record type. Also use when users encounter field deployment errors, especially around Roll-up Summary format, Master-Detail constraints, formula issues, or a record type that won't deploy without a business process. Use this skill for custom field metadata work, field generation, and field troubleshooting. DO NOT TRIGGER for creating or customizing the value set itself — defining a new GlobalValueSet, or modifying a StandardValueSet catalog like Industry or Lead Source — use platform-value-set-generate instead; this skill covers the field that references a value set, not the value set definition.

1.1K 6.2K
View

Generates correct, deployable Salesforce permission set metadata (PermissionSet XML) with object, field, user, and app permissions. Use this skill when creating or editing permission set metadata, object permissions, field-level security (FLS), tab visibility, or deploying permission sets.

1.1K 6.1K
View
dx-code-analyzer-run logo
forcedotcom/sf-skills

dx-code-analyzer-run

Run Salesforce Code Analyzer to scan code for security, performance, best practice, and code style violations. Supports all engines (PMD, ESLint, CPD, RetireJS, Flow, SFGE, ApexGuru), targets (files, folders, git diff), categories, and severities. Also handles post-scan exploration: filtering results by engine/severity/category/file, and explaining what rules mean. TRIGGER when: user says 'scan my code', 'check security issues', 'run PMD/ESLint', 'find duplicates', 'analyze Flows', 'check vulnerable libraries', 'AppExchange review', 'lint my LWC', 'static analysis', 'code quality', 'show security violations', 'what is this rule', 'explain ApexCRUDViolation', 'filter results', or mentions engines/file types (.cls, .trigger, .js, .flow-meta.xml). Use this skill for scanning, exploring results, and listing rules. DO NOT TRIGGER when: user asks only about installation/configuration (use dx-code-analyzer-configure), or wants to create a custom rule (use dx-code-analyzer-custom-rule-create).

1.1K 6.1K
View
automation-flow-generate logo
forcedotcom/sf-skills

automation-flow-generate

Generate Salesforce Flows using the MCP tool execute_metadata_action. Use when the user asks to create, build, or generate a flow — including Screen, Autolaunched, Record-Triggered (before/after-save), Scheduled. Also trigger for flow-like requests such as "when a record is created", "trigger daily at", "send an email when", "update the field when", "automate", "workflow", or "flow XML/metadata". This is the only skill for Salesforce Flow generation.

1.1K 6K
View
platform-custom-object-generate logo
forcedotcom/sf-skills

platform-custom-object-generate

Use this skill when users need to create, generate, or validate Salesforce Custom Object metadata. Trigger when users mention custom objects, creating objects, object metadata, .object files, sharing models, name fields, or validation rules on objects. Also use when users say things like "create a custom object", "generate object metadata", "set up an object for...", or when they're troubleshooting object deployment errors especially around sharing models and Master-Detail relationships. Always use this skill for any custom object metadata work, including enriching and keeping the object's description current whenever its fields or validation rules change. Do NOT use this skill for non-Custom-Object metadata (Apex, Flows, LWC, Permission Sets, Custom Metadata Types) or for standard Salesforce objects.

1.1K 6K
View
platform-data-manage logo
forcedotcom/sf-skills

platform-data-manage

Salesforce data operations with 130-point scoring. Use this skill to create, update, delete, bulk import/export, generate test data, and clean up org records using sf CLI and anonymous Apex. TRIGGER when: user creates test data, performs bulk import/export, uses sf data CLI commands, needs data factory patterns for Apex tests, or needs to seed/clean records in a Salesforce org. DO NOT TRIGGER when: SOQL query writing only (use platform-soql-query), Apex test execution (use platform-apex-test-run), or metadata deployment (use platform-metadata-deploy).

1.1K 5.9K
View
experience-lwc-generate logo
forcedotcom/sf-skills

experience-lwc-generate

Lightning Web Components with PICKLES methodology and 165-point scoring. Use this skill when the user creates or edits LWC components, builds wire service patterns, or writes Jest tests for LWC. TRIGGER when: user creates/edits LWC components, touches lwc/**/*.js, .html, .css, .js-meta.xml files, or asks about wire service, SLDS, or Jest LWC tests. DO NOT TRIGGER when: Apex classes (use platform-apex-generate), Aura components, or Visualforce.

1.1K 5.9K
View
design-systems-slds-apply logo
forcedotcom/sf-skills

design-systems-slds-apply

Apply SLDS-compliant UI using the correct blueprints, styling hooks, utility classes, and icons. Use when building any UI that needs SLDS, choosing between Lightning Base Components and SLDS Blueprints, applying styling hooks for theming, using utility classes for layout and spacing, or selecting icons. Triggers include "build a modal", "create a form", "data table", "SLDS styling", "style with hooks", "add an icon".

1.1K 5.8K
View

Popular AI tools

Kaiber logo
Video

Kaiber

Generate, edit, and beat-sync AI video with leading models in one workspace.

Paid
View
Vimcal logo
Productivity

Vimcal

The world's fastest calendar for remote work

Free
View

Transform Your Design with AI Designer by ImgCreator.ai

Freemium
View
Akool AI logo
Content & writing

Akool AI

Revolutionizing Video Production with AI-Powered Creativity

Paid
View

Extend an image past the frame and let AI fill the new aspect ratio.

Freemium
View
StarByFace logo
Security

StarByFace

Discover your celebrity doppelgänger with StarByFace!

Free
View
C

ChainClarity explains 700+ crypto whitepapers in plain English, with layered summaries, comparisons, research tools, alerts, and a $4.99 Pro plan.

Freemium
View
Opus Clip logo
Coding & apps

Opus Clip

Opus.ai: Revolutionize Your Web Experience

Free
View