Ably provides guaranteed message ordering over the Ably protocol, but integrations into third party systems are constrained by those systems and the transports they use to communicate. Webhooks message ordering is dependant on whether you are using batched or single-request mode. These options can be selected when setting up your Reactor Integration Rule in your Ably Dashboard:
In batched mode, webhooks are order-preserving, but only for events from the same publisher on the same channel. Messages are ordered within the batch, which means that if a request fails, a subsequent attempt to send the message may also include any additional messages that have accumulated. These subsequent messages will be in the correct ordering within the request body relative to the earlier messages. The batching applies only to publishes that happen from the same region, publishes from other regions will be in a separate, concurrent request. This will not affect the ordering guarantee since it applies on a publisher-by-publisher basis.
In single-request (unbatched) mode there is no ordering guarantee. HTTP requests are sent for each message and concurrent HTTP requests are inherently non-order-preserving; one sent later might arrive before sent earlier. Ably does not wait for each HTTP request to finish before starting the next as this would be very low throughput.
If your server supports HTTP2 you will get the guarantee back (subject to the same constraints as with batched requests) since with HTTP2, requests to the same endpoint for the same rule are pipelined down a single TCP stream, which preserves order.
If the publisher is making REST requests, ordering guarantees don't apply even with batching on for the same reason that there is no ordering for unbatched requests; concurrent HTTP requests made with a socket pool with HTTP1 cannot guarantee order-preservation.