A channel manager pushes inventory to every OTA you sell through. The integration is a loop that sends updates when something changes. It works, until an update fails silently and one channel keeps selling rooms you no longer have.
Push is not state
The failure mode is that push-based sync treats a message as if it were the truth. You sent “4 remaining” and assumed it landed. If it did not — a timeout, a rate limit, a malformed payload rejected on their side — your system believes the channel knows something it does not.
Nobody notices, because nothing errors. You find out when two guests arrive for one room.
Store what you believe they know
Keep a row per channel per date recording the last value you successfully pushed and when it was acknowledged:
channel_state
channel
room_type
stay_date
pushed_availability
pushed_rate_minor
acked_at
last_error
Now “what does Booking.com think is available on the 14th” is a query, not a guess. And the difference between that and your real inventory is a number you can alarm on.
Pull back and compare
Every OTA worth integrating exposes a way to read your current listing. Poll it on a schedule — hourly is plenty — and compare to pushed_availability. Disagreement means a push was lost, or someone changed it in their extranet by hand, which happens more than anyone admits.
Write the disagreement to an exceptions table rather than auto-correcting it silently. Auto-correction hides a broken integration; an exception queue that is usually empty makes a broken one obvious.
Rate parity is the same problem
Rates drift for exactly the same reason and cost more, because a stale low rate on one channel undercuts every other and nobody sees it until the month-end report. Same mechanism: store what you pushed, poll what they show, alarm on the delta.
The cheap safeguard
If you build nothing else, build a nightly job that compares total availability across channels against physical rooms and shouts when the sum exceeds what exists. It is twenty lines and it catches the failure that actually costs you a guest.