Bookings confirm on your site and the supplier has no record
In short
When a booking confirms on your site and the supplier has no record of it, the confirmation came from the script's own checkout rather than from a supplier booking response. Prove it in one timed comparison: query the supplier directly for the same property, date and occupancy within 60 seconds of what the script shows, then check whether a supplier reference was stored.
Key takeaways
- A confirmation email is evidence that your checkout completed, and evidence of nothing else at all.
- The distinguishing artefact is a supplier-issued reference stored on the booking; an empty field means no booking call ever succeeded.
- Run the comparison inside 60 seconds on 1 property, 1 date and 1 occupancy; slower cannot separate a stale cache from a sell-out.
- Sandbox credentials fail in a recognisable way: every date is available, including dates any live supplier would have closed.
- Patch, wrap or replace turns on one fact: whether the supplier credentials are held in your own name.
The confirmation your customer received was written by the script's checkout, not by a supplier. In a booking flow that works, the commit step calls the supplier over its API, waits for a response carrying a supplier-side reference, stores that reference, and only then emails the customer. In the flow you have, at least one of those 4 steps is missing, so checkout reaches its success page whether or not anybody upstream agreed to hold a room.
That narrows the investigation before you open a support ticket. Five things produce this symptom, and the check that separates them takes about an hour. Do not open with the script vendor: their first answer is that the supplier declined, and you cannot argue with that until you know whether a supplier call happened at all.
The check that settles it: a timed three-way comparison
Compare 3 things at one moment: what the script shows, what the supplier extranet shows, and what your database stores after a booking. Same property, date, occupancy and rate plan — anything looser and both sides can be honestly different.
- Pick 1 property you sell often and 1 arrival date 30 to 45 days out — close enough that inventory is moving, far enough that you are not testing a sold-out night.
- Load availability in the supplier extranet for that exact property, date and occupancy. Note the time to the minute, in UTC if the two systems disagree about timezone.
- Within 60 seconds, run the same search through your own site as a customer would, and record what it shows: sellable or not, and at what price.
- Repeat both on a date the supplier has closed. This is the informative half — a script serving a cached copy will sell you a night the supplier stopped selling hours ago.
- Take 1 real booking on a refundable line, then read the row your database wrote. Find the field meant to hold the supplier reference and read its value.
- Check the supplier extranet for that booking. Present, absent, or present with a non-confirmed status are 3 different diagnoses.
- Write down 4 facts: search agreed or not, closed-date behaviour, reference stored or empty, supplier-side record present or not. Those 4 identify the cause.
Five causes, in the order they usually turn out to be the one
| Cause | What the check shows | Confirming evidence | Who can fix it |
|---|---|---|---|
| Availability cached, no recheck at commit | Script sells a date the supplier has closed; reference field empty or locally generated | The closed date stays sellable for the length of the cache TTL, then corrects itself | The script vendor, or you in a wrapper |
| Sandbox or demo credentials still live | Everything available, always, including impossible dates | The credential in config is not the one the supplier issued for production | You, with the supplier account manager |
| Mapping row points at a retired product code | Search returns a result; commit fails or confirms the wrong room type | The supplier's current product list does not contain the code you send | You, in your own mapping table |
| Booking write never wired | Reference field empty on every booking ever taken | No outbound commit request in any log at the booking timestamp | The script vendor, or a rebuilt commit step |
| Component was on-request, displayed as confirmed | Supplier holds a record, with a status that is not confirmed | The supplier record exists and reads pending, waitlisted or equivalent | You, in how status is displayed and sold |
Only the last row leaves a booking the supplier knows about. The other 4 end with a PDF voucher for a trip nobody upstream agreed to run.
Cached availability with nothing rechecking it at commit
Caching is not the defect. Every serious booking system caches, because search traffic runs 1 or 2 orders of magnitude above booking traffic. The defect is caching with no mandatory live recheck between the customer choosing and the money moving.
The arithmetic is unforgiving. With a TTL of 30 minutes, a room that sells out at minute 2 stays on sale for the following 28. Stretch the TTL to 6 hours to keep supplier load down and your shop is on average 3 hours out of date on the one fact that matters. The defensible range is a decision rather than a default, worked through in how long a cached availability answer stays true.
- Look for the recheck. Between basket and charge there should be exactly 1 call that re-prices and re-verifies the selection, as in putting a price recheck between basket and charge. If it is not in a log, it does not exist.
- Look for the token. Most supplier APIs return an opaque key with the availability response that must be presented at booking and expires in minutes — see the rate key as an opaque token with a countdown.
- Check the stale-token path. An expired key should produce a visible re-quote rather than a silent success, which is the failure traced in booking fails on an expired token mid-checkout.
- Check invalidation. A cache with a timer but nothing invalidating it on your own bookings will resell your last room.
A test credential that was never swapped for a live one
This one is common and has a signature you cannot miss: everything is available. Every property, every date, every occupancy, including dates a real supplier closed months ago. Test environments exist to return sellable results so integrators can exercise a flow, so a portal pointed at one behaves like a shop with infinite stock.
- Read the configuration, not the admin screen. A white-label build usually has 1 environment flag, and the panel shows a friendly label rather than the credential in use.
- Establish whose account it sits in. If the credential belongs to the script vendor, your commercial terms and your ability to leave belong to them too — see whose name the supplier credentials sit in.
- Expect live to behave nothing like test, as in it passed in test and live returns nothing sellable.
The mapping table points at something the supplier retired
Between your product and the supplier's sits a translation table: your identifier for a property or room type against theirs. Suppliers change their side — properties get renamed, rebranded, re-contracted under a new code — and nobody notifies you, because from their side nothing broke.
The tell is asymmetric: search works, commit fails, or commit succeeds against the wrong room type. Search commonly runs against a static content file refreshed on its own schedule while booking runs against live product codes, so the 2 halves of one integration drift apart unnoticed. A single property routinely carries several identifiers across supplier, content provider, mapping layer and your own database, which is the subject of hotel mapping and the five ids one property has. Fixing 1 row without fixing the reconciliation job buys you a week.
The booking write that was never wired at all
Some readymade portals ship a complete search and checkout experience over a booking step left as an exercise. The customer journey is real; the commit is a database insert and an email template. One query finds it: count bookings where the supplier reference is empty. If that equals every booking you have taken, you have a shop front, not an integration.
A near neighbour is worse because it looks like it works. Where the commit call is made but the response is discarded, or an HTTP timeout is treated as a failure and retried, you end up holding 2 supplier reservations for one customer or none for another — the outcomes traced in the book call timed out and nobody knows the outcome. Underneath all of it is the question of which system is permitted to declare a booking confirmed, and on a white-label script the honest answer is often that none of them holds that authority. That is defined in the reservation system of record, and it has to be settled before any repair means anything.
A booking is not confirmed because your database says so. It is confirmed because a supplier issued a reference and you stored it.
Patch, wrap or replace
Work down this list and stop at the first branch that matches. The question underneath all of them is whether you can reach the supplier account on credentials you own, because that fact decides how much of the script you still need.
- Sandbox credentials, or a mapping row pointing at a retired code, and the supplier account is yours. Patch: swap the credential, rebuild the mapping table, add a nightly reconciliation against the supplier's product list.
- Search and pricing are broadly right, the commit path is untrustworthy, and you can reach the supplier directly. Wrap: keep the script as a shop front and move the recheck and the booking write into a small service you own. That shape is most of our internal tools and operations work, and it is the cheapest honest fix.
- The credential belongs to the vendor and they will not transfer it. Replace the connection first, deciding direct or intermediary with aggregator versus direct connections to supply.
- The commit was never wired and the vendor cannot show you a booking log. Replace: there is nothing to repair, and every further month of selling is another month of confirmations you cannot honour.
- You are replacing with departures already on the books. Stage it against the booking curve rather than a calendar date, as in cutting over between seasons without losing departures, and model what you hold first, the way a DMC's eleven spreadsheets get sorted into one system.
Whichever branch you land on, add 1 instrument this week: a daily count of bookings taken against bookings carrying a supplier reference. When those diverge you know within a day, not when a traveller arrives at a property that has never heard of them. The silo sits under build, buy or replatform; the wider view is in our travel and tourism work.
Frequently asked questions
Short answers to the follow-ups this page tends to raise.
How do I tell whether a booking script is reading live availability or a cached copy?
Ask it to sell you a date the supplier has closed. A live read returns nothing; a cached read offers the room and keeps offering it until the TTL expires. Run the comparison inside 60 seconds against the supplier extranet, on 1 property, 1 date and 1 occupancy.
Does a confirmation email mean the supplier accepted the booking?
No. A confirmation email proves your checkout reached its success page. Whether a supplier accepted anything is recorded in exactly one place: a supplier-issued reference stored against the booking. If that field is empty, or holds a value your own system generated, the customer is holding a document with no backing.
Should I switch off the site while I investigate?
Switch off the affected supplier connection rather than the whole site, and only if recent bookings show an empty supplier reference. That state means you are selling inventory nobody is holding, and every further sale is another customer to unwind. Where the reference exists and only the status is wrong, the problem is display rather than a reason to stop trading.
Can these problems be fixed without leaving the white-label platform?
Often yes, provided the supplier credentials are held in your own name. Credentials you own let you move the recheck and the booking write into a service you control while the script keeps doing search and presentation. Where they sit with the vendor, no wrapper can be built around a connection you are not party to.
- booking engines
- supplier connectivity
- availability caching
- diagnostics
The work behind this page
Builds from our portfolio that this page draws on.
QuoteForge
An AI CPQ and proposal platform that builds enterprise quotes from your catalog, guards every discount against the margin floor, routes approvals, and generates the proposal.
Sales AIAxlebound
Real-time fleet tracking and dispatching platform with full visibility over every vehicle, driver, and route.
LogisticsRead next
- The reservation system of record: which system may change a bookingThe system of record is not the prettiest system or the one everyone logs into. It is the single system permitted to change a booking's state, and there can only be one.definition
- Enquiry-to-booking conversion: the metric that lies at six monthsGroup enquiries by the month they arrived and follow them until they close. The calendar-month ratio moves when volume moves, so a growing month looks like a bad one.definition
Working on something in this space?
Tell us where you are in a sentence or two. We'll tell you honestly whether we're the right team, and what a sensible first slice of the work looks like.
Start the conversation