Hi everyone,
I’m running into a confusing issue with shopify.app.toml validation and the new Events configuration. I’m wondering whether this is expected behavior or a bug in the current CLI/schema.
My app configuration looks roughly like this (simplified):
client_id = "..."
name = "..."
application_url = "https://<my-tunnel>.trycloudflare.com"
embedded = true
handle = "..."
[build]
automatically_update_urls_on_dev = true
[webhooks]
api_version = "2026-01"
[access.admin]
direct_api_mode = "online"
embedded_app_direct_api_access = true
[access_scopes]
scopes = "read_products,read_themes,unauthenticated_read_product_inventory,unauthenticated_read_product_listings,unauthenticated_read_product_tags,write_files"
[auth]
redirect_urls = [
"https://<my-tunnel>.trycloudflare.com/auth/callback",
"https://<my-tunnel>.trycloudflare.com/auth/shopify/callback",
"https://<my-tunnel>.trycloudflare.com/api/auth/callback"
]
[pos]
embedded = false
When I run:
shopify app config validate --json
I get:
App configuration is not valid
Validation errors in shopify.app.toml:
• [events]: Required
So I add:
[events]
api_version = "unstable"
However, the validator then complains that I also need at least one [[events.subscription]] entry, depending on the CLI/schema version.
This effectively forces me to define an Events subscription even though:
-
My app does not use Events at all.
-
I only need standard webhooks.
-
The Events API is currently configured with
api_version = "unstable". -
I don’t want to introduce an unnecessary Events endpoint or event-processing logic into my app.
To make validation pass, I currently have to add something like this:
[events]
api_version = "unstable"
[[events.subscription]]
handle = "noop-product-create"
topic = "Product"
actions = ["create"]
uri = "/events/noop"
query = """
query noop_product_event($productId: ID!) {
product(id: $productId) {
id
}
}
"""
I then have to implement a no-op /events/noop handler purely to satisfy configuration validation.
Functionally, I don’t want or need Shopify Events in this app.
Questions
-
Is it intended for
[events]to be required in everyshopify.app.toml, even when an app doesn’t use Events? -
Is it also intended that at least one
[[events.subscription]]is required? -
If so, why is a feature currently using
api_version = "unstable"effectively mandatory for config validation? -
Could the schema be relaxed so that:
-
[events]is optional, and/or -
[[events.subscription]]is optional unless the app explicitly opts into Events?
-
Right now, this makes the config-validation experience confusing for apps that only need standard webhooks. It also forces developers to add Events-related configuration and routes that serve no actual purpose for their application.
The documentation I’ve been looking at:
-
App configuration: App configuration
-
Events: Create an Events subscription
I’d appreciate clarification from Shopify staff or anyone who has encountered the same behavior.
If this is a known limitation of the current CLI/schema version, it would also be helpful to know the recommended minimal configuration for an app that does not use Events, or whether this behavior is expected to change.
Thanks!