Old Question looking for new Answer

Old Apps continue to haunt.

Say you have a 10 year old App with 1000 users and they all have the orders/paid webhook.

Say you are updating to 2025 NOW and you want that in your TOML to let Shopify deal with. FINE. Anyone can copy and paste the topic orders/paid into a toml file and do a deploy.

Thing is no one ever installs this App and so the 1000 old webhooks made by love and manual labour exist. What do you now do?

  • delete 1000 old webhook in 1000 stores because TOML file to the rescue? Shopify sees the newly deployed TOML instruction about the orders/paid and creates another one so now there are two and you have to kill one?

I am confused about the best practice here.

1 Like

Hi @hunkybill,

I’ve looked this further on my own store, and I can confirm that when registering new App Specific Webhooks via the toml file, that the previous API subscribed webhooks, aka Shop Specific Webhooks, does still exist on the store.

I also tested to confirm the behaviour when they both have the same callback URL, and I can confirm that it does send multiple webhooks to the same URL, once for each individual subscription. In this case, it sent the webhook twice, once for the App Specific Webhook subscription, and once for the Shop Specific Webhook subscription.

This is expected behaviour as these are considered seperate webhook subscriptions internally, with seperate subscription ids. And I can also confirm that when adding the App Specific Webhook and deploying with shopify app deploy that it does create the new subscription for stores that already have the app installed as well, it doesn’t require a new app installation.

As for best practices in this case, if you find you are receiving duplicate webhooks for the same app, on the same URL due to having both an App Specific Webhook and a Shop Specific Webhook subscription. If you query the webhookSubscriptions Admin API call from the app in question, it does return only the subscription id from the Shop Specific Webhook (API subscribed), you can then use that ID returned to delete the duplicate subscription with the webhookSubscriptionDelete mutation.