Trusting webhook delivery as if it were guaranteed
Endpoints go down for deployment, networks fail, vendors have incidents, and retry policies expire. When events stop arriving, everything looks calm: no errors, no queue, just quiet. Always pair events with either a periodic catch up poll or a reconciliation that compares record counts, and alert when a flow that normally receives events has received none for longer than usual for that time of day.
Processing inside the webhook response
Vendors expect a fast acknowledgement, often within a few seconds, and will retry if they do not get one, which means slow processing generates duplicate deliveries and can eventually see your endpoint disabled. Verify the signature, put the message on a queue, respond immediately, and do the real work separately. This one pattern prevents most webhook incidents in production.
Unverified endpoints
A webhook address is reachable by anyone who learns it. Without signature verification, an attacker can post fabricated orders, price changes or cancellations directly into your systems. Verify the signature on every request using the vendor’s secret, reject anything unsigned or stale, restrict by source address where the vendor publishes ranges, and treat the payload as untrusted input regardless. Where payloads carry personal information, remember the Privacy Act 1988 and the Australian Privacy Principles apply to what you log as well as what you store.
Polling that re-reads everything, every time
Requesting the full dataset on a schedule works during testing and collapses as data grows, taking your rate limit with it. Use change tokens or modified since filters, keep a marker of the last successful position, and only fall back to a full read as a deliberate reconciliation on a long interval. If a vendor offers no way to ask for changes, that constraint should shape the design rather than be worked around with brute force.
Out of order updates overwriting good data
An update sent at 10:00 can arrive after one sent at 10:01, particularly after a retry. Without a version number or a modified timestamp comparison, the older value wins and the corruption is silent. Compare before writing, discard stale updates, and log when you do so, because a pattern of stale arrivals usually means something upstream is retrying more than you realised.
No way to backfill after an outage
When a receiver has been down for six hours, you need to recover the changes that were missed, and events that have already expired their retries are gone. The recovery path is a poll over the affected window or a targeted reconciliation, and it should be built and tested before you need it. Discovering during an incident that there is no way to catch up is how a two hour outage becomes a fortnight of data cleanup.