Your Reviews, On Every Surface You Own
Four years of five stars, working for someone else
You have spent years earning reviews. Early check-ins, replaced kettles, the taxi you arranged at 4am. And almost all of that goodwill sits on a channel’s website, where it does an excellent job of convincing people to book — through the channel, at the channel’s commission.
On your own site, where a booking costs you nothing, a visitor sees a gallery and a price and has no idea whether anyone has ever stayed.
We made the case for fixing this back in Your Reviews Are Your Most Underused Asset. What we didn’t have then was reviews that actually arrived on their own. This is the post where that became true.
Two routes in, neither of which is typing
The first is your inbox. When a guest leaves you a review, the channel emails you about it. That email is already flowing through Airflow if you’ve connected your mailbox — the same pipeline that turns booking confirmations into bookings. It now recognises review notifications, extracts the reviewer, the rating and the text, and files the review against the right property.
The second is a scheduled pull from your Google Business Profile, on a fixed day each month, with a paid “check now” if you don’t want to wait.
The first review ever ingested arrived on a real account and by the end of that day there were 26 of them, with dates spanning two years. Not typed in. Read out of emails that had been sitting in an inbox the whole time.
Why it had never worked before
This feature’s page in our own records said “future, mechanism to be decided, zero rows”. That was wrong on every count. The pipeline had been built and running since May. It had simply never produced a single review, because of four independent defects, each of which was individually fatal.
The model’s answer was being thrown away — the code read the wrong field from the response, fell through to an empty default which was valid JSON, so no error ever fired, and the review was constructed with no name, no rating and no text while looking perfectly healthy. A step that checked for duplicates returned an empty result when there was no duplicate, and an empty result ends that branch — so only an actual duplicate could reach the insert. A required field was being read from somewhere that had never been populated. And the source was hardcoded to one channel in two separate places.
Fix any one of those and you still get nothing. All four were found and fixed in a single sitting.
The lesson we took from it, and now apply generally: do not trust an old status label over the database. The page said “no mechanism”. The database said “zero rows”. Both were true, and both were misleading — the mechanism existed and was broken.
The decisions we’d make again
Getting reviews into a database is easy. Getting them onto a public page without embarrassing anybody turned out to need several judgement calls.
Pending reviews were public, and shouldn’t have been. The booking page was fetching both published and pending reviews and counting them in the headline rating. Anything awaiting your moderation was already live and already moving your average. Narrowed to published only, in the page and in the database permissions both.
We never import the private note. Some channels include a private “note from the guest” section alongside the public review. One of the real ones we looked at was a complaint about noisy neighbours. Published on the host’s own website, it would have been actively harmful. That section is never imported.
A channel’s email is a snapshot, not the review. We proved this against a stored email: the second half of one review appears in neither the plain-text nor the HTML body. The email simply truncates. So imported reviews are flagged Partial until you paste the full text, and the flag is derived from the facts rather than stored — which meant when we discovered a second source truncates with an ellipsis, the same flag covered it with no migration.
How a review arrived is recorded. Without that, a review you typed in yourself claiming to be from a channel is indistinguishable from one the channel actually sent. On the first real account: 22 imported versus 4 typed, identical on the public page until we recorded the difference. Now verified reviews carry a badge and host-entered ones say so.
And then it goes everywhere
Collecting reviews is half of it. The other half shipped the same week: reviews now render wherever your booking widget renders.
The mode lives in the URL, which makes three products out of one embed snippet:
| Parameter | What you get |
|---|---|
widget=1 |
Booking widget only — exactly as before, existing embeds unchanged |
widget=tabs |
Booking widget with a Reviews tab beside Reservations |
widget=reviews |
A reviews-only strip, with a link back to booking |
Because the mode is in the URL rather than a per-property setting, you can put both on one page — bookings in a sidebar, reviews in a footer. A single mode switch would have forbidden that.
There’s also a one-toggle option that adds the Reviews tab to every existing embed without you re-pasting anything anywhere, and an optional /reviews page on your Airflow site, with per-property sections if you have several.
Two design decisions worth stating. Reservations stays the default tab and reviews load only when clicked, so the booking path pays nothing for a feature the visitor may not use. And if you don’t have the Reviews add-on, the tab is hidden entirely — no teaser, no upgrade prompt. Upsell noise inside a guest-facing booking widget advertises to the wrong audience and costs you the booking. Selling happens in your portal, never in someone’s checkout.
The reviews-only strip also works in accounting-only mode. If you kept your own website and your own channels and have no Airflow booking page at all, you can still put your Airflow reviews on your site.
What isn’t true yet
Google’s review API is not available to us. We established this properly rather than assuming: the version of the API that returns reviews and owner replies cannot be enabled for our project, and the allowlist process rejects it because the project is already allowlisted — for a different family of APIs that has never included reviews. The working path returns at most five reviews and no owner replies. We still attempt the better API first, so if access is ever granted it upgrades with no deployment.
There’s no automatic first pull when you connect a business profile. Reviews wait for the monthly run or a manual check.
Owner responses are live in the portal — one response per review, editable — but a response you write can’t be pushed back to the channel it came from.
For the practical version — what each platform’s terms allow, where to place reviews on your site, and the four pitfalls that cause trouble — see How to Show Your Airbnb and Google Reviews on Your Own Website.
If reviews are what stands between a visitor and a direct booking, that’s the gap worth closing first. Your Own Booking Engine, For Free covers the page they’d land on, and Go Live on Your Own Terms covers where to put the embed. Or start with what Airflow does.