Multiple webhook subscription to a single topic and app

Topic summary

Developers are seeking best practices for handling multiple processes within a single app that need to subscribe to the bulk_operations/finish webhook topic.

Core Question:
Should they use one webhook endpoint receiving all notifications, or register separate endpoints for different processes (Process A and Process B, each using bulk queries with different parameters)?

Suggested Approaches:

  • Single endpoint: All notifications go to one URL; differentiation happens in app logic by examining the payload’s id field (unique per operation) or query_params (though reportedly removed)
  • Multiple endpoints: Separate URLs for each process, though it’s unclear if Shopify supports registering multiple endpoints for the same topic

Key Challenges:

  • No clear documentation on adding identifying information to differentiate bulk operations
  • Using the id field requires temporary persistence
  • query_params may no longer be available
  • The Remix template doesn’t appear to support multiple webhook registrations for the same topic

Proposed Solution:
Developers suggest Shopify should add an optional developer-defined type field to bulkOperationRunQuery/Mutation APIs, which would be included in webhook payloads for easier differentiation via switch statements.

Status: Unresolved; seeking cleaner implementation patterns.

Summarized with AI on October 31. AI used: claude-sonnet-4-5-20250929.

Hello,

What is the best practice if I have multiple process of my app needing to subscribe to a single topic within the same app. The topic in question is bulk_operations/finish

let’s say I have:

  • process A who uses bulk query with different query parameters

  • process B who also uses bulk query with different query parameters

Is it best practice to just have a single webhook that subscribe and receive all webhook for that topic from Shopify? Or should I register different webhook endpoints for process A and B (this means both endpoints will receive webhook from Shopify?)

If I have a single web hook that receives all the finish query, how can I differentiate between process A and B queries? I just want to know if I just have to do the differentiation myself or if Shopify provides one.

1 Like

Thank you so much for the quick response Peter!

For the single webhook endpoint, Shopify hits this webhook endpoint and provides the payload, how can I have an identifying information? Is there docs you can share? This is actually what I am trying to see if its all possible.

Hello @ells-t ,

This is Gina from flareAI app helping Shopify merchants get $6Million+ in sales from Google Search, on autopilot.

If there is a need for multiple processes within a single application to subscribe to a common topic, like “bulk_operations/finish,” there are a few possible approaches you can consider.

→ Single webhook endpoint

Instead of having multiple webhook endpoints, you can utilize a single webhook endpoint that subscribes to the “bulk_operations/finish” topic. By doing so, all webhook notifications related to that topic will be received by this endpoint. To distinguish between process A and process B queries, you will need to examine the payload or relevant information within your app logic. By analyzing the received data, you can determine which process the webhook is associated with.

→ Multiple webhook endpoints

Another approach is to register separate webhook endpoints for process A and process B. Each endpoint will independently receive webhook notifications. You can set up one endpoint for process A and another for process B, both subscribing to the “bulk_operations/finish” topic. With this approach, the differentiation is handled at the endpoint level. Each endpoint is dedicated to a specific process, making it easier to manage and keep the logic separate.

The optimal approach depends on your specific requirements. If distinguishing between queries from process A and process B is necessary, it is recommended to register separate webhook endpoints. This allows you to handle the webhooks independently and take distinct actions based on the query source.

If differentiation is not required, employing a single webhook endpoint simplifies your code and facilitates management. However, you must devise a method to differentiate between queries within the webhook payload, as Shopify does not offer built-in functionality for this purpose. The responsibility for distinguishing between process A and process B queries lies with your application. You would need to analyze the data received in the webhook payload, such as query parameters or any other relevant information, to determine which process the webhook pertains to.

Consider the following techniques for distinguishing between queries in the webhook payload.

  • Utilize the ‘id’ field in the webhook payload, which is unique for each bulk operation. You can leverage this identifier to determine the originating process.

  • Inspect the ‘query_params’ field in the webhook payload, which contains the query parameters employed in the bulk operation. This information can help identify the process responsible for the query.

  • Combine both the ‘id’ and ‘query_params’ fields for the most accurate differentiation between queries. This approach provides a comprehensive means of identifying the query source.

The choice between a single webhook endpoint or multiple endpoints depends on your app’s specific requirements and how you prefer to organize and manage the webhook processing logic within your app.

I hope this information proves useful.

Gina

Regarding the suggestions:

  • How do you register multiple BULK_OPERATIONS_FINISH webhook endpoints? I don’t see a way to do this, at least in the remix template.

  • Examining the data to differentiate different bulk operations is probably doable in most circumstances, but is an ugly work-around.

  • Using ‘id’ as a workaround would require persisting it somewhere temporarily.

  • ‘query_params’ has apparently been removed.

Has anyone solved this in a more straightforward manner?

Shopify should add an optional developer-defined ‘type’ input field to the ‘bulkOperationRunQuery/Mutation’ apis, that is passed along and included in the BULK_OPERATIONS_FINISH webhook’s payload.

The ‘type’ could be set to different values, that could then be differentiated within the BULK_OPERATIONS_FINISH webhook endpoint via a switch statement.