App config validation requires [events] and subscriptions even when my app doesnt use Events

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

  1. Is it intended for [events] to be required in every shopify.app.toml, even when an app doesn’t use Events?

  2. Is it also intended that at least one [[events.subscription]] is required?

  3. If so, why is a feature currently using api_version = "unstable" effectively mandatory for config validation?

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

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!

Yes facing the same problem , even though I didnt want to use events

There’s already post for this one: