All postsHospitality

600+ Direct Bookings From a WhatsApp Bot. The Hotel Never Ran an Ad.

You run a small hotel. Someone DMs your Instagram asking if you have a room for next weekend. You see it four hours later, reply, they have already booked...

Garvit Sharma

Garvit Sharma

22 June 2026 · 7 MIN READ

Hospitality

600+ Direct Bookings From a WhatsApp Bot. The Hotel Never Ran an Ad.

webight.com
On this page

You run a small hotel. Someone DMs your Instagram asking if you have a room for next weekend. You see it four hours later, reply, they have already booked on Booking.com because the OTA answered in two seconds and you answered after lunch.

That gap is where your money goes. Not to a competitor down the road. To a 15 to 25 percent commission on a guest who literally messaged you first.

A boutique hotel I worked with crossed 600+ direct bookings through a WhatsApp bot. No ad spend. Not one rupee on Meta or Google. The thing that fixed it was answering fast and owning the conversation, and I want to walk you through exactly how it was built so you can copy it.

The real cost is not the commission

Let me give you the math first because the math is the whole argument.

Say the hotel's average booking is INR 8,400 a night. Through an OTA at 18 percent, that is INR 1,512 gone per booking. On 600 bookings that would have been roughly 9 lakh in commissions. That number is real and it is recurring, every month, forever, as long as the OTA owns the relationship.

But the commission is the small loss. The big loss is the guest.

When someone books through an OTA, the OTA owns the email, the phone number, the review, the next booking. The hotel becomes a room with a number on it. No way to message that guest for their anniversary next year. No way to offer them a returning-guest rate. The platform sits in the middle and rents you your own customer back every single time.

See, that is the part people miss. You are not paying 18 percent for a booking. You are paying 18 percent to never speak to your own guest directly. So we built the opposite. A system where the guest talks to the hotel and only the hotel.

What we actually built

The brief was simple. A guest messages on WhatsApp, asks about availability, gets a real answer in seconds, and walks out the other end with a confirmed booking and a payment link. No human in the loop for the first 90 percent of it.

Three pieces:

  1. WhatsApp Business API as the front door, so the bot lives on the number guests already trust.
  2. n8n as the brain, running the flow logic and talking to everything else.
  3. The hotel's existing booking system (a PMS with a public API) as the source of truth for rooms and rates.

Nothing exotic. The trick was wiring them so a guest never feels the seams.

Here is the shape of the n8n flow.

// n8n Function node: classify the incoming WhatsApp message
// Input: items[0].json.body holds the raw text from the webhook

const text = ($json.body || "").toLowerCase().trim();

const intents = {
  availability: ["room", "available", "vacancy", "book", "stay", "night"],
  price: ["price", "rate", "cost", "how much", "tariff"],
  amenities: ["pool", "wifi", "breakfast", "parking", "pet"],
  human: ["talk to", "call me", "manager", "complaint"]
};

let detected = "fallback";
for (const [intent, keywords] of Object.entries(intents)) {
  if (keywords.some(k => text.includes(k))) {
    detected = intent;
    break;
  }
}

return [{
  json: {
    intent: detected,
    text,
    from: $json.from,
    timestamp: Date.now()
  }
}];

Keyword matching is crude and I kept it on purpose for the first version. It handled most messages and it never hallucinated a room rate, which an LLM left alone will happily do. The natural-language layer came later, sitting on top of this, not replacing it.

When the intent is availability, n8n hits the PMS. Here is the booking-check node, the part that does the actual work.

// n8n HTTP Request node, wrapped in a Function node for clean dates
// Talks to the hotel PMS availability endpoint

const checkIn = $json.checkIn;   // "2026-07-12"
const checkOut = $json.checkOut; // "2026-07-14"

const res = await this.helpers.httpRequest({
  method: "GET",
  url: "https://api.your-pms.com/v1/availability",
  qs: {
    property_id: $env.PMS_PROPERTY_ID,
    arrival: checkIn,
    departure: checkOut,
    guests: $json.guests || 2
  },
  headers: {
    Authorization: `Bearer ${$env.PMS_API_KEY}`
  },
  json: true
});

const rooms = (res.rooms || [])
  .filter(r => r.available > 0)
  .map(r => ({
    name: r.room_type,
    nightly: r.rate_inr,
    total: r.rate_inr * res.nights
  }));

return [{ json: { rooms, nights: res.nights } }];

Then the reply goes back out through the WhatsApp API with the rooms formatted as a clean message and a payment link generated for the chosen room.

// n8n Function node: build the WhatsApp reply payload
const rooms = $json.rooms;

if (!rooms.length) {
  return [{ json: {
    to: $json.from,
    body: "We're fully booked for those dates. Want me to check the day before or after?"
  }}];
}

const lines = rooms.map((r, i) =>
  `${i + 1}. ${r.name}, INR ${r.nightly.toLocaleString("en-IN")}/night (INR ${r.total.toLocaleString("en-IN")} total)`
);

return [{ json: {
  to: $json.from,
  body: `We have these open:\n\n${lines.join("\n")}\n\nReply with the number to hold it. I'll send a secure payment link.`
}}];

That is the core loop. Message in, intent out, PMS checked, rooms back, payment link sent. The whole round trip runs in under three seconds, which is the only number the guest actually feels.

The part that mattered more than the code

The bot was the easy half. The hard half was deciding where the human steps back in.

We set three handoff triggers. One, the human intent fires and a real person gets a notification. Two, any message about a complaint or a cancellation skips the bot entirely. Three, after payment, a human sends the first personal message, so the last thing the guest reads is from a person, not a script.

That third one did the heavy lifting on repeat bookings. The guest pays, then gets a message: "Hi, this is the front desk, your room is locked in, anything you need before you arrive?" From the hotel's own number. Now the relationship exists. The hotel can message that guest next season with a returning rate. No OTA in the middle renting them back their customer.

For example, one guest booked three times in five months through that same thread. On an OTA those would have been three separate strangers, three more commissions. On WhatsApp it was one ongoing conversation that the hotel owned start to finish.

Why this beat ads without spending on ads

The hotel had the demand already. People were messaging. The leak was speed and ownership, not reach.

There is a principle from behavioral work that explains the whole result. People do not abandon a purchase because the price is too high. They abandon it because of friction and waiting. Every second between a question and an answer is a second the guest spends reconsidering. The OTA won on speed, so we took speed back. Two-second replies on the number the guest already had open.

And the second principle is even simpler. We tend to stick with whoever we are already talking to. Once a guest is mid-conversation with the hotel directly, opening a new tab to compare on an OTA feels like extra work. So they do not. The conversation itself is the moat.

That is the entire thing. Answer instantly, keep the chat on your own number, never let a platform sit between you and the person who chose you first.

If you want to build this for your own place

You do not need a developer team. You need the WhatsApp Business API approved, an n8n instance (the self-hosted version is free, a small VPS runs it fine), and a booking system with an API. Most modern PMS platforms have one. If yours does not, that is the first thing to fix, because a booking system you cannot talk to programmatically is a wall, not a tool.

Start with keyword matching like the code above. Ship the ugly version. Watch the real messages guests send for a week, then add the natural-language layer on top once you know the actual questions. Building the smart version first is how you end up with a bot that answers questions nobody asked.

The economics do not care how clever the bot is. A guest who messages you and books with you costs you nothing in commission and stays a guest you can reach again. That is the only metric that compounds.

So look at your own inbox tonight. Count the people who messaged asking about a room and booked somewhere else because you replied late. That number is your commission bill in disguise, and you are paying it by hand every day you wait to fix it.

If you run a hotel, a clinic, a salon, anything where people message before they buy, reply and I'll tell you whether this fits your setup.

WhatsApp automationn8nhotel techdirect bookingsno-code
Next move

We build direct-booking websites for hotels and resorts.

The two people who build it are the two you talk to, and every price is on the page.

Garvit Sharma

Garvit Sharma

Full-stack developer and co-founder of Webight, a two-person web and AI studio in India. He writes these from real client work. More about us.