
Commerce App Eventing
- 69 installs
- 13 repo stars
- Updated August 4, 2026
- adobe/aio-commerce-sdk
commerce-app-eventing is a Claude Code skill that adds or modifies Commerce and external event subscriptions and their field extraction and filter rules in an Adobe Commerce app.
About
commerce-app-eventing adds or modifies Commerce and external event subscriptions in an Adobe Commerce app built with the aio-commerce-sdk. A developer uses it to set up event-driven workflows triggered by Commerce operations (like order placement or catalog changes) or third-party systems, and to configure event field extraction and filter rules. It also verifies the required I/O Events services are subscribed in the Developer Console workspace. It requires a base app initialized with commerce-app-init.
- Adds Commerce and external event subscriptions to an Adobe Commerce app
- Configures event field extraction and filter rules in app.commerce.config.ts
- Verifies I/O Events services are subscribed in the Developer Console workspace
Commerce App Eventing by the numbers
- 69 all-time installs (skills.sh)
- Ranked #3,093 of 4,347 Backend & APIs skills by installs in the Skillselion catalog
- Data as of Aug 4, 2026 (Skillselion catalog sync)
commerce-app-eventing capabilities & compatibility
- Capabilities
- commerce eventing · event subscriptions · event filtering
- Use cases
- api development
- Pricing
- Free
What commerce-app-eventing says it does
Add or modify Commerce and external event subscriptions, configure event field extraction and filter rules in an Adobe Commerce app.
Adds or modifies event sources — Commerce-native events or external events — in an existing `app.commerce.config.ts`.
npx skills add https://github.com/adobe/aio-commerce-sdk --skill commerce-app-eventingAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 69 |
|---|---|
| repo stars | ★ 13 |
| Last updated | August 4, 2026 |
| Repository | adobe/aio-commerce-sdk ↗ |
What it does
Configure Commerce-native and external event subscriptions, field extraction, and filters in an Adobe Commerce app.
Who is it for?
Setting up event-driven workflows triggered by Commerce operations or third-party systems in an Adobe Commerce app.
Skip if: Other extensibility domains like webhooks or business config, which have their own skills.
When should I use this skill?
A user wants to subscribe to Commerce or external events, such as order placement or catalog changes.
What you get
Validated Commerce and external event subscriptions wired into app.commerce.config.ts.
- Commerce and external event subscription config in app.commerce.config.ts
By the numbers
- 2 event source types (Commerce, external)
- Commerce event name max 180 chars
- requires Node.js 22+
Files
Configure Commerce App Eventing
Adds or modifies event sources — Commerce-native events or external events — in an existing app.commerce.config.ts. Extensibility domains other than eventing (webhooks, business config) are added separately via their own skills.
Prerequisites
- Verify the app is scaffolded and initialized, not merely that the config exists. Require both:
app.commerce.config.tspresent in the project root, and- the project initialized — signalled by the generated
src/commerce-extensibility-1/directory and installednode_modules(the@adobe/aio-commerce-lib-appdependency). - If
app.commerce.config.tsis missing, stop and invokecommerce-app-initfirst (it writes the config, then runs init). - If the config is present but the project is not initialized (no
src/commerce-extensibility-1/ornode_modules), runnpx @adobe/aio-commerce-lib-app initbefore continuing. Init is idempotent — it finds the existing config, skips the interactive prompts, installs dependencies, and generates the project files. - Ensure
CloudIntegrationSDK(I/O Events) andcommerceeventing(Adobe I/O Events for Adobe Commerce) are subscribed in the Developer Console workspace:
1. List currently subscribed services:
aio console workspace api list --projectName <project> --workspaceName <workspace> --json2. If either service is missing, re-subscribe with the full merged set of service codes (existing + missing). aio console workspace api add replaces the subscription list — omitting a currently-subscribed service will remove it.
aio console workspace api add \
--projectName <project> \
--workspaceName <workspace> \
--service-code <existing-codes>,CloudIntegrationSDK,commerceeventing \
--jsonIf the command fails with "product profile required" for commerceeventing, ask the user for the profile name and retry with --license-config commerceeventing=<profile>.
Step 1 — Understand intent
Ask whether the user wants to configure Commerce events, external events, or both:
- Commerce events (
eventing.commerce): native Commerce events. Names followplugin.<segments>orobserver.<segments>. - External events (
eventing.external): events from third-party systems (e.g., ERP, CRM). Names are free-form ([\w\-_.]+).
For each event source, gather:
- Provider label, description, and optional key
- For each event: name, label, description, and which runtime action(s) should handle it (format:
<package>/<action>) - For Commerce events only: fields to extract from the event payload (empty array captures the full payload), and any optional filter rules
- Optionally, which Commerce environments the event applies to (
env)
Step 2 — Derive config values
Apply the following validation rules before writing the config. Surface any issues to the user before proceeding.
| Field | Constraint |
|---|---|
| Commerce event name | Starts with plugin. or observer.; each segment matches [a-z_]+; max 180 chars |
| External event name | [\w\-_.]+; max 180 chars |
| Provider label | Max 100 chars |
| Provider description | Max 255 chars |
| Provider key | Optional; alphanumeric + hyphens only; max 50 chars |
| Event label | Max 100 chars |
| Event description | Max 255 chars |
| Field name | [a-zA-Z0-9_\-.[\]]+ or * |
| Rule operator | greaterThan, lessThan, equal, regex, in, or onChange |
| Runtime action | <package>/<action> (e.g., my-package/handle-order-placed) |
| Event env (optional) | Non-empty array of "paas" / "saas"; omitted = all environments |
Step 3 — Update app.commerce.config.ts
Add or merge eventing.commerce and/or eventing.external into the existing config, preserving all other domains. If the config already has an eventing key, extend it rather than replacing it.
Minimal example (Commerce event):
eventing: {
commerce: [{
provider: { label: "Commerce Events Provider", description: "..." },
events: [{
name: "plugin.order_placed", // plugin.<segments> or observer.<segments>
label: "Order Placed",
description: "Triggered when a customer places an order.",
fields: [{ name: "order_id" }], // empty array = full payload; Commerce events only
runtimeActions: ["my-package/handle-order-placed"], // <package>/<action>
}],
}],
}See assets/eventing-config.ts for the full reference including external event sources.
Creating the handler action
For events that reference runtime actions via runtimeActions, create the action file under src/actions/ and register it in app.config.yaml.
Register the action
Add a user-defined package to src/commerce-extensibility-1/ext.config.yaml alongside the existing app-management package. Use any name except app-management (reserved by the framework):
# src/commerce-extensibility-1/ext.config.yaml
# (add below the auto-generated app-management package)
runtimeManifest:
packages:
app-management:
# ... auto-generated — do not edit
my-app: # your package name — any name except "app-management"
actions:
handle-order-placed:
function: actions/handle-order-placed/index.js # relative to src/commerce-extensibility-1/
web: "no"
runtime: nodejs:24
annotations:
require-adobe-auth: falseThe <package>/<action> format in runtimeActions maps directly: my-app/handle-order-placed → package my-app, action handle-order-placed.
Handler skeleton
Event handlers receive a CloudEvents-shaped payload. The event data lives in params.data.
// src/commerce-extensibility-1/actions/handle-order-placed/index.ts
export async function main(params: Record<string, unknown>) {
const data = params.data as Record<string, unknown>;
// data contains the fields declared in the event's `fields` array
// (or the full payload if fields is empty)
const orderId = data["order_id"];
// process the event ...
return { statusCode: 200, body: { processed: true } };
}Step 4 — Validate
Build the project to confirm the updated config is valid:
aio app buildA build failure with a validation error points directly to the offending config field.
Common Issues
- External event has `fields`: The
fieldsproperty is only valid on Commerce events; external events don't support it. - `runtimeActions` format error: Must be
<package>/<action>. Both parts are lowercase alphanumeric + hyphens only. - `app-management` package name conflict: The framework generates this package in
ext.config.yamlon every build. Use any other name for your own actions. - Function path is relative to `src/commerce-extensibility-1/`: Do not use
src/...or project-root-relative paths.actions/handle-order-placed/index.jsresolves correctly;src/commerce-extensibility-1/actions/handle-order-placed/index.jsdoes not. - `defineConfig` not found: Ensure
@adobe/aio-commerce-lib-appis installed anddefineConfigis imported from@adobe/aio-commerce-lib-app/config. - Build fails on missing action: A runtime action referenced in
runtimeActionsmust exist in the project. Check the action files undersrc/commerce-extensibility-1/actions/and create any missing stubs.
Quality Bar
aio app buildcompletes without errors
Chaining
After aio app build passes:
- Add webhook interception — invoke
commerce-app-webhooksto intercept Commerce operations - Add merchant settings — invoke
commerce-app-business-configto expose configurable settings in Commerce Admin
References
- assets/eventing-config.ts — Reference config showing both Commerce and external event source shapes
import { defineConfig } from "@adobe/aio-commerce-lib-app/config";
export default defineConfig({
metadata: {
id: "my-commerce-app", // alphanumeric + hyphens only, max 100 chars
displayName: "My Commerce App", // shown in App Management UI, max 50 chars
description: "A Commerce app built with aio-commerce-sdk.", // max 255 chars
version: "1.0.0", // Major.Minor.Patch only, no pre-release identifiers
},
eventing: {
// Commerce-native events emitted by Adobe Commerce
commerce: [
{
provider: {
label: "Commerce Events Provider", // max 100 chars
description: "Handles native Commerce events for this app.", // max 255 chars
// key: "my-provider-key", // optional: alphanumeric + hyphens, max 50 chars
},
events: [
{
name: "plugin.order_placed", // plugin.<segments> or observer.<segments>; [a-z_]+ per segment; max 180 chars
label: "Order Placed", // max 100 chars
description: "Triggered when a customer places an order.", // max 255 chars
// fields to extract from the event payload; empty array = full payload
fields: [{ name: "order_id" }, { name: "customer_email" }],
// rules: [ // optional: filter when the action fires
// { field: "order_total", operator: "greaterThan", value: "100" },
// ],
// env: ["saas"], // optional: scope to Commerce environments ("paas" | "saas"); omitted = all
runtimeActions: ["my-package/handle-order-placed"], // <package>/<action>
},
],
},
],
// Events from third-party systems
external: [
{
provider: {
label: "External Events Provider", // max 100 chars
description: "Handles events from external systems.", // max 255 chars
},
events: [
{
name: "erp.inventory_updated", // [\w\-_.]+ pattern; max 180 chars
label: "Inventory Updated", // max 100 chars
description: "Triggered when inventory changes in the ERP system.", // max 255 chars
// env: ["paas"], // optional: scope to Commerce environments ("paas" | "saas"); omitted = all
runtimeActions: ["my-package/handle-inventory-updated"], // <package>/<action>
},
],
},
],
},
});
{
"skill_name": "commerce-app-eventing",
"evals": [
{
"id": 1,
"prompt": "My Commerce app needs to react to order placement. Add an event subscription for when a customer places an order so we can send a confirmation email.",
"expected_output": "The agent adds an eventing.commerce entry to app.commerce.config.ts with a provider and at least one Commerce event. The event name follows the plugin.<segments> or observer.<segments> pattern with lowercase segments. A runtimeAction is defined in <package>/<action> format. aio app build completes without errors.",
"assertions": [
"app.commerce.config.ts contains an eventing.commerce array",
"Commerce event name starts with plugin. or observer. and uses only [a-z_]+ segments",
"fields array is present on the Commerce event (may be empty)",
"runtimeActions contains at least one entry in <package>/<action> format",
"No eventing.external key is added",
"aio app build completes without errors"
]
},
{
"id": 2,
"prompt": "We have an ERP system that pushes inventory updates as events. Add an external event source to my Commerce app so it can consume those events.",
"expected_output": "The agent adds an eventing.external entry to app.commerce.config.ts with a provider and at least one external event. The event name matches the [\\w\\-_.]+ pattern. A runtimeAction is defined in <package>/<action> format. No eventing.commerce key is added. aio app build completes without errors.",
"assertions": [
"app.commerce.config.ts contains an eventing.external array",
"External event name matches [\\w\\-_.]+ pattern",
"No fields property on the external event",
"runtimeActions contains at least one entry in <package>/<action> format",
"No eventing.commerce key is added",
"aio app build completes without errors"
]
},
{
"id": 3,
"prompt": "I want my Commerce app to handle both native Commerce events (when products are saved) and external events from our Salesforce CRM. Set up both event sources.",
"expected_output": "The agent adds both eventing.commerce and eventing.external entries to app.commerce.config.ts. Commerce event names follow the plugin./observer. pattern; external event names match the free-form pattern. Both have valid runtimeActions. After the build passes, the agent suggests using commerce-app-webhooks or commerce-app-business-config to extend the app further.",
"assertions": [
"app.commerce.config.ts contains both eventing.commerce and eventing.external arrays",
"Commerce event name starts with plugin. or observer.",
"External event name does not start with plugin. or observer.",
"Both event types have valid runtimeActions in <package>/<action> format",
"aio app build completes without errors",
"Agent mentions commerce-app-webhooks or commerce-app-business-config as next steps"
]
}
]
}
Related skills
FAQ
What event sources are supported?
Commerce-native events (eventing.commerce, names like plugin.* or observer.*) and external events (eventing.external) from third-party systems such as ERP or CRM.
What services must be subscribed?
CloudIntegrationSDK (I/O Events) and commerceeventing must be subscribed in the Developer Console workspace.