I have an app that uses API to create Webhook for order/paid event. I use Azure function as an end point to receive the webhook. This function adds the message to Service Bus Queue for later processing and returns OK 200.
The problem is, that the same webhook gets called multiple times even if it receives 200 response!
Because of this I get a lot of 429 rate limit exceptions in my Queue processing Azure function.
Why is the same webhook called multiple times when the response is 200?
Solved! Go to the solution
response is fast enough, average around 200ms.
This is draftOrderId, that was send to webhook end point and got called 3 times,
Azure Function response to webhook:
List of 3 identical request to webhook end point with same draftOrderId. Response is 429 because processing of webhook exceeds rate limit, But data is added to Queue and processed by separate function.
My functions always returns 200
Here you can see trace of calls for webhook. It is clear that function "OrderPaid" is executed with response before processing of Queue Worker starts
The draft order ID that you linked to is a saved draft order, and hasn't been turned into an order and marked as paid yet - so it won't trigger an orders/paid webhook. Orders/paid webhooks will only fire when an order resource is paid for, or a draft order is marked as paid which turns it into an order.
I also noticed that you have 59 orders/paid webhooks registered on this shop with different URLs, which would cause several webhooks to be sent. This means that for every order marked as paid on your shop, there would be 59 webhooks being triggered.
In good news, there don't seem to be any errors on our end and we're successfully receiving 200OK responses, but normally you would only register a single orders/paid webhook and send them all to one URL that processes them. If you were to remove all of your webhook subscriptions from this shop and then add one of them back again, I think you'll notice that this stops happening.
thanks for your reply. The flow is like this:
Question is: why are all webhooks triggered at once if they have different url params? We though that with different params only the right Webhook is gonna be called?
How can we change this so webhook gets called only once and we can verify the draftOrder and order relation?
Webhooks won't concern themselves with any URL params to decide when they will be fired or not, only the webhook topic and events that occur on a shop. So if your app and 3 others have all subscribed to orders/paid webhooks, every time an order is paid then a webhook will be sent to each app regardless of the webhook URL.
For your webhook to only be called once, you should remove all of your current webhooks and then replace them with a single webhook subscription.
In terms of tracking the draft/order relation, I'm not seeing a great way to accomplish that unfortunately. You may want to consider adding either a note or a tag to draft orders that you create, those will carry over to the order when it is generated. However, the downside is that they're easily removed by a merchant if they choose to.
thanks for all the help.
We will change the code, so only 1 webhook is created per shop.
I have a favor/request:
could you add data to draftorder.json who created the draft order. Because if I check draft order in shopify admin dashboard at the bottom of the page there is information how the draft order was created. I guess adding information to webhook request body should not be that hard?
@Ufi I had one more thought I wanted to share that might be helpful, but it would also require you to store a history of IDs of draft orders that you've created in the past.
You can tie a draft order to its resulting order once it has been paid for, it's just doing the reverse that is more difficult. Draft orders have an order_id field, so as long as you're storing a history of draft order IDs so you know you have created them, you can at least find out which orders are associated with them (and then store that as well if you want to). Not a perfect fix I know, but I thought it might be useful.
The only way I see to tie an order to its associated draft order is to use the Event API to read the messages from the order timeline such as "You created this order from draft order <a href="https://shop-name.myshopify.com/admin/draft_orders/132504846392">#D288</a>."
I used the "tag" to reference draft-order and order. I also store the draftOrderId in DB, this is why I was sending draftOrderId trough webhook param to check if it was ours draft-order.
Since the code was change no more 429 errors occur and every thing works as it should.
Great that your will add reference to draftorder and order how both where created.
Thanks for all the help!
|an hour ago|
|an hour ago|
|2 hours ago|
|2 hours ago|