'Shopify Order Updated Events Within The Same Timestamp

This question was originally asked in the shopify community, but without any response. So sorry for those of you reading this as duplicate.

We are trying to strengthen our Shopify webhook receiver and reconciliation jobs. The json object below show a list of events from an order we have processed. Examine the created_at timestamps show that 3 events was triggered within the same timestamp. I assume that 3 webhooks are fired on topic orders/updated and the order updated_at timestamp is 2022-04-26T11:10:57+02:00 after the 3 events.

In the case where the first, of the 3, orders/updated hooks fails on our side, and retried by shopify. How can we make sure that we have the latest event, since comparing the order updated_at timestamp would properly be the same for all 3 events?

We are facing a similar issue with our reconciliation job, since we are comparing the order updated_at timestamp. as an example, if we received the first and second hooks from the example sequence below, the reconciliation job would compare updated_at timestamp and skip the rescue! How can we overcome this, without sync all orders in our reconciliation jobs?

We run the reconciliation jobs once a day and sync all orders by that job is not possible within the rate limit of 2 calls/sec for the REST API.

Thanks in advance

Mads

{
  "events": [
    {...},
    {
      "id": 90448362045627,
      "subject_id": 1000,
      "created_at": "2022-04-26T11:10:53+02:00",
      "subject_type": "Order",
      "verb": "fulfillment_success",
      "arguments": [
      ],
      "body": null,
      "message": "CoolRunner fulfilled 1 item ",
      "author": "CoolRunner",
      "description": "CoolRunner fulfilled 1 item ",
      "path": "/admin/orders/1000/fulfillments/3862202974395"
    },
    {
      "id": 90448362275003,
      "subject_id": 1000,
      "created_at": "2022-04-26T11:10:54+02:00",
      "subject_type": "Order",
      "verb": "mail_sent",
      "arguments": [
      ],
      "body": null,
      "message": "CoolRunner sent a shipping confirmation email ",
      "author": "CoolRunner",
      "description": "CoolRunner sent a shipping confirmation email",
      "path": "/admin/orders/1000"
    },
    {
      "id": 90448363258043,
      "subject_id": 1000,
      "created_at": "2022-04-26T11:10:57+02:00",
      "subject_type": "Order",
      "verb": "capture_success",
      "arguments": [
      ],
      "body": null,
      "message": "CoolRunner captured €99.00 EUR using a Mastercard ",
      "author": "CoolRunner",
      "description": "CoolRunner captured €99.00 EUR using a Mastercard ",
      "path": "/admin/orders/1000/transactions/5355897323707"
    },
    {
      "id": 90448363389115,
      "subject_id": 1000,
      "created_at": "2022-04-26T11:10:57+02:00",
      "subject_type": "Order",
      "verb": "payments_charge",
      "arguments": [
      ],
      "body": null,
      "message": "-",
      "author": "CoolRunner",
      "description": "-",
      "path": "/admin/orders/1000"
    },
    {
      "id": 90448363421883,
      "subject_id": 1000,
      "created_at": "2022-04-26T11:10:57+02:00",
      "subject_type": "Order",
      "verb": "closed",
      "arguments": [],
      "body": null,
      "message": "This order was archived.",
      "author": "Shopify",
      "description": "This order was archived.",
      "path": "/admin/orders/1000"
    }
  ]
}


Solution 1:[1]

Not sue I understand your problem, but you have to understand, if you choose to function via handling webhooks, things like temporal ordering go out the window. You have to code for that. You will never have a guarantee that any one webhook will arrive in any kind of order. So you just process them and move on.

So if an order undergoes three updates, 1, 2, and 3, you might receive webhook notifications in the order 3,2,1 or 1,3,2, or 2,3,1 or 1,2,3 or 3,1,2 etc.

So you have exposed two problems. One, you are somehow thinking webhooks are a source of temporal truth and two, you are painting yourself into a corner by not doing your API coding to respect API limits.

My advice to you is to accept webhooks when they arrive, process them, and improve your code so API limits are not holding you back.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Ruben Helsloot