WhatsApp menu
A customer who writes to the business number, +91 95419 10494, gets a list of options and can find a departure, send a booking enquiry, see their booking, pay the balance, send their travellers' passports and photos, or reach the office. Rules: COMM-030 … COMM-036. Switching it on and what staff see: WhatsApp Cloud API → The WhatsApp menu.
It is off until an administrator switches it on in Admin → Integrations → WhatsApp → WhatsApp menu. While it is off, every message waits for a person, as before. Writing "sign up" starts the sign-up form whether the menu is on or off (TRV-017).
Code: supabase/functions/whatsapp-webhook/menu.ts (the conversation),
menuText.ts (every word below), menuDeps.ts (the database, Meta, the Drive),
media.ts (files); the public page src/pages/pay/PayLink.tsx; the admin card
src/components/admin/WhatsAppMenuCard.tsx. Change a text here and in menuText.ts
together.
When the menu answers
| The customer writes | The menu |
|---|---|
| hi, hello, salam, menu, 0, or anything that is not an answer to its last question | sends the menu |
| a number (1 … 7) right after the menu | chooses that option |
| an answer to the question it just asked | goes on |
| a wrong answer to a question (lots for "how many adults") | "Sorry, I didn't get that." and asks again |
| nothing for 30 minutes | forgets the question; the next message gets the menu |
It does not answer — the message goes to the office as before — for STOP / START, "sign up", a reaction, a number blocked in the inbox, a business partner's number, a conversation handed to the office, or a photo or file it did not ask for.
The menu
An interactive list. Header Alhuda Travels. Button See options. Footer Type menu at any time to come back here.
Assalamu alaikum! Welcome to Alhuda Travels. How can we help you today?
| Option | Under it |
|---|---|
| Groups available | Departures open for booking |
| Booking enquiry | Ask us to book a trip for you |
| My booking status | Your bookings with us |
| Pay balance | Payment link or bank details |
| Documents needed | Send passports and photos |
| Talk to the office | A member of our team replies here |
| Sign up (only when the number has no account) | Make your Alhuda account |
Groups available
Up to ten departures on sale: active, not cancelled, completed, departed or marked full, departing today or later, with a seat left — the website's rules, less full ones. Each row: the name, and "05/12/2026–20/12/2026 · from ₹1,25,000 · 12 seats left" (from = the published adult price). Body: "Departures open for booking. Tap See groups to choose one."
Tapping one shows:
Umrah December 2026 05/12/2026 – 20/12/2026 (15 nights) Seats left: 12
(the poster's tagline)
Programme: Makkah 8 nights, Madinah 7 nights Includes: Visa, Flights, Hotels
Price per person: Adult ₹1,25,000 Child ₹95,000 Infant ₹25,000
The programme is the hotels allocated to the departure, or else the day plan's titles; the inclusions and tagline only where the office chose to show them on the website poster. Buttons: I'm interested (starts an enquiry for this departure) · Other groups · Back to menu.
No departure on sale: "No departures are open for booking right now. Choose Booking enquiry and our team will tell you when one opens."
Booking enquiry
An enquiry for sales — never a booking, a seat or a payment (COMM-032).
| Question | How it is answered |
|---|---|
| Which departure is your enquiry for? | a list of up to nine departures and Not sure yet (skipped after I'm interested) |
| What kind of trip are you looking for? (only after Not sure yet) | Umrah, Hajj, Umrah with Ziyarat, Ziyarat, Tour within India, Tour abroad, Not sure / other |
| How many adults (12 years and above)? | 1 … 10 from the list, or typed |
| How many children (2 to 11 years)? | 0 … 9, or typed |
| How many infants (under 2 years)? | 0, 1, 2 buttons, or typed |
| Which month would you like to travel? | the next nine months and Not sure yet, or typed |
| Please type your full name. | only when the number has no single customer record |
Then: "Thank you — our team will call you on this number."
The answers become a lead with source WhatsApp in Leads and a WhatsApp enquiry in the Work inbox: the name, the number, the trip type, the group size, the month, the departure, and a message such as "Enquiry from the WhatsApp menu. Group: Umrah Winter (UMR-…, departs 05/12/2026). Adults 2, children 1, infants 0. Month: December 2026." No customer record is made (LC-006).
A fourth enquiry from one number in a day: "We already have three enquiries from this number today. Our team will call you. To add something, choose Talk to the office."
My booking status, Pay balance, Documents needed: who sees what
The number WhatsApp delivered the message from decides (COMM-031): the live bookings where it is the customer's phone, the payer's phone, or a live traveller's own phone.
| The number | The customer is told |
|---|---|
| reaches no live booking | "We could not find a booking for this WhatsApp number. If you booked with another number, choose Talk to the office." |
| is on more than one customer's records or bookings | "This number is on more than one customer's bookings, so we can't show bookings here. Please choose Talk to the office." |
| is a business partner's (the agency's or a contact's) | "This number belongs to an Alhuda business partner. For bookings, payments and documents please use the partner app or portal: https://alhudatravels.in/partner/auth — Our office will also read your message here." (once a day; the message goes to the office) |
Several bookings: "Which booking?" with a list (booking number, departure and date).
My booking status
BK-00123 — Umrah December 2026 Departure 05/12/2026 · Return 20/12/2026 Travellers: Zara Test, Omar Test Status: Confirmed — visa in progress Total ₹2,50,000 · Paid ₹1,00,000 · Due ₹1,50,000
Next: Pay the balance of ₹1,50,000 — choose Pay balance.
| Status | When |
|---|---|
| Awaiting approval by our office | the booking waits for the sales manager or finance |
| Being updated by our office | sent back for correction |
| On hold — our office will contact you | on hold |
| Confirmed / Confirmed — visa in progress / Confirmed — visa issued / Confirmed — tickets issued | approved, by how far the visas and tickets have gone |
| Travelling / Completed | after departure / after return |
(some travellers cancelled) is added when part of the booking is cancelled. Money is the price with GST, what was received and what is still due — the booking e-mails' figures — in the booking's currency. Next step: "Our office is checking your booking. You can pay the ₹… now — choose Pay balance." (something agreed is still unpaid) or "Our office is checking your booking. We will message you when it is confirmed.", "Pay the balance of … — choose Pay balance.", "Send the missing documents — choose Documents needed.", "Have a blessed journey." or "Nothing for you to do now." Buttons: Pay balance (when something is due), Documents needed (when something is missing), Back to menu.
Pay balance
BK-00123 — Umrah December 2026 Total ₹2,50,000 · Paid ₹1,00,000 Due: ₹1,50,000
Pay ₹1,50,000 online (UPI, card or net banking). This link works once, for 30 minutes: https://alhudatravels.in/pay/…
Or pay by bank transfer: (the bank details from the setting)
After paying by bank transfer, send a photo of the receipt here. Our accounts team checks it before it shows as paid.
The link is for the agreed due — the price with GST, less what was received and any cancellation credit — whether or not finance has approved the booking yet (FIN-033, owner 01/10/2026). Before approval the message adds, above the link: "Our office is still confirming this booking. You can pay now — the amount is what you agreed to pay." Until 01/10/2026 such a booking got no link ("Online payment opens once our office confirms your booking.").
Instead of the link, when it cannot be given:
| Case | Line |
|---|---|
| Razorpay is not set up | "Online payment isn't available at the moment." |
| The booking is not in rupees | "Online payment is in rupees only." |
| Less than ₹1 is due | "Less than ₹1 is due, so it can't be paid online. Please pay it by bank transfer." |
| Five links in the last hour | "You have asked for several payment links in the last hour. Please use the last one, or try again later." |
| No bank details saved | "For our bank details, choose Talk to the office." |
Nothing due on any booking: "Nothing is due on your bookings. Thank you!"
The payment page (/pay/…, no login) says Pay your booking balance and has one
button, Continue to payment. Opening the page spends nothing; the button spends the
link and opens Razorpay. Closing Razorpay offers Pay ₹… for booking BK-… again without a
new link. A used, expired or replaced link says so and how to get a new one ("write menu
on WhatsApp to Alhuda Travels and choose Pay balance"). After paying: "Thank you — your
payment … has gone through. It shows on your booking once Razorpay confirms it to us."
A bank receipt. For a day after Pay balance, a photo or PDF the customer sends is kept as the payer's Payment receipt (Customer 360 → Files), the office gets a Work item, and the customer is told "Thank you — we have your receipt. Our accounts team will check it and confirm. It is not marked as paid until then."
Documents needed
For a booking still to depart, per live traveller:
| Part | Asked for when |
|---|---|
| passport front page | the passport number or expiry is missing, the passport runs out within six months of return, or the visa has not started |
| passport back page | the visa has not started |
| passport-size photo | the visa has not started |
A part already sent and not rejected is not asked for again. First a summary:
For BK-00123 we still need: • Zara Test: passport front page, passport back page, passport-size photo • Omar Test: passport-size photo
We'll ask for them one by one.
Then one at a time, with buttons Skip this one and Later:
(1 of 4) Send the passport front page of Zara Test — a clear photo or a PDF.
| The customer sends | The menu |
|---|---|
| a photo or a PDF | "Got it ✓. (2 of 4) Send the passport back page of Zara Test …" |
| text, a voice note, a video | "Please send a photo or a PDF of the passport front page of Zara Test, or tap Skip this one." |
| a file over 10 MB | "That file is over 10 MB. Please send a smaller photo or a PDF." |
| skip / Skip this one | the next one |
| later / Later | "OK. Send them any time — type menu and choose Documents needed." |
| the last one | "Got it ✓. That's everything — thank you! Our office will check the documents and tell you if anything needs to be sent again." |
Each file goes to the company Shared Drive under Customers/customers.edit). A rejected part is asked for again.
Nothing is read from the photo and nothing on the traveller changes.
Nothing missing: "We have everything we need from you for now. Thank you!"
Talk to the office
Our office hours are Mon–Sat 10:00–18:00 IST. A member of our team will reply here.
Type menu to go back to the options.
The office hours are the setting. The conversation gets a Work item and is unread in the WhatsApp inbox. From then on the menu stays quiet and every message is the office's, until the customer writes menu, or 30 minutes after a staff reply with the customer quiet too.
Not built
- Any language but English.
- Ordering, booking, holding a seat or taking money in the chat — an enquiry only.
- A partner's bookings — the partner app and portal.
- Reading the passport from the photo (
extract-passportis not run on WhatsApp files). - Other documents (visa forms, tickets) and other menus for staff.
- Messages the menu starts by itself — it only answers.