How the platform works
Read the first two sections once to get the mental model. After that, use the sidebar — or the search box below — to jump to whatever you're doing right now. Every feature says what it does and when to use it.
The big picture
A trip lives in one record its whole life. What you see and what the client sees changes automatically based on where the trip is in its journey.
The single most important rule in V2.7:
- The trip is Confirmed.
- The plan hard-locks (rates, items and cancellation policies freeze).
- The trip appears in Vouchers Studio as a job, ready to ticket.
You never press a "convert to booking" button. Payment is the switch.
Two studios, one link
V2.7 split the old single builder into two focused apps. They share the same trip and the same client link.
✍️ Proposals Studio design
Where you design and sell: build the itinerary, set net & sell rates, cancellation policies, methods of payment, and the payment schedule. This is the commercial contract.
🎫 Vouchers Studio fulfil
Where you deliver once a trip is confirmed: issue tickets, confirm hotels, arrange transfers & VIP meet-and-greet, and track every booking to done.
1 · Proposals Studio
Design the trip and set the commercial terms. Everything here is fully editable — until a payment locks it (see §3).
Core features
🧩 Build line items
Pick a type, fill the details, set a net (your cost) and sell (client price). Flights accept a pasted GDS/PNR (Amadeus, Sabre, Galileo) and build segments instantly. Hotels support multiple rooms, and an AI look-up fills name, address and photos.
Example: paste a Galileo entry → the KWI→MLE Qatar Airways segment, logo and dates fill automatically; you type the Business-class sell of KWD 1,800.
🛑 Cancellation policy (per item)
Each item (and each hotel room) carries its own cancellation policy: Free until a date, Non-refundable, or a custom penalty. The client-facing summary is built automatically from these. Use 🛑 Apply default policy to all to stamp one policy across every item.
💳 Payment schedule
Add installments (e.g. Deposit 40% = KWD 1,380, Balance 60% = KWD 2,070). Each installment gets a KNET / card payment link you can copy or send by WhatsApp. The schedule shows whether it matches the trip total.
📊 Proposal status
A simple dropdown: Draft → Shared with Client → Approved by Client (or Declined / Revision Requested). Once Approved, the client portal link and payment schedule unlock so the client can pay.
👥 Group trips & 💾 versions
Toggle Group Trip to split invoices and give each traveller their own portal. Every save is version-stamped, so you can review or restore earlier drafts from Version History.
Hotel room assignment: tick the guests staying in each room — the room's sell rate divides equally among them automatically (one guest alone carries the full room cost). A guest already placed in one room shows greyed-out in the hotel's other rooms, so nobody can be double-booked. You can still type over any amount if one person pays more or less.
2 · Getting paid & confirming
This is the hinge of the whole system. A trip is confirmed by payment, not by a status click.
Two ways a payment gets recorded
🌐 Client pays online
The payment posts back automatically. The installment flips to Paid and the trip confirms — no action needed from you.
💵 You record it offline
In the Payment Schedule, press 💵 Record Payment (ad-hoc amount) or ✓ Received on an existing installment. Enter the amount + method (bank / cash / cheque). Done.
3 · The plan lock
Once money is in, the agreed plan is protected. This prevents accidental (or unauthorised) changes to a trip the client has already paid on.
| Locked (frozen) | Stays editable |
|---|---|
| Line items (add / edit / delete) | Recording further payments |
| Net & sell rates | Proposal status |
| Cancellation policies | Generating / sharing the portal link |
| Trip dates, package, travellers | Everything in Vouchers Studio |
Changing a locked plan — the approval flow
Sometimes a confirmed trip genuinely needs to change (client wants an extra night, a room upgrade). That requires top-management approval:
4 · Vouchers Studio
Where confirmed trips get delivered. Every confirmed trip lands here automatically as a job — no manual import.
Core features
⚡ Auto-activation
The trip becomes a job here with its flights and hotels (dates, room type and all) already imported from the proposal. You just add the real-world confirmation details.
🎫 Import GDS Ticket PDF
On a job, click 🎫 Import Ticket PDF and upload the GDS "Travelling Itinerary" PDF. It's read right in your browser (no upload to any server) and auto-fills PNR / Galileo reference, ticket numbers, seats and baggage for every passenger — you review a summary first, then apply it to the flight cards.
Example: a 3-passenger Kuwait Airways PDF → Galileo H351LZ, tickets …104/105/106, seats 43A/B/C, baggage 2PC, all filled in one click.
✈ Flight ticketing — staged
Each flight walks through three stages: 1) Ticket issued (PNR, seat, e-ticket number, baggage) → 2) Schedule check (status confirmed, no changes) → 3) Pre-departure (on-time, gate, client reminded). The badge shows Stage 1/3, 2/3, 3/3.
🏨 Hotel confirmation checklist
Eight items per hotel: 1) Hotel confirmation number received (HCN), 2) Elite Trip letter sent to the hotel — placed in the room before the client arrives, 3) Early check-in status, 4) Honeymoon / celebration amenities status, 5) City / tourism taxes covered — client pays nothing at the hotel, 6) Booking source & actual cost NOT to be disclosed — hotel keeps our rate confidential, 7) Final check done — 1 day before arrival, 8) Late check-out status.
Items 3, 4 and 8 aren't yes/no — each has a status dropdown: Requested → Confirmed / Unavailable / Upon check-in. Any recorded status counts toward the hotel's 0/8 progress badge, but only a resolved one shows as done. The client's portal shows the hotel as confirmed as soon as the HCN box is ticked.
✉ Guest Welcome Letter (AI-written, in-room)
Under the "Elite Trip Letter Sent to Hotel" row, click ✉ Write Welcome Letter. The system pre-fills who it's addressed to (e.g. Mr. & Mrs. Alfares, or Mr. Aljassar & Family for group trips) and detects the occasion (Honeymoon, Family Holiday, Anniversary, Birthday, Babymoon…) from the package — both editable. Add an optional personal touch ("mention the infinity pool", "they love diving"), then click ✨ Generate with AI: it writes a short, warm letter in the Elite Trip voice that understands the hotel and its destination — the private-island sea in the Seychelles, the skyline in Doha, Mallorca's beaches — never prices, sources or invented facilities.
Edit the text freely, 💾 Save Draft (it syncs with the job), and 🖨 Preview / Save PDF opens the letter on an elegant one-page Elite Trip letterhead — gold logo, hotel name, "Dear …" and the Elite Trip Team signature added automatically. Print it or save the PDF and email it to the hotel, then tick the checklist item once sent.
🔍 Verify Venue on Google (activities)
On any activity card, click 🔍 Verify Venue on Google. Search the venue name (add the city for a better match, e.g. "Nobu Dubai") — Google returns its real name, address, phone, rating and a photo. Review the match, then ✓ Use This Venue. ↻ searches again, ✕ removes the verified details.
Once verified, the venue appears — with photo, clickable address (opens Google Maps) and a tappable phone number — under Confirmed For You on the client's Concierge tab. The client sees the real place, not just whatever was typed.
🖨 Generate Voucher (client-facing PDF)
The 🖨 Generate Voucher button at the top of any job builds a branded Travel Voucher from whatever is confirmed: flights with PNR / e-ticket numbers / seats / baggage, hotels with confirmation number, board and any confirmed early check-in / late check-out / amenities (plus a "city taxes covered" note), transfers with driver & meeting point, experiences and extras. Empty fields are skipped automatically.
Use ⎙ Print / Save as PDF in the preview to print it or save a PDF to attach anywhere. The voucher never shows prices, net costs, vendors or fees — it is safe to hand to the client or a hotel as-is.
🚌 Transfers · 🎁 VIP Meet & Greet · 🌐 Entry requirements · + Extras
Add transfers, VIP airport meet-and-greet, visa/entry requirements, and any extras — each with its own supplier, reference and status. Add them even if they weren't line items on the original proposal.
🔔 Reminders & departing-soon
The dashboard surfaces Action Required Now, Departing in 7 days, and reminders due, so nothing slips before a ticketing deadline or departure.
💰 Costs & Margin (actual net, any currency, real fees)
A panel on every job with one line per booking, pre-filled from the proposal (net and vendor/source), so you never re-enter what you already set. Each line has:
1 · Vendor / Source — where the service was booked (GDS, Bedsonline, direct…), carried from the proposal and editable.
2 · Actual net — the amount you paid the supplier, in the currency you actually paid (KWD, USD, EUR, THB…).
3 · KWD charged (bank) — for foreign currencies, just copy the KWD figure from your bank/card statement. You never enter an FX rate — the implied rate is calculated and shown automatically (e.g. 1 USD = 0.30851 KWD). Until the payment clears, the line shows the proposal's estimate (imported jobs) or a "waiting for the KWD amount" flag.
4 · Fees — any transaction cost on top: a card/gateway % and/or a flat KWD fee (bank transfer charge).
5 · = KWD (incl. fees) — computed automatically; this is the true cost Finance records.
The panel totals everything live — Actual net (incl. fees called out separately) and margin (sell − net). It all syncs to Finance, where the invoice shows each line's exact conversion — e.g. "USD 6,500 @ 0.30851 + 1.5% card fee" — and the profit line states total transaction fees. The accountant never re-keys or guesses a rate.
Example: paid a hotel USD 6,500; statement shows KWD 2,005.300; card fee 1.5% → true cost KWD 2,035.380, rate 0.30851 recorded automatically.
👤 Assigning an agent — one click, they get notified
Open the job's Edit popup, pick the agent from Assigned Agents (the list comes from People & Culture), write any handover in Notes, and press 💾 Save Job & Assignment — one click saves both together and shows a ✓ Saved confirmation. The newly-assigned agent instantly receives an email + WhatsApp with a link straight to the booking. (You're never notified for assigning something to yourself, and re-saving doesn't re-notify.) The same happens when a proposal's agent is changed in Proposals Studio.
5 · Finance Suite
Confirmed trips and their payments appear here automatically for invoicing and the books.
What Finance sees automatically
- Every confirmed proposal, in the Proposals Studio Queue, ready to invoice.
- Every payment you record (online or offline) — reflected against the receivable, so the collect buttons grey out once paid.
- Live Receivables, Cash Flow, and Profit & Loss.
6 · The client link
One link, the whole journey. It changes automatically as the trip progresses — you never send a second one.
| Trip stage | What the client sees on the same link |
|---|---|
| Shared / Approved (no payment yet) | The proposal / quote — itinerary, prices, and buttons to accept & pay the deposit. |
| Deposit received onward | Their "My Trip" page — live itinerary with booking badges, confirmation numbers, downloadable documents, and the remaining balance to pay. |
The three booking badges
Pending — not yet confirmed with the supplier · Confirmed — booked & confirmed (hotels, services) · Ticketed — flight fully issued
Full scenarios
Three complete, realistic walk-throughs from start to finish.
A client approves a Maldives trip and pays the deposit online.
- Design in Proposals Studio: build the QR flight + Soneva Jani hotel, set sell prices, add a cancellation policy, and a payment schedule (Deposit 40% + Balance 60%). Set status to Shared with Client.
- Client reviews the link, clicks Approve, then pays the Deposit 40% via the KNET button on their portal.
- Automatically: the trip confirms, the plan locks, and it appears as a job in Vouchers Studio. It also lands in the Finance queue.
- In Vouchers Studio, open the job: issue the ticket (enter PNR
QR7X4L2, seat, e-ticket number → Stage 1 done), confirm the hotel (enter HCN → Confirmed). - The client's link now shows the flight Ticketed and hotel Confirmed, plus the balance still due.
- Nearer travel, collect the balance; keep the flight moving through Stages 2 & 3 (schedule check, pre-departure reminder).
Same trip, but the client sends a bank transfer instead of paying online.
- Client transfers the deposit to the agency bank account and sends you the receipt.
- In Proposals Studio's Payment Schedule, press ✓ Received on the Deposit installment (or 💵 Record Payment for an ad-hoc amount). Choose method bank.
- From here it's identical to Scenario A — the trip confirms, locks, activates in Vouchers Studio, and reflects in Finance. The client link shows Partially Paid.
After paying, the client asks to add a night in Dubai — but the plan is locked.
- In Proposals Studio you see 🔒 Plan locked. Click ✎ Request change from management and type the reason: "Client wants to add a night in Dubai."
- The status changes to ⏳ awaiting approval. A manager opens Agency Hub and sees the request in Plan-Change Approvals.
- The manager clicks ✓ Approve. The plan is now unlocked for one editing session.
- You reopen the proposal, add the Dubai night / adjust the rate, then press 💾 Save & re-lock plan.
- The plan re-locks; the client link and Finance re-sync with the new details.
Quick reference
Which app do I open?
| I want to… | Go to |
|---|---|
| Build a quote, set prices & policies, take a deposit | Proposals Studio |
| Issue tickets, confirm hotels, arrange transfers/VIP | Vouchers Studio |
| Invoice a confirmed trip, see receivables & cash flow | Finance Suite |
| Approve a plan-change request (managers) | Agency Hub |
| See exactly what the client sees | Client Portal (their link) |
Trip lifecycle at a glance
| State | Meaning | Plan editable? | Client link shows |
|---|---|---|---|
| Draft / Shared | Designing / sent to client | Yes | Quote |
| Approved | Client said yes; awaiting payment | Yes | Quote + pay buttons |
| Confirmed (deposit in) | Locked & live in Vouchers Studio | No — needs approval | My Trip (live status) |
| Unlocked (approved change) | Editing session granted | Yes — one session | My Trip |
Key buttons
- 💵 Record Payment — log an offline (bank/cash) payment → confirms the trip.
- ✓ Received — mark a scheduled installment paid offline.
- ✎ Request change from management — ask to edit a locked plan.
- 💾 Save & re-lock plan — after an approved edit, save and re-freeze.
- 📋 Invoice (Finance) — generate the invoice for a confirmed trip.
FAQ
Do I still send the client a separate "booking" link after they pay?
No. It's the same link the whole time. It becomes their live "My Trip" page automatically once a deposit is recorded.
The client paid only a small token amount — is the trip really confirmed?
Yes. Any recorded payment confirms the trip and locks the plan. That's deliberate — it protects the agreed terms the moment the client commits money.
I need to fix a typo / price on a locked trip. Do I really need approval?
Yes — any change to the plan (items, rates, policies) needs a manager to approve the unlock. Payments, status and everything in Vouchers Studio remain editable without approval.
A trip I confirmed isn't showing in Vouchers Studio.
It auto-activates when a payment is recorded. Confirm the payment actually shows as Paid in the schedule, then reopen Vouchers Studio — the job appears on load.
Where's "Operations Centre"?
Renamed to Vouchers Studio. Old links redirect automatically.
Can the client see our net cost / margin?
Never. Net cost, supplier and margin are agent-only. The client sees sell prices and booking status only.
App reference — every function
A manual for every app in the suite. Use the search box at the top to jump to any function by name. Proposals Studio and Vouchers Studio are covered in full in the workflow chapters above.
Agency Hub
The home screen and command centre — where everyone starts the day. It launches every app and surfaces what needs attention.
🚀 App launcher
Tiles link to every app in the suite (Proposals Studio, Vouchers Studio, Finance, Client Registry, and so on). Your available tiles depend on your permissions.
🔔 Priority alerts
Live warnings pulled from across the system — overdue flight confirmations (→ Vouchers Studio), client passports expiring within 60 days (→ Client Registry), overdue receivables (→ Finance), and concierge cards needing refresh. Click an alert to jump straight to the fix.
🗓 Master Calendar
One month calendar showing every dated event across the whole agency — flight departures & returns, hotel check-ins & check-outs, payment-schedule due dates, free-cancellation deadlines, task deadlines and client birthdays. Days with events glow gold and show a coloured dot per type; click a day to list its events in the side panel, and click an event to jump straight to its job, proposal, task or client. Use ‹ › to change month, or Today to return.
🔓 Plan-Change Approvals managers
The approval queue for locked-plan change requests. Approve to unlock a plan for one editing session, or deny. See The plan lock.
🔍 Global search
One search box across proposals, clients, tasks and partners — type a name, reference or package and jump to the record.
📊 Analytics
Fulfilment — confirmed hotels and issued tickets, counted from real Vouchers Studio jobs (so a trip with two confirmed hotels shows two). Concierge Library — how many recommendations are on file across all nine categories (restaurants, beach clubs, activities, things to see, romance, shopping, day trips…). Most Booked Hotels & Airlines — drawn from your real invoice history (all 416 invoices), not draft proposals, with a ticket-class breakdown per airline. Filter Fulfilment by client and date range; the booking patterns are always all-time.
⋮⋮ Customize Layout
Click Customize Layout to rearrange the whole page. Drag a section bar (Alerts, Master Calendar, Analytics, Dashboard Cards) to reorder the big blocks, or the 👁 to hide one. Inside the cards block, drag individual cards to reorder or hide them the same way. Click Done when finished, or Reset to default to undo. Your arrangement is saved to you personally and follows you between devices — it doesn't change anyone else's view.
Finance Suite
The full accounts system — invoicing, receivables, payables, cash flow and statements. Confirmed trips and recorded payments flow in automatically (see workflow §5).
📋 Dashboard
Total Sales (YTD), Total Cost, Gross & Net Profit with margin, Receivable / Payable / Refund Due, Bank & Cash, plus Monthly Performance, Cost-vs-Profit and Sales-by-Destination charts.
🗓 Daily Update
The day's finance to-dos and movements to review and clear. The badge shows how many items are waiting.
⊕ Proposals Studio Queue
Every confirmed proposal, ready to Invoice. Line items and the client's paid deposit are already attached.
↓ Receivables
Accounts Receivable with due dates and ageing, client payment reminders, and one-click Sync from Ledger to apply a confirmed UPayments payment to an invoice.
↑ Payables
Accounts Payable to hotels/DMCs/airlines, plus Credit with DMC tracking.
≡ Customer Ledger & Suppliers / DMC
Running statement of everything invoiced, paid and outstanding for a given client or supplier.
≈ Cash Flow
Expected inflows (receivables) vs outflows (payables) over time.
∑ Profit & Loss · Balance Sheet
Monthly P&L (revenue, cost of services, gross profit, operating expenses, net profit) with editable FX rates and Excel export; plus a Balance Sheet.
✎ Invoice Maker · Invoices
Build a manual invoice, or browse Live Invoices — every invoice from Invoice Maker and from Proposals Studio confirmations, always current.
📈 Sales History
The historical sales database (cross-matched from the master invoice records) feeding the P&L trailing-12-month figures.
🎯 Real margin from operations
The actual net cost an agent records in Vouchers Studio flows in as each invoice's cost, so gross/net profit reflect real supplier cost instead of an estimate. The customer ledger lists each cost line with its exact currency conversion and fees — e.g. "KWI→JFK · Galileo GDS — 2,052.05 — USD 6,500 @ 0.30851 + 1.5% card fee" — and the profit line states "incl. KWD X transaction fees". A manually-entered net cost always overrides it.
⚙ Settings
Shared ops inbox & default agent email, weekly FX-rate overrides, and data export/import.
Client Registry
The single source of truth for who your clients are — contact details, travel documents, family, and a persistent client ID (ETID) that links them to their trips and portal.
👤 All Clients & New Client
The full client database. Each client gets an ETID that ties together their proposals, portal and history.
🛂 Travel Documents
Store passport and visa numbers with expiry dates — these drive the expiry reminders below and the alerts in Agency Hub.
👨👩👧 Family & Companions · Loyalty Programs
Link family members and companions to a client, and record airline/hotel loyalty program numbers.
🔴 Reminders
Urgent (action-required) and Upcoming (90-day) lists — chiefly passports about to expire — so you can prompt clients in time.
🎂 Birthdays & Anniversaries
Upcoming client birthdays and anniversaries for concierge outreach.
⇅ Import / Export · Linked Proposals
Import/export the client database, and see every proposal linked to a client.
Client Portal
The client-facing page (see workflow §6 for how it switches by status). This is what the client can do on their link.
🗺 Your Full Journey
The full itinerary with a live status badge on each item — Pending / Confirmed / Ticketed — updated live from Vouchers Studio.
✈ Flight Tickets · 🏨 Hotel Confirmations
PNR and e-ticket for flights; HCN / confirmation number for hotels — with any voucher documents to download.
🎯 Activities · 🛂 Visa & Documents · 📎 Uploaded Files
Experiences, visa/entry documents, and any files the agent uploaded for them.
💳 Pay & download receipts
Pay a deposit or balance via KNET/card straight from the payment schedule, and download the invoice and payment receipts. Paying here confirms the trip automatically.
🔐 Secure login
Confirmed trips are protected by a phone-number + last-name gate; the original quote opens directly from the shared link.
People & Culture (HR)
Staff management — employees, departments, payroll, and the logins that control who can use the system.
👥 All Employees & Add Employee
The staff directory with personal details, role, department and documents.
🏢 Departments · 🔐 Permissions Matrix
Organise staff by department and control app-by-app access in the permissions matrix.
🔑 Staff Logins
Create and manage the staff accounts used to sign in to the whole platform. This is where system access is granted or revoked.
💰 Payroll Tracker
Monthly per-employee breakdown of pay; feeds the payroll figure shown in Finance.
🔔 HR Reminders
Alerts for staff passport/visa expiries.
🙋 Self-service
My Details, My Payslips and My Documents for each employee.
Concierge Desk
Your destination knowledge base — curated recommendations per city that can be attached to a proposal and shown to the client.
🌍 Destination Cards
A card per city holding restaurants, beach clubs, hotels and activities you recommend. Link cards to a proposal (in Proposals Studio) and they appear on the client's portal under “Concierge”.
+ New Destination Card
Create a card and fill its recommendations by hand, or…
📄 Import from Document / Upload PDF
Upload a PDF for a city and let the system extract recommendations into a card automatically.
♻ Needs Refresh · ⬇ Export
Cards not updated in 6+ months are flagged for refresh; export all cards for backup.
Task Board
Team task tracking so nothing falls through the cracks between sales, operations and finance.
✅ My Tasks · Assigned to Me · Created by Me
Filtered views of tasks by your relationship to them. These now recognise a task however it was assigned — by a colleague from the picker or auto-created by the system (payment, approval and flight triggers) — so nothing you own can hide.
+ New Task & Task Detail
Create a task, assign it to a colleague, set a due date, and track it to done with full detail (comments, status, linked proposal). The moment you assign someone, they get an email + WhatsApp with a link that opens the task directly. Deleting a task removes it on every device.
Partner Directory
Your suppliers and partners in one place — the people you book through.
🗂 All Partners & filters
Browse all partners or filter by type (Hotel, DMC, Airline, and more).
+ Add Partner
Add a partner with contact details, type and notes for the whole team to use.
UPayments
The payment gateway — create and track KNET / card payment links. Payments made here flow into Finance and confirm the trip.
💰 Collect Payment Now
Generate a KNET/card payment link for an amount, to send to a client. (Card links add the standard surcharge the client covers.)
🔗 Recent Payment Links
See links you've created and their status (sent / paid), shared with Finance and the proposal's payment schedule.
Version log
Update this table every time a feature is added or changed, then redeploy the handbook.
| Version | Date | What changed |
|---|---|---|
| 2.7 | 15 Jul 2026 | Split Travel Studio into Proposals Studio (design) + Vouchers Studio (fulfilment, formerly Operations Centre). Deposit-triggered confirmation (any payment). Offline payment capture. Plan hard-lock with manager approval via Agency Hub. Client link now reflects live per-item booking status + PNR/HCN. First edition of this handbook. |
| 2.7.1 | 16 Jul 2026 | Expanded from a workflow guide into the full System Handbook: added a live search box and an App reference section documenting every function of Agency Hub, Finance Suite, Client Registry, Client Portal, People & Culture, Concierge Desk, Task Board, Partner Directory and UPayments. Handbook linked in every app's nav; real captured screenshots embedded. |
| 2.7.2 | 16 Jul 2026 | Phase 6 — real margin loop. Vouchers Studio gained a Costs & Margin panel (actual net cost per booking, live margin); the total syncs to the proposal and Finance uses it as the invoice's cost, so P&L margin is accurate with no re-keying (manual net still overrides). |
| 2.7.3 | 16 Jul 2026 | GDS ticket-PDF parser. Vouchers Studio can import a Galileo/Travelport e-ticket PDF and auto-fill PNR / Galileo ref, ticket numbers, seats and baggage per passenger — parsed offline in the browser (pdf.js, no server/API), with a review step before applying. |
| 2.7.4 | 16 Jul 2026 | Fix: Vouchers Studio's Costs & Margin panel now pre-fills each booking's net from the proposal (flights & hotels) instead of showing blank fields — so agents aren't asked to re-enter net cost they already set in Proposals Studio. They adjust only if the actual supplier cost differed. |
| 2.7.5 | 16 Jul 2026 | Group Trip room assignment fixes. Ticking guests into a hotel room now auto-splits the room's sell rate equally among them (single occupant = full room cost); a guest assigned to one room is greyed-out in the hotel's other rooms to prevent double-booking. Trip-wide Equal Split now respects room occupancy instead of putting every traveller in every room. |
| 2.7.6 | 16 Jul 2026 | Fix: "[object Object]" proposal refs. Saving/sharing a proposal before its reference number finished generating could store a broken ref that showed as [object Object] and made the proposal unloadable. All save paths now wait for (or safely substitute) a real ET reference, and the one affected proposal was repaired to ET2607162. |
| 2.7.7 | 16 Jul 2026 | Fix: "Could not load proposal." A startup error in Proposals Studio (per-person price helper referenced before it was loaded) silently disabled parts of the app, including opening saved proposals from Agency Hub. Startup is now guarded; loading proposals works again. |
| 2.7.8 | 16 Jul 2026 | Fix: hotel edits no longer wipe room guest-splits. Re-saving a hotel (adding a second room, changing a rate) used to silently erase the Group Trip guest assignments on every room. Splits now survive edits, and a room whose sell rate changed re-divides automatically among its assigned guests; rooms with unchanged rates keep any manual per-person tweaks. |
| 2.7.9 | 16 Jul 2026 | Fix: room splits showing 0.000 / wrong amounts on older proposals. Guest assignments saved before V2.7.8 stored zero for every guest (amounts used to be typed by hand). Loading a proposal now re-divides any priced room whose guests all show zero — e.g. a KWD 3,080 room with 2 guests immediately shows 1,540 each. Rooms with any hand-entered amount are left exactly as typed. |
| 2.8 | 16 Jul 2026 | WhatsApp staff alerts + platform-wide design refresh. Staff now get key notifications on WhatsApp alongside email (task assignments, the daily deadline digest, and flight schedule-change alerts) via wasenderapi.com, with a clickable deep-link to the item; the WhatsApp number is set per person in People & Culture. A new daily deadline digest emails every due date (supplier payments, client collections, hotel cancellation deadlines, tasks, HR docs) at 8am. Platform-wide visual refresh across all 11 apps: single Hanken Grotesk type system, the ELITE TRIP logo made transparent (no more navy box) and integrated into headers, and refined depth/spacing on the Client Portal. |
| 2.8.0 | 17 Jul 2026 | New hotel confirmation checklist (Vouchers Studio). Replaced with the 8 items that matter: HCN received, Elite Trip letter sent to hotel (placed in room pre-arrival), early check-in status, honeymoon amenities status, city taxes covered, booking source & cost non-disclosure, final check done, late check-out status. The three status items use a Requested / Confirmed / Unavailable / Upon check-in dropdown. Client portal now shows a hotel as confirmed the moment its HCN is recorded. |
| 2.8.1 | 17 Jul 2026 | Vouchers Studio polish. Tab highlight now follows the tab you clicked (Hotels/Transfers no longer left "Flights" lit); new 💾 Save All Changes bar at the bottom of every job page (changes still auto-save — this flushes the field you're in and confirms); Costs & Margin gains a Vendor / Source column pre-filled from the proposal alongside the net; remaining "Operations/Ops" wording renamed to Vouchers Studio. |
| 2.8.2 | 17 Jul 2026 | Multi-currency actual net + transaction fees. In Vouchers Studio's Costs & Margin, each booking's net is now recorded in the currency actually paid (USD, EUR, THB…) with the real FX rate the bank charged and any transaction fees (card %, flat transfer fee). Everything converts to KWD live, lines missing an FX rate are flagged, and Finance Suite's customer ledger shows the exact conversion per line — e.g. USD 6,500 @ 0.308 + 2.5% card fee — plus total fees on the profit line. Foreign-currency nets from the proposal pre-fill with their original currency and assumed rate. |
| 2.8.3 | 17 Jul 2026 | Client Travel Voucher PDF (Vouchers Studio). New 🖨 Generate Voucher button on every job builds a branded, print-ready voucher — flights (PNR, e-tickets, seats, baggage), hotels (HCN, board, confirmed early/late check-in-out, amenities, city-taxes note), transfers (driver, meeting point), experiences and extras — for printing or attaching to email/WhatsApp without the client needing portal access. Strictly client-safe: no prices, nets, vendors or fees ever appear. |
| 2.8.4 | 17 Jul 2026 | Travel Voucher now matches the Client Portal design. Flights and hotels render as the same clear cards clients see in their portal: navy header with airline & TICKETED/CONFIRMED chip, per-segment rows with airport codes, departure/arrival times and layovers, a 5-column flight detail strip, a per-passenger seat & e-ticket table, and hotel cards with Check-In / Check-Out / Nights / Meal Plan grid, room, statuses and confirmation number. |
| 2.8.5 | 17 Jul 2026 | No more FX-rate guessing. For foreign-currency nets in Costs & Margin you now enter the KWD amount your bank/card statement shows instead of a conversion rate — the implied rate is calculated and shown automatically (e.g. "1 USD = 0.30851 KWD") and synced to Finance. Imported proposals pre-fill the KWD side with the proposal's estimate, so nothing blocks; you overwrite it with the real statement figure once the payment clears. |
| 2.8.6 | 17 Jul 2026 | Sidebar refinements. The app-switcher now opens as a slim icon rail in every workspace app (only Agency Hub opens with the full labelled menu); collapsed icons render correctly (they used to vanish on Proposals/Vouchers Studio), and Finance Suite auto-collapses like the rest. Sidebar updates now reach every browser on a normal refresh — no more stale menus. |
| 2.8.7 | 17 Jul 2026 | "Assigned to you" notifications + one-click save. Putting an agent on a proposal (Proposals Studio) or a booking (Vouchers Studio) now sends them an instant email + WhatsApp with a deep-link — fires only on new assignments and never to the person doing the assigning. The Vouchers job Edit popup saves agent + handover notes together in one click (💾 Save Job & Assignment) with a ✓ Saved confirmation, ending the "two save buttons" confusion. |
| 2.8.8 | 17 Jul 2026 | Sync protection — edits can no longer vanish. Root-caused the "my tasks/notes are gone" incident: a device holding an older copy could overwrite the shared list and erase other devices' work, and saves made just before a refresh/tab-close were silently dropped. The server now merges tasks, proposals, partners, concierge and booking jobs item-by-item (a stale device can't wipe anything), task deletion syncs properly across devices, and pending edits are flushed to the server the instant a page is hidden or closed. |
| 2.8.9 | 17 Jul 2026 | Task Board deep audit. Manual and system-created tasks used two different staff-id schemes, so manually-assigned tasks could miss "Assigned to Me", the daily digest, and notifications (one bad id even killed a whole notification batch). All identities are now unified: tasks show up for their assignee however they were created, assignment alerts and the 8am digest resolve every staff member, deleted tasks stay out of digests, and the board no longer breaks on a malformed task. Verified end-to-end with a live test (new HR employee → picker → assignment → email → digest). |
| 2.9.0 | 17 Jul 2026 | Design enrichment across the platform (21st.dev catalog patterns + design-intelligence rules). Vouchers Studio gains a 🗓 Departure Calendar on the dashboard — every flight departure and hotel check-in across active jobs on a clickable month grid with gold day-badges; click a day to see its events, click an event to open the job. Finance Suite gains a Collections Mix card — this month's client payments split by method (KNET / Card / Transfer / Cash), every segment labelled, computed live from receivable payment histories — plus stat-card hover polish and gold row-hover on tables. Task Board cards lift on hover with keyboard focus rings, and empty views now explain themselves with a next action. Client Portal hero gains a slow-drifting aurora glow (still for reduced-motion users). |
| 2.9.1 | 17 Jul 2026 | Enrichment kit for every remaining app. Agency Hub, Proposals Studio, Client Registry, Concierge Desk, People & Culture, Partner Directory and UPayments all gain the V2.9 design language: stat cards with the gold accent bar that lift on hover, aligned tabular numerals on every figure, client/employee/partner cards that respond to hover, gold row-hover on data tables, and visible keyboard focus rings on every button and link (accessibility-first, per the design-intelligence ruleset). Purely visual — no behaviour changes. |
| 2.9.2 | 17 Jul 2026 | Platform-wide deep audit fixes. Restored the shared self-learning store sync (airline-name corrections now flow to every device again — it had been silently device-only since a mid-July deploy, and the server now unions everyone's corrections so nothing is lost). Proposals Studio's print-toolbar Premium/Classic layout buttons work again (they previously did nothing). Partner Directory Delete now removes the partner on every device permanently (a deleted partner used to reappear after sync). Audit also verified: every button handler and screen element wired across all 11 apps, all API endpoints matched to the backend, and deletion behaviour safe across every synced collection. |
| 2.9.3 | 17 Jul 2026 | Client Registry deduped & protected. The 16 clients that existed twice (a double import — same person, two "client since" dates) were merged into one record each, keeping the earlier, true client-since date (166 → 150 profiles). The registry now has the same multi-device sync protection as tasks, proposals and bookings: a device with a stale copy can no longer wipe clients others added, and Delete removes a client on every device permanently. Full pre-dedupe backup retained on the server. |
| 2.10.0 | 18 Jul 2026 | Agency Hub — Master Calendar + analytics fixes + customisable dashboard. A new 🗓 Master Calendar sits as the top card on the home page (same 21st.dev "Visualize Booking" design as the Vouchers Studio departure calendar): every dated thing across the whole agency — flight departures & returns, hotel check-in/out, payment-schedule installments, free-cancellation deadlines, task due dates and client birthdays — on one clickable month grid; click a day to see its events, click an event to jump straight to its job/proposal/task. Three analytics fixes: Fulfillment "Hotels Confirmed" now counts real confirmed hotels from Vouchers Studio jobs (a job with 2 confirmed hotels used to show 1); Concierge Library now counts every recommendation in all 9 categories (it was only counting cities — it read the wrong data path — and had skipped "Things to See" and "Romance" entirely); Most Booked Hotels & Airlines now draws from the 416 real invoices in the master invoice database instead of proposal drafts (transfers excluded, airlines matched by name or flight code). New ⋮⋮ Customize Layout button lets each staff member drag dashboard cards to reorder them and hide/show cards; the layout is per-user and syncs across their devices (new et_dash_layouts synced key with a per-user merge so no two people clobber each other). Built with the ui-ux-pro-max design skill. |
| 2.10.1 | 18 Jul 2026 | Agency Hub — Customize Layout now covers the whole page. The ⋮⋮ Customize Layout button no longer just rearranges the dashboard cards — it now governs the entire home page. In customise mode each major block (Alerts, Master Calendar, Analytics, Dashboard Cards) gets its own drag bar, so you can drag a whole section up or down or hide it with the 👁, in addition to reordering/hiding the individual cards inside the grid. Section order and visibility are saved per user and follow you between devices, stored alongside the card layout (no one else's view changes). Reset to default restores everything. |
| 2.10.2 | 18 Jul 2026 | Handbook refresh. The Vouchers Studio "Costs & Margin" manual card rewritten for the current workflow (multi-currency actual net, KWD-charged-from-bank auto-rate, transaction fees, vendor column), and Finance's "Real margin from operations" card now shows the per-line conversion & fees the ledger displays. |
| 2.10.3 | 18 Jul 2026 | Client Portal — premium travel documents + matching Flights/Hotels tabs. Every downloadable PDF the client saves (flight e-ticket, hotel voucher, invoice, payment receipt, activity & document vouchers) is redesigned into one luxury system: a full-width navy masthead with the gold Elite Trip logo built in, a navy footer band with your contact & terms, and clean line-icons throughout. The flight e-ticket reads like a boarding pass — big airport codes with the times and dates beneath each, a gold route line, and icons for duration / cabin / baggage. Connecting flights now stay one ticket and show each leg with the layover time calculated automatically (e.g. "Layover 3h 5m in DXB"); round-trips still split into Departure / Return. Multi-room hotel bookings now print as a single voucher listing every room (category, board, dates, nights, confirmation number) with a combined guest list. Every document is guaranteed to come out as one continuous page — never split across sheets. The on-screen Flights and Hotels tabs were rebuilt to the exact same look, so the portal and the saved PDFs are one consistent, client-friendly experience. Built with the ui-ux-pro-max design skill + the 21st.dev "Visualize Booking" pattern. |
| 2.10.4 | 18 Jul 2026 | Fix + redesign: client-portal PDFs broken on iPhone. Saving a voucher/e-ticket as PDF from an iPhone (Safari/WhatsApp browser) collapsed every row into stacked blocks — half-empty pages split in two. All travel documents were rebuilt on genuine table layout (the only structure every print engine honours) and redesigned: larger, eye-friendly type, two balanced fact rows (Check-in / Check-out / Nights and Room / Board / Guests) with gold icons, no dead space, guaranteed one page on iPhone, Mac and Windows alike. Long hotel names on the phone screen also display smaller with the Confirmed badge pinned neatly top-right. |
| 2.10.5 | 18 Jul 2026 | Client Portal polish. The summary squares at the top (Flights / Hotels / Activities / Days) are now clickable — tapping one jumps straight to its matching tab below (Days opens the full Itinerary), with a gold hover lift so clients know they're buttons. Also removed the passport column & wording from the hotel PDF voucher — hotels never need passport details, and the empty column wasted table space. |
| 2.11 | 19 Jul 2026 | Platform design refresh — 7 staff apps lifted to the Agency-Hub look. Task Board, Client Registry, People & Culture, Vouchers Studio, Finance Suite, Concierge Desk and Proposals Studio were polished to one consistent premium style: the top summary tiles (KPIs) now carry a gold accent bar (turning red for overdue/urgent, green for done/profit), a small line-icon beside each label, and bigger, bolder figures; a gold section eyebrow sits above each page title; status tags are now rounded pills; and cards lift gently on hover. Everything uses the house font (Hanken Grotesk) — no change to any data, buttons or workflow, purely the look. Built with the ui-ux-pro-max design skill to match the Agency Hub & Client Portal standard. |
| 2.11 | 19 Jul 2026 | Vouchers Studio — attach client documents + link concierge cards. Open a confirmed job in Vouchers Studio and you can now: (1) 📎 Client Documents — attach any PDF or image (restaurant confirmation, tour voucher, visa) at job level; (2) attach a document to a specific activity (invoice / ticket / confirmation) right on that activity card. Anything you attach appears in the client's portal Docs tab as a real ⬇ Download, labelled with the item. Keep files under 8 MB. (3) The ✦ Concierge Cards linker (activate toggle + choose destination cards) moved here from Proposals Studio — activate and pick cards while editing the client's vouchers; they show in the portal's ✦ Concierge tab. Proposals Studio now points you here; cards linked there before still show. |
| 2.11 | 19 Jul 2026 | 🐛 Client Portal agent phone — resolve real number, never a placeholder. The "Need Help?" contact card showed a hardcoded fallback number whenever a proposal's assigned agent had none on file — the agent's phone was genuinely blank both on their profile and their embedded snapshot, but present on their login account (the same number already used for WhatsApp staff alerts). The portal now resolves the agent's real number the same way — profile first, login account as fallback — for every agent, not just one case. If no real number exists anywhere, the phone row and WhatsApp button now hide cleanly instead of showing an unverified number. |
| 2.11.1 | 19 Jul 2026 | 👁 Preview on every client document. Each PDF in the Client Portal — flight e-ticket, hotel voucher, activity & travel-document vouchers, invoice and payment receipts — now has a Preview button beside the download: the client sees the exact document on screen (no file saved, no print dialog) and can download from inside the preview if they want a copy. Same idea as the concierge document preview, extended to all generated travel documents. |
| 2.11.2 | 19 Jul 2026 | Finance Suite invoice restyled to match the Client Portal. Opening an invoice's print view now shows the exact same premium branded document a client sees — navy masthead with the gold Elite Trip logo, gold-bordered total band, category-tagged line items, payment history with each collection's breakdown note, and a navy footer with the agent's contact. Same underlying numbers as before, just the same professional look used everywhere else. Prints as one clean portrait page. |
| 2.11.3 | 20 Jul 2026 | ✉ AI Guest Welcome Letter (Vouchers Studio). On every hotel card, under "Elite Trip Letter Sent to Hotel", a new ✉ Write Welcome Letter button drafts the in-room welcome letter with AI: it knows the hotel and destination, matches the occasion (honeymoon, family holiday, anniversary — auto-detected from the package), addresses the guests correctly, and follows the Elite Trip letter style. The agent can add a personal touch, edit the text, save the draft (synced with the job) and print / save it as a one-page branded letterhead PDF to email to the hotel. Never mentions prices or booking sources. |
| 2.11.4 | 20 Jul 2026 | 🔎 Platform-wide UI/UX audit + fixes. Every staff and client app (Agency Hub, Client Portal, Client Registry, Concierge Desk, Destination Guide, Finance Suite, Partner Directory, People & Culture, Task Board, Vouchers Studio, Proposals Studio, UPayments, and the client payment page) was reviewed against an accessibility/touch/performance/consistency checklist and fixed in one pass — keyboard navigation added to every clickable card, gold-text contrast corrected, Escape-key/focus handling added to modals, mobile tables no longer get clipped on phones, touch targets brought up to size, and several real bugs fixed along the way: Task Board's search box no longer loses focus while typing, Finance Suite gained an overpayment guard, People & Culture now confirms before a saved WhatsApp number is cleared, Partner Directory's delete confirmation no longer claims something is permanent when it isn't, and Proposals Studio's item-delete now asks first. All changes are presentation/interaction fixes — no pricing, booking, or financial calculation logic was touched. |
| 2.11.5 | 20 Jul 2026 | Vouchers Studio document reliability. Fixed a sync bug where a stale open tab could silently overwrite another device's newly attached client documents or Concierge Card links. Also replaced the old attach flow (browser pop-up prompts, no feedback while a file was reading) with an in-app upload wizard: shows the file name/size, a live read-progress bar, then an explicit ready state with name/type fields before attaching — and a clear error message (oversized file, unreadable file, item no longer found) instead of silently doing nothing. |
| 2.11.6 | 20 Jul 2026 | 👁 Concierge tab document preview. Documents under a client's Concierge tab "Confirmed For You" activities now open in an in-app popup preview instead of a new browser tab — Download still saves the real file from inside the popup. The Docs tab's own download links are unchanged. |
| 2.11.7 | 20 Jul 2026 | 🔍 Google venue verification for activities. Any activity card in Vouchers Studio can now be verified against Google: click 🔍 Verify Venue on Google, search the venue, review the real name/address/phone/rating/photo Google returns, then confirm. The verified venue then shows on the client's Concierge tab with a photo, a clickable address (opens Google Maps), and a tappable phone number — the client sees the real place, not just whatever was typed. Same Google Places integration already used for hotel lookup and Concierge Desk cards. |
| 2.11.8 | 20 Jul 2026 | 💰 Payment Received alert (WhatsApp + email). The moment a client's UPayments payment is confirmed, the assigned agent and Accounts now get a dedicated "Payment Received" notification by email and WhatsApp — separate from the generic task-assignment message — that always names the client and the package booked, along with the amount and reference. Opens straight to Finance Suite from either channel. |
| 2.11.9 | 21 Jul 2026 | 🎫 GDS ticket parser + Client Portal flight cards — a real ticket, sector by sector. One real Emirates itinerary (Mr Alsumait, KWI–SEZ–KWI, 4 sectors) surfaced a chain of parsing and display bugs, fixed one real sector at a time: a connecting/layover sector silently dropped when its status line wrapped onto the next PDF line (added a lenient multi-line stitch, plus a PDF-page image preview alongside the parsed table so the agent can check against the source); a sector with a next-day arrival marker (#0420) vanished entirely (parser now accepts a leading # or trailing +1); the baggage checklist showed a bare tick with no value (now shows the real ticketed or proposed amount); importing a ticket with more real legs than existing flight cards silently discarded the extra ones (now matches by flight number/route and keeps every card's own cost data intact); wrong stop count, missing e-ticket/PNR and per-passenger baggage on the client-facing flight card (connections are now measured directly from each segment's real time, not a value Proposals Studio deliberately leaves blank past 48h); layover duration showed no time at all for any real flight (a time-parsing bug affecting every non-colon flight time); and a second real passenger's name showed as a generic placeholder instead of their actual name from the ticket. Also added: live "🕐 Departs in Xd Xh" / "✈ In the air" / "✓ Flown" status per flight card (real airport timezones, refreshes every 60s) and a "Download All Tickets (1 PDF)" combined voucher. |
| 2.11.9 | 21 Jul 2026 | Concierge Desk: Cafes & Desserts category + reliability fixes. New "Cafes & Desserts" category with a bulk auto-classifier that scans every city's existing recommendations for cafe/coffee-shop/dessert matches and moves them in on its own; recommendation cards gained drag-to-reorder within a category; destination share links now route through a server-rendered preview page so WhatsApp/social previews show the real city name instead of a generic title. Separately: a bulk edit (e.g. adding a whole city's venues at once) could fire hundreds of individual audit-log requests in one go, tripping the shared rate limiter and getting real saves/AI calls blocked alongside it — batched into one request per save. |
| 2.11.9 | 20 Jul 2026 | Finance Suite: real UPayments payment reconciled + orphan-payment safety net. A confirmed UPayments payment (Abdullah Alhajji, ET2607388, Apple Pay/KNET) never reached Finance Suite because the payment link was created without an invoice attached, so nothing pointed the confirmation back to a receivable. Reconciled the specific case (receivable + invoice + cash flow entry corrected, no double-count). Closed the general gap: Data Integrity now flags any UPayments-confirmed payment whose ledger row was never linked to an invoice, so this class of silent miss surfaces instead of sitting invisible. Also added: Payables rows for Emirates flight + Six Senses hotel on ET2607387 so per-supplier cost shows in Customer Ledger, and every Receivables payment now shows its own realized margin (that payment's share of the invoice's known margin%), not just a total at invoice level. Architecture decision — logged, not built: the July 13 Finance Suite audit's recommendation to unify proposals/invoices/Customer Ledger/Sales History into one bookings table was reviewed and deliberately parked — a live production migration with no staging and a single non-developer owner is the wrong risk to take while every symptom it caused is already patched. Re-open trigger: revisit only if a real need for a cross-table report/query appears. |
| 2.11.9 | 22 Jul 2026 | 🐛 Fixed confirmed activities briefly showing twice on the Itinerary tab. A same-day fix attempt duplicated every confirmed restaurant/activity on the client's Itinerary tab (each one appearing twice) by re-reading data that an earlier fix (V2.12.0, "auto-itinerary") already placed there correctly. Removed the redundant code — a confirmed activity now shows exactly once, correctly sequenced among the flights and hotel stays (e.g. a 19 Jul dinner reservation sits between the two hotel stays it falls between), and still appears in the Concierge tab's "Confirmed For You" list as before. |
| 2.11.10 | 22 Jul 2026 | Client Portal payment/passenger accuracy fixes (real case: Hamad Alsumait). Two things now show correctly: (1) a second traveller's real name (not a generic "Client Name #1/#2") now appears wherever it's captured from an imported ticket — a gap where Vouchers Studio had the real name on file but it never reached the client's portal has been closed; (2) "Paid so far: X of Y" on the Payments card now always compares against the trip's real total package price, not just whatever partial amount happened to be on file — a client who paid a deposit no longer sees a total that makes it look like the trip is already paid in full. |
| 2.12.0 | 21 Jul 2026 | Destination sharing, auto-itinerary, docs upload wizard, hotel-scoped concierge docs. Concierge Desk: real web-verified Instagram lookups (was a guess, not a real check), edit-and-move a venue between categories, drag-to-reorder within a category, per-hotel document tagging with a visible/hidden toggle, a real upload-progress wizard replacing silent browser prompts. Client Portal / Destination Guide: dynamic per-city WhatsApp share previews, swipeable venue carousel, a fixed oversized-icon bug, clickable Maps chip, and an auto-built Day-by-Day itinerary assembled from the trip's real flights, hotels, transfers and confirmed activities. Vouchers Studio: a hotel sub-dropdown when linking a Concierge Desk card to a client's job, so one destination's documents can be scoped to just their hotel instead of every hotel's paperwork. |
| 2.11.11 | 22 Jul 2026 | 🍽️ Activity/service item type — Cafe / Restaurant / Beach Club / Activity. Restaurant and beach club reservations were lumped into one generic "service" bucket, and the Client Portal always showed a hardcoded 🎯 "Activity" icon regardless of what it actually was — a restaurant reservation looked identical to a desert safari. Proposals Studio's item-type field now has all 4 options and always saves the live selection (previously a manual entry without pasting a confirmation could silently lose it). Vouchers Studio's Activities tab (the confirmed-trip, ops-side flow — a different code path, since Ahmad's original complaint was specifically about two restaurant reservations added there) gained the same dropdown, wired through to the client portal so the real venue type shows correctly everywhere: Itinerary tab, Activities tab, and the printed voucher. |
| 2.11.12 | 22 Jul 2026 | 🔀 Actual cost/margin entry moved from Vouchers Studio to Finance Suite. An agent filling in Vouchers Studio's confirmation checklist has no business seeing vendor cost or margin — that's Finance's domain. Removed the entire "Costs & Margin" panel from Vouchers Studio; Finance Suite's Customer Ledger gained a new "✎ Edit Costs" button per invoice line instead, defaulting to "Same as quoted" with a quick "±% of quoted" / "±Fixed KWD" adjustment, or the original multi-currency/FX-rate/fee flow when needed. Vendor cost data was already blocked from the client-facing portal API in principle — confirmed it's now actually enforced server-side, not just labelled "(internal only)" on the form. |
| 2.12.1 | 22 Jul 2026 | 🐛 Permanent fix: a real traveller name or seat number could get silently erased. The V2.11.10 passenger-name fix for Hamad Alsumait's booking was only a one-off data patch — the underlying gap remained: whenever Vouchers Studio synced real ticket data (traveller names, seat numbers, ticket status) onto a proposal, an unrelated save from Proposals Studio made shortly after could silently overwrite it back to a placeholder, because both saves shared the same "last edited" clock. Fixed at the source: Vouchers Studio's sync now stamps its own separate timestamp, and the server keeps whichever side's synced ticket data is actually freshest — regardless of which save otherwise "wins" — so a real name or seat number can no longer be clobbered by an unrelated edit. Finance Suite's own cost/margin figures are untouched by this (kept fully separate, as of V2.11.12). |
| 2.12.2 | 22 Jul 2026 | 🛡️ Deeper fix: closed the real race behind every "my data vanished" bug this year. A full platform pressure-test (5-perspective AI council review) found that tasks/concierge/proposals data loss all shared one root cause: when two saves to the same shared list landed close together, the server could merge each one correctly but still let the second save's write silently overwrite the first's result underneath it — a narrow timing gap, not a broken merge. The server now protects every shared collection with a version check: a save only commits if nothing else changed the record in the meantime; if something did, it automatically re-merges against the newest data and tries again — so two people (or two devices) saving around the same moment can no longer cost each other data. Verified with a real concurrent-write test before going live. No visible change to any app. |
| 2.12.3 | 22 Jul 2026 | 🔒 Login security hardening. Two gaps closed from the same platform pressure-test: (1) a deactivated staff account, or a stolen login session, used to keep working for up to 12 hours after being cut off — logins are now re-checked live on every request, so deactivating someone or changing a password takes effect immediately, not at the next natural expiry; (2) the login page was only rate-limited by IP address, meaning a determined attacker spreading attempts across many different IPs could still hammer one specific account without ever tripping the limit — a second limit now protects each account directly (5 attempts per 15 minutes) no matter how many IPs are used against it. No visible change to how staff log in day-to-day. |
| 2.12.4 | 22 Jul 2026 | ✅ Deploy safety net. Final step of the platform pressure-test: a one-command health check (`smoke-check.js`) that runs right after any backend deploy — confirms the server actually responds, the database is reachable, this year's fixes are still in place, and real client data (tasks, proposals, concierge cards, client list) is still there and non-empty, not silently wiped. Closes the exact gap that let past incidents reach production unnoticed (a file passing a syntax check was never proof it actually works). This becomes standard practice after every future backend change. |
| 2.12.5 | 22 Jul 2026 | 🐛 Fulfillment card wasn't refreshing on its own. Agency Hub already auto-refreshes quick stats, alerts, and the dashboard grid every 60 seconds — the Fulfillment card (confirmed hotels + ticketed flights from Vouchers Studio jobs) was missing from that same refresh loop, so it only ever showed the numbers from when the page first loaded. If a hotel got confirmed or a ticket got issued in Vouchers Studio while Agency Hub stayed open in another tab, the count wouldn't catch up until a manual page reload. Added to the same 60-second refresh as everything else — no new mechanism, just closing the gap. |
| 2.12.6 | 22 Jul 2026 | 🔍 Handbook search — real clickable results. Searching (e.g. "cancel") reported a result count but had nothing to actually click — the search only ever looked inside function/feature cards, so any hit living in the Version Log or a reference table (this whole table included) was invisible to it, while unrelated cards elsewhere padded the count. Rebuilt to index every card and every table row on the page, shown as a real dropdown of clickable results — each one names its section, shows a snippet with your search term highlighted, and clicking it scrolls straight to and briefly highlights the real spot on the page. |
| 2.12.7 | 23 Jul 2026 | 🏨 Hotel & Room Library — backend foundation (Milestone 1 of 4). Groundwork for a new feature: upload a real hotel room's photos, description, and an official YouTube link once, then reuse it on every future client quoted that room — instead of re-describing the same Waldorf Astoria villa every time. Photos are stored as real files on the server (not the old "encode into the shared data" method every other upload used) specifically so this can hold real photo libraries without hitting the size ceiling that caused V2.12.2's data-loss bug class. Backend-only so far — no new app or button yet. Next: the actual Hotel Library app, then linking a room into a proposal, then the client-facing "View Room" preview page. |
| 2.12.8 | 23 Jul 2026 | 🔴 CRITICAL: "Remove"/"New link" on a payment link now actually cancels it. Real incident: a payment link removed or regenerated in Proposals Studio only ever updated this proposal's own copy of the payment schedule — the real backend record the client's saved link actually reads from was never touched, so a link an agent believed was dead stayed fully payable indefinitely. Worse, regenerating a link never cleaned up the previous one either, so repeated "New link" clicks silently piled up extra still-live links with no way to see or manage the older ones (one real proposal had 21 live links behind the scenes, from 5 travellers regenerated 4 times — only the most recent 5 were ever visible). Removing or regenerating a link now cancels the real one first; if it turns out a client already paid through it, the removal is blocked and you're told, instead of silently hiding a real payment. |
| 2.13.0 | 23 Jul 2026 | 🏨 New app: Hotel & Room Library. A new app in the sidebar (between Concierge Desk and Task Board) for building a permanent library of hotel rooms: add a hotel, add its room/villa/suite types, and for each one write a description & highlights, upload real photos, and paste an official YouTube link — once. The point: stop re-describing the same Waldorf Astoria villa on every quote. Two ways to fill it: type it in manually, or “Import from Website” — paste a hotel's rooms/villas page, tick which rooms to pull, and it reads each one and downloads its photos for you into a review list; you check and approve each before it's saved. Nothing goes live to a client from here yet — the next steps wire it into proposals (a “Link to Library Room” picker) and the client's “View Room” preview page. Photos are stored as real files on our server (not the old method), and the import uses zero Claude AI credits — it only reads the page and downloads the hotel's own images. |
| 2.13.1 | 24 Jul 2026 | 🏨 Hotel Library now reaches the client — “Link to Library Room” + “View Room”. The Hotel Library is wired end-to-end. In Proposals Studio, the hotel form has a new “🔗 Link to Library Room” dropdown — pick which library room this booking is (you choose it by hand; it's never guessed from the hotel name, so a client can never be shown the wrong villa). On the client's portal, any hotel linked this way gets a “View Room” button that opens a photo gallery with the description, highlights, video and 3D tour you saved — the whole reason the library exists. Build the room once in the Hotel Library, link it on every quote, and every client sees the same polished preview. (Everything is baked into the proposal when you save, so the client's link needs no login and always shows what you linked.) |
| 2.13.2 | 24 Jul 2026 | 🔴 The client portal now always shows the REAL proposal — never a sample — plus a richer “View Villa”. Fixed a serious bug where a client's link could load the built-in demo trip (a fake "Ahmad Almajed / Nour Almansour" itinerary) instead of their own proposal, if the page loaded before the real data was applied. The hardcoded sample trip has been removed entirely — the portal now renders only the real proposal, or nothing, never a fabricated one. Same fix hardened how the page loads so the real data always wins. Also polished the linked-room preview: the button reads “View Villa/Suite/Room” (no long name), photos enlarge full-screen with swipe, each photo can carry a caption (add them per photo in the Hotel Library), the 3D tour embeds inline (paste a Matterport link, or Google Maps → Share → “Embed a map”), and the 3D view is larger. |
| 2.13.3 | 24 Jul 2026 | ✨ Premium Proposal Version — a second, cinematic client-portal design you choose per proposal. In Proposals Studio, each proposal now has a “Premium Proposal design” toggle. Turn it on, upload a cover photo (required) and an optional headline (e.g. “The Maldives”), and the client sees a full-screen, magazine-style portal — a photo hero, boarding-pass style flights, an image-led villa gallery, a day-by-day story, and a quiet price section — instead of the classic card layout. It's the same link and the same everything underneath (real flights, hotels, payments, PDF vouchers all still work); only the presentation changes. Leave the toggle off for the normal Classic design. Best used for signature stays where you have great photography (pair it with a linked Hotel-Library room). Your name shows as “Your Travel Advisor.” |
| 2.13.4 | 24 Jul 2026 | 🏨 “Import from Website” now works properly on Marriott-family hotels — full galleries, captions and amenity lists. On Ritz-Carlton, St. Regis, W, JW Marriott, Luxury Collection, EDITION, Westin, Sheraton and the rest of that group, every room type is a card on one page rather than its own web page, so the importer used to come back with almost nothing — and it padded the list with the same page in German, Russian, Arabic, Japanese, Chinese and Korean, all just labelled “Rooms”. Now: translated duplicates are dropped (everything is always pulled in English, even if you paste a foreign-language link), each villa is listed by its real name plus its bed/view line so the 1-bedroom and 2-bedroom versions are told apart, and importing a villa brings in its complete photo gallery with a caption on every photo (8–19 photos), its full amenity list (size, beds, bathroom, food & beverage, entertainment, services) and highlight chips like “150sqm/1614sqft · Sleeps 3 · Private pool”. Rate packages such as “Full Board with Transfer” are filtered out. Hotels that do give each room its own page (Waldorf Astoria, Four Seasons, Patina …) import as before, and now also pick up per-photo captions. Captions are only ever taken from the hotel's own text — the AI is never asked to write one, because when asked it invents plausible-sounding captions for photos that have none, and invented copy must never reach a client. Index pages that aren't a room (Patina's “rooms-comparison”, “all rooms”, “compare”) are filtered out of the pick list. |
| 2.13.5 | 24 Jul 2026 | 👁 The importer now opens each room page in a real browser, so it reads any hotel site's design. Every hotel codes its website differently, so reading the raw page text was always going to miss things. Each room page is now also opened and scrolled in a real (invisible) browser, exactly as a person would — which loads the photo galleries that only appear once you scroll, and reads the caption the hotel actually prints beside each photo rather than the hidden description written for screen readers. Patina now imports its real captions (“Panoramic ocean views through floor-to-ceiling windows on three sides”); Four Seasons picks up captions it never gave us before. Navigation text, breadcrumbs and buttons like “VIEW FLOORPLAN” are filtered out, and a photo with no caption is left blank rather than given an invented one. Where a hotel writes no captions at all (Waldorf Astoria), nothing changes. Adds roughly 5–10 seconds per room to an import; the browser is reused across the rooms in one import and shuts itself down afterwards. Marriott-family hotels skip this entirely — their own data feed is better. |
| 2.13.5 | 24 Jul 2026 | 🔗 Linking a Hotel-Library room is now three quick dropdowns: Destination → Hotel → Room. The “Link to Library Room” picker on a hotel item used to be one long list of every room in every hotel in the library, which stopped being usable as soon as the library had a few resorts in it (29 rooms in one list today). Now you pick the destination first (Bali, Maldives …), then the hotel in that destination — with its room count shown next to it — then the room, listed by its own name and category with the photo count. If a destination only has one hotel on file it's selected for you; the room is never auto-picked, since linking the wrong villa would show the client the wrong room. Opening an existing proposal pre-fills all three dropdowns from whatever was already linked, and if a hotel is later deleted from the library, the room stays linked on proposals that already used it (flagged with a ⚠) instead of quietly disappearing from the client's “View Room” gallery. |
| 2.13.6 | 24 Jul 2026 | 👁 Preview any room, and 🔗 share a hotel or a single room with a client — no proposal needed. Two new things in the Hotel Library. Preview — every room now has a 👁 Preview button that opens exactly what a client sees: photos with arrows, swipe and arrow keys, each photo's caption, the video actually playing, and the 3D tour actually loading. If a video or tour link can't be embedded it says so plainly right there — so you find out, instead of the client seeing an empty box. Share — 🔗 Share hotel (top of the room list) creates a public link showing the whole property and all its rooms; 🔗 Share room on any room shares just that one. Send it before a quote exists — “here's the villa I'm suggesting.” It opens with no login, shows no prices and no proposal, and always reflects the current library content, so editing a room updates what the client sees. A room with a live link shows a 🔗 shared tag. “Stop sharing” kills every copy of that link immediately — anyone who still has it gets a polite “no longer available” page. There's also a Send on WhatsApp shortcut and an Open as the client sees it preview. Nothing in the library is public until you deliberately create a link. Treat a link as public — anyone you send it to can forward it. |
| 2.13.7 | 25 Jul 2026 | 🔒 “Stop sharing” is now permanent, and two people can build the same hotel at once. A full code audit found two faults in how the Hotel Library saves across devices — both fixed. 1. A cancelled link could come back to life. If you pressed “Stop sharing” and then any other device or old browser tab saved afterwards, the dead link quietly started working again for the client. Cancelling is now recorded as a permanent fact with a time on it, so it survives no matter which device saves next or in what order. Re-sharing on purpose still works normally and creates a fresh link. 2. Two agents adding rooms to the same hotel lost one of them. If you added a room on the office Mac and someone added a different room to that same hotel elsewhere, whoever saved second won and the other room vanished with no warning. Rooms are now saved individually, so both survive. Deleting also works properly now. Deleted hotels and rooms used to reappear from another device. They're now marked deleted rather than removed, so the deletion sticks everywhere — you won't see them, and any share link they had dies with them. Also: client-portal links are now rate-limited against guessing; a linked room whose library content has since changed shows “save this proposal to update what the client sees” in Proposals Studio; and the raw amenity list is now hidden from clients in all places (it was still showing in the portal's View Villa sheet and on Premium hotel cards). |
| 2.14.0 | 25 Jul 2026 | 🧭 Proposals Studio rebuilt around how you actually quote — plus two or three trips under one client link. 1. You can finally see which proposal you're in. A bar at the top of the builder shows the client name, reference and status, with real + New, ⇄ Switch and ⧉ Duplicate buttons. Before this there was no "new proposal" button at all — you had to press the red CLEAR ALL ITEMS, which only emptied the items and left the previous client's name sitting there. 2. Quote two or three trips side by side. Press + Offer a second option and the proposal is copied into Option A / Option B (up to four). Each option is a complete proposal of its own — its own reference, price, invoice and payment link — so nothing about accounts changes. Press 🔗 Client link and you get ONE link where the client switches between the options and compares them. Once they confirm one, it's marked with a ✓ so nobody is confused about which trip was agreed. 3. Ticket and confirmation numbers have moved out. Proposals Studio is for quoting before the client confirms, so the PNR, Galileo reference, e-ticket, seat and hotel confirmation-number boxes are gone from it — those belong to Vouchers Studio. Once Vouchers Studio has them, they appear here as a read-only note so you can still see them. Nothing was lost. 4. Pasting a hotel confirmation now fills the room for you. Paste the hotel's email into 📋 Paste hotel offer or confirmation and it fills the room type, check-in, check-out (nights calculate themselves) and the cancellation policy + date — the fields you used to retype by hand while reading them off the screen. It only fills empty boxes, so it never overwrites something you just corrected. 5. Less scrolling. Flight and Hotel are now the two main buttons (they are everything you actually add); Transfer, Cruise and Activity/Dining sit behind “+ Other service types”. Proposal Status, Cancellation Terms, Concierge Card and View & Export are folded shut until you click them, and the Studio remembers your preference. 6. One share button. 📤 SHARE WITH CLIENT replaces three buttons that all made the same link. One of the old ones checked nothing at all — it could publish a live client link with no items and no client name. That can't happen now. |
| 2.14.1 | 25 Jul 2026 | ⇄ Switch now opens a real list you click — and a worked example of quoting two hotels. Switch opens a proper picker instead of asking you to type a number. Proposals are grouped by client, so all of one client's trips sit together, and there's a search box for client, reference or trip name. Every row shows the reference, the trip, an Option A / Option B badge where it's part of a comparison, the date, how many items it has and its status. The proposal you currently have open is marked “open now”. Click a row to open it; Esc or clicking outside closes. Worked example — offering the same client a second hotel. Say Mr. Hamad Alroumi has been quoted the Waldorf Astoria and now wants to see the Ritz-Carlton as well: 1. ⇄ Switch → click his existing Maldives proposal. 2. + Offer a second option → name the comparison, e.g. “Waldorf Astoria vs Ritz-Carlton” (the client sees this as the heading). 3. The whole trip is copied and opens as Option B — same flights, same dates, same prices. The original becomes Option A automatically. 4. In Option B, change only the hotel: type Ritz-Carlton, press 🔍 GOOGLE LOOKUP for its address, phone and rating, then set the room and price — or paste the hotel's offer email into 📋 Paste hotel offer and the room, dates and cancellation policy fill themselves. 5. Press 📤 SHARE WITH CLIENT on Option B. 6. Press 🔗 Client link — that copies one link containing both options. Send it on WhatsApp. He opens that single link and sees a bar across the top with both trips, and taps to switch between them. If you forget to share one of the options, the 🔗 Client link button won't give you a half-empty comparison — it tells you which one still needs sharing. Once he decides, confirm that option and his link shows a ✓ on the trip he chose, so there's never a question later about which was agreed. |
| 2.14.2 | 26 Jul 2026 | 💳 Payment tasks now say which trip, and the invoice number is a link. When a client pays, the Task Board raises two urgent tasks — one for the agent to ticket with the supplier, one for accounts to release the supplier payment. They used to read “Finalize supplier payment — ET2607389”, which told you nothing about which trip it was without going and looking the invoice up. 1. The package name is now in the task itself. The title reads “Finalize supplier payment — Maldives & Dubai (ET2607389)”, and the description opens with the package and the client before the amount. You can see what it is from the list without opening it. 2. The ET number is clickable. Any ET… reference inside a task description is now a link that opens the Finance Suite Customer Ledger filtered to that invoice — one click from the task to the money. This works on your existing payment tasks too, not just new ones. If that invoice hasn't been broken down into ledger lines yet, Finance Suite says so plainly instead of showing an empty screen. |
| 2.14.3 | 26 Jul 2026 | 📅 My Calendar in the Task Board. A new 📅 My Calendar view (left sidebar, and a tab at the top of the board) shows your own tasks laid out on a month grid by due date — so you can see the week ahead instead of reading a list. It is always only your tasks, for every agent including management. This is your month; the all-staff picture stays in the Agency Hub master calendar. Move with ‹ ›, jump back with Today, or pick any month from the month box. Today's date is ringed in gold. Each task is a coloured strip — red Urgent, orange High, gold Medium — and clicking it opens the full task exactly as it does in the list. Completed tasks stay on the calendar with a ✓ and a line through them, so looking back at a past month shows what was actually done. Anything with no due date can't sit on a calendar, so it's listed underneath so it doesn't get lost. On a phone, swipe the calendar sideways for the rest of the week. |
| 2.13.6 | 26 Jul 2026 | 🔒 Approved is no longer the same as confirmed — the client's trip stays greyed out until they pay. Approving a proposal is the client saying yes; nothing is actually held with an airline or hotel until money arrives. Previously the portal flipped straight to "Booking Confirmed" the moment an agent set a proposal to Approved, showing flight and hotel cards as if they were live — with ticket/confirmation status on them — before a single fils had been collected. Now, between approval and the first payment, the client sees: a header reading "Approved — Awaiting Payment to Confirm", the flight/hotel/itinerary cards greyed out with a "🔒 Not secured yet" note explaining that seats, rooms and prices are confirmed once payment is received, and no "Confirmed" or "Ticketed" chips anywhere (even if Vouchers Studio has already recorded a PNR internally). The moment ANY payment lands — first deposit or full amount, whichever you asked for — everything unlocks automatically and reads as a live booking. Clients who have already paid are completely unaffected. |
| 2.13.7 | 26 Jul 2026 | 💳 The payment section moved to the top of the client's page, and two-option quotes now actually work. (1) Pay first: the payment schedule / "Pay via KNET" button now sits directly under the invoice header, above the itinerary — paying was previously buried below the entire trip detail. (2) Options A/B fixed: when you quoted a client two alternatives, neither one opened — the client saw an empty page with dashes instead of the trip. Both the "pick a trip" list and the shared options link now open the right proposal correctly. The list also labels them properly: each row shows OPTION A / OPTION B with its own price instead of two identically-named rows, and the option switcher reads "Option A · KWD 1,570" rather than repeating the package name twice. (3) Never-blank guarantee: a safety net now runs on every client page — if any future code path resolves a real proposal but fails to draw it, the page repairs itself instead of showing a client an empty shell. This exact failure had happened four separate times in different places. |
| 2.13.8 | 26 Jul 2026 | ➕ Add-ons — sell transfers, visas, VIP and extras on a trip the client has already paid for. Under "+ Other service types" in the item builder there are now four new chargeable types alongside the existing Activity/Dining, Transfer and Cruise: 🛂 Visa / Documents, ⭐ VIP Meet & Assist, 🛡 Insurance and 💠 Other Charge (amendment fees, special requests, anything else billable). Each takes a title, optional date, quantity/people, an optional reference or policy number, client-facing notes, its own price and its own cancellation policy — and shows to the client as its own service line. The important part: you can add these to a proposal that is already fully paid and locked. Adding a priced add-on automatically reopens the payment schedule and appends a new "Add-on services" installment for exactly the extra amount — your settled installments stay locked and untouched, and the client pays the difference from the same portal link, on the same invoice. Reprice the add-on and that one line adjusts; delete the add-on and it disappears again. No second invoice, nothing to work out by hand. |
| 2.13.9 | 26 Jul 2026 | 🔤 Comparison options: duplicate letters fixed, and you can now remove an option. Creating two options in quick succession — from a second tab, a second device, or a fast double-click — could hand out the same letter twice (Mr. Hamad Alroumi ended up with two "Option C"). The letters are now repaired automatically whenever a comparison is opened: the option created first keeps its letter and the duplicate moves to the next free one, so a clash fixes itself on whichever device you open next. There is also a new ✕ button on each option in the comparison strip. It asks whether you want to KEEP the proposal (just take it out of the comparison — it stays as its own separate proposal) or DELETE it outright, so removing an option can never silently destroy a real quote. An option the client has already approved cannot be removed — cancel the proposal instead. |
| 2.13.10 | 27 Jul 2026 | 👥 Fixed: every trip showed 2 travellers no matter how many you actually booked. When the old header "Adults / Children" boxes were removed, their hidden fields were left behind stuck at 2 adults, 0 children — and the client portal was still building its traveller list from those, not from the people you entered on the flights and rooms. So the e-ticket passenger table, the hotel voucher guest list and the PDFs all listed exactly 2 people on every booking (Mr. Naser Alhumaidi's ticket showed 2 passengers for a 4-traveller family; Mrs Wafaa's showed 2 for a party of 5). The headcount now comes from the trip itself — the largest flight carries the whole party, or with no flights the largest hotel stay — so it always matches what you entered. Proposals already sent correct themselves automatically, with no need to re-open or re-save them. 7 live proposals were affected and are now right. Where a trip genuinely has no passenger counts filled in (older imported records), nothing changes. The system also no longer invents a headcount it doesn't know: it shows nothing rather than guessing "2 Guests". |
| 2.14.0 | 27 Jul 2026 | ✦ New app — Add-Ons Studio. A dedicated place to sell extra services onto a trip that is already quoted, confirmed or fully paid, without going back into the (correctly locked) proposal. Search the trip by client or reference, pick a service type — Transfer, Activity/Dining, VIP Meet & Assist, Visa/Documents, Insurance or Other Charge — set the price, and it is added instantly. The client sees it on their existing portal link straight away, and the amount goes onto an "Add-on services" installment on the same invoice, leaving every settled payment untouched. You can save any service you sell often (with its price) and reuse it with one click next time. The panel shows the trip's total, what's paid and what's outstanding, plus buttons to copy the portal link, open it as the client sees it, or WhatsApp the client. Find it in the left icon rail, directly under Vouchers Studio (also in the top bar next to UPayments). |
| 2.14.1 | 27 Jul 2026 | 💰 Fixed: payment terms could ask the client for the wrong amount. When you duplicate a proposal into a comparison option, the copy inherits the original's payment terms. If you then changed the prices, the payment amount stayed frozen at the old figure — Mr Hamad Alroumi's three options quoted KWD 4,900 / 5,535 / 5,445 while every one of them asked the client to pay 4,280. Now: a single whole-trip payment line follows the trip price automatically as you edit rates. A real instalment plan (deposit + balance) is never rewritten silently — instead you get a clear amber warning showing both figures and a "Match payment terms to the trip price" button that adjusts the last unpaid instalment only, so anything the client has already paid is never touched. If you deliberately type a part amount, that is respected. Mr Alroumi's three options were corrected live. |
| 2.14.2 | 27 Jul 2026 | 🔤 Option letters now close their own gaps, and a paid trip stops offering comparisons. Delete option C from an A/B/C/D comparison and the rest re-letter themselves to A, B, C — the client never sees a letter apparently missing. (This runs whenever a comparison is opened, so it also repairs older groups.) Separately, "+ Offer a second option" no longer appears on a proposal that is confirmed and paid — there is nothing left to compare once the booking is done and collected. And once any payment has been received, the status dropdown locks to Approved with a note explaining why, so a paid client's trip can't be dragged back to Draft underneath them. |
| 2.14.3 | 27 Jul 2026 | 💳 A payment now confirms the booking by itself. The moment a real payment lands against a proposal — an instalment paid from the client's portal, or an ad-hoc UPayments collection you attach to the trip — the proposal moves to Approved by client automatically and stays there. The client immediately sees their full confirmed trip while your team is still filling in PNRs, vouchers and hotel confirmations. It never downgrades a status and never revives a cancelled or declined proposal. |
| 2.14.4 | 27 Jul 2026 | 🧾 The client now sees exactly what the price covers, and a quote never mentions services it doesn't include. (1) Itemised total: beside TOTAL PACKAGE PRICE the client now sees every service listed by name, exactly as you entered it in Proposals Studio — "Jazeera Airways · KWI → SSH", "Four Seasons Resort Sharm El Sheikh · 5 nights", plus any add-on — each with its own price (hidden automatically if you've turned prices off, and "On request" for anything marked TBC). No more scrolling back up to work out what's included. (2) Nothing irrelevant is mentioned: a hotel-only quote no longer offers a "Flights" link or section anywhere, and a flights-only quote no longer mentions hotels — in the Premium design the top menu and the numbered sections now renumber themselves so a hotel-only trip reads I. Your Stay, II. The Itinerary instead of starting at II with a dead Flights link. The classic layout already hid empty tabs; the printed breakdown does the same. (3) Add-ons now show their real name and details on the client's payment breakdown instead of a bare "Service" line. (4) In the Premium design the price section no longer always says "Flights, stay, transfers & services" — it now names only what is actually quoted (a hotel-only proposal simply reads "Stay") and lists each service with its own price underneath, matching the classic layout. |
| 2.14.5 | 27 Jul 2026 | ✦ An add-on now goes through Vouchers Studio before the client is told it's confirmed. Selling an extra onto an already-paid trip used to show the client ✓ Confirmed the instant you added it — nothing had been booked with the supplier yet — and offered them a voucher that was blank apart from a guest list copied from the whole trip (a one-person VIP meet listed two people). Now: (1) every add-on starts as Pending and stays there until an agent ticks Booking Confirmed on its card; (2) each add-on automatically appears on that trip's Vouchers Studio job, under Activities, marked "✦ Add-on — sold to client", where you book it, record the confirmation number, meeting point and notes, and upload the client's documents — all of which flows straight to their portal; (3) no voucher is offered until it's confirmed — the client reads "We're arranging this for you" instead; (4) the voucher's guest list uses the add-on's own Qty / People, not the trip's traveller count. Also fixed: adding an extra raised what the client was asked to pay but not the TOTAL PACKAGE PRICE shown next to it (ET2607192 read 195 while 215 was being collected) — the total is now always recomputed from the services on the trip. Two long-standing gaps closed along the way: an activity's confirmation number never reached the client, and every venue showed as "🎯 Activity" regardless of the Type you picked. |
| 2.14.5 | 28 Jul 2026 | 💬 Shared proposal links now show the client's own name in the WhatsApp preview. Pasting a portal link into WhatsApp (or iMessage, Slack, Telegram) used to show the same generic card for every client — "Elite Trip Concierge — Your Trip Proposal". It now reads "Mr. Naser Alhumaidi — Your Trip with Elite Trip Concierge" with the package name underneath, so the link looks personally prepared before the client even taps it. Works for a single proposal link and for a two/three-option comparison link. Nothing changes for the client after they tap — same page, same login. A link with no proposal behind it (or one that is draft, declined or cancelled) still shows the neutral card. Only the name and package appear — never prices, dates, references or traveller details — so a forwarded link never leaks trip specifics. Note: WhatsApp caches a link's preview for a while, so a link you shared before today may keep showing the old card; a freshly-copied link shows the new one. |
| 2.14.6 | 28 Jul 2026 | 🐛 Fixed: attaching a UPayments collection to a trip could show the client TWO payments for one charge. When you collect a payment in UPayments and press Attach to Trip, the amount is added to that trip's payment schedule. It always added a new line — even when the schedule already had an unpaid instalment for exactly that amount. Ms. Aria Alomar (ET2607262) had "Full Payment KWD 331" waiting; the 331 was collected, and her portal then showed two 331 lines — one paid, one still due — as if she owed another full payment. The client was only ever charged once (one payment record, KWD 331 + card fee); it was a display fault, not a double charge. Attaching now settles the matching unpaid instalment instead of duplicating it. A collection that doesn't match an existing amount — a genuine extra, an add-on, a top-up — still gets its own line as before. Ms. Alomar's record was corrected. No other client was affected. |
| 2.14.7 | 28 Jul 2026 | 📄 One-page PDFs fixed properly — the page size was being ignored all along. "Generate Summary PDF" was coming out on A4 across two pages at the wrong scale instead of the exact single page we agreed. The cause was found by measuring a real generated PDF rather than the code's intention: the app was calculating the right page size every time, but the rule was written into a stylesheet inside the page body, where the app's own print settings (A4, page numbers, running header) overruled it. It is now applied where it actually wins, and the print is isolated so nothing else from the screen can add height. Verified on three real proposals — a 1-item hotel quote, a 3-item flights+hotel trip, and Mrs Wafaa's 12-item booking — all now produce exactly one page, correctly scaled, nothing cut off, however long the trip. The same fault was found and fixed in the client's own documents: invoices and hotel vouchers downloaded from the client portal were spilling onto a second page because the height was measured before fonts and images had settled. Both are one page now. Also: the total line no longer says "Flights per sector" on a proposal that has no flights. Final step (same day): the print dialog was removed from the equation altogether. Chrome and Safari treat a page size set in CSS as a suggestion and fall back to your own printer paper setting (A4) — which is why it still split on your machine even after the rule was fixed. "Generate Summary PDF" and "Simple Summary" now draw the document and hand you a finished PDF file directly — no print dialog at all, identical on Mac, Windows, iPhone, Chrome and Safari. Verified end-to-end on three real proposals: a 1-item hotel quote, a 3-item flights+hotel trip and Mrs Wafaa's 12-item booking — all one page, correct width, logo and airline logos intact. |
| 2.14.8 | 28 Jul 2026 | ✨ New "PREMIUM PDF" button — the same clean one-pager in the Premium look. Next to "Generate Summary PDF" and "Simple Summary" there is now a third option. It produces the identical one-page document — services itemised with their rates, total, cancellation terms, payment schedule — but dressed in the Premium world the client already sees in their portal: the cover photo as a full-width hero with the destination in the serif headline and "Prepared for [client]" beneath it, warm ivory paper instead of white, hairline rules instead of boxes, and a quiet navy footer with your name and number. It uses the cover image from the Premium Proposal design toggle above; with no cover set it falls back to a deep navy hero, so it always works. Like the other two it is always exactly one page whatever the trip length, and downloads straight to you as a file. Verified on a 1-item hotel quote, a 3-item flights+hotel trip and Mrs Wafaa's 12-item booking. |
| 2.14.9 | 28 Jul 2026 | 💠 An extra is now named by what it actually is — never guessed as a restaurant. A "Seats Charges" line on Ms. Aria Alomar's trip reached her portal labelled 🍽 Restaurant. Cause: the Proposals Studio form behind + Other service types is shared with venue reservations, so every visa, VIP meet, insurance policy and charge was silently saved with the venue type "restaurant" — invisible until the client portal started showing venue categories. Now: (1) an add-on never carries a venue type at all, and (2) wherever it appears — itinerary, service list, voucher tab, Vouchers Studio card — it is named by its own kind: 🚐 Private Transfer, ⭐ VIP Meet & Assist, 🛂 Visa / Documents, 🛡 Travel Insurance, 💠 Additional Charge. The restaurant/cafe/beach-club dropdown no longer appears on an add-on's card in Vouchers Studio, so it can't be re-typed by accident either. One behaviour change to know: extras built under "+ Other service types" now follow the same rule as Add-Ons Studio ones — the client sees them as Pending until an agent ticks Booking Confirmed in Vouchers Studio, and they now appear on the job's Activities tab automatically so they can be booked and documented. Two existing records were corrected. |
| 2.14.10 | 28 Jul 2026 | 💺 Seat Selection is now its own service type. Seat charges were being sold as a generic "Other Charge" and reached the client as a plain 💠. There is now a dedicated 💺 Seat Selection type in both Proposals Studio (under "+ Other service types") and Add-Ons Studio — pick it and the client sees an airline-seat icon and the words "Seat Selection" on their itinerary, service list and voucher tab, and so does the matching card in Vouchers Studio. Retyping an extra later (say Other Charge → Seat Selection) now updates its Vouchers Studio card too, instead of leaving the old icon behind. Ms. Aria Alomar's existing "Seats Charges" line was moved onto the new type. |
| 2.14.12 | 28 Jul 2026 | 🔗 Everything sold on a proposal now gets a card in Vouchers Studio. Until now a job copied the trip's flights and hotels once, at the moment it was created, and started Transfers and Activities empty — so a hotel added to a confirmed trip afterwards, a transfer, a restaurant, a cruise or an add-on never reached the person who has to actually book it. Vouchers Studio now re-checks the proposal every time it opens and creates a card for anything that doesn't have one, linked to its line on the proposal. It only ever adds — your checklist progress, confirmation numbers and uploaded documents are never touched, and cards you typed in yourself are matched by name rather than duplicated. Two deliberate limits: if a ticket import has already split a flight into separate legs, that trip's flights are left exactly as they are (we can't tell which leg belongs to which quoted flight, and guessing would double-book your checklist); and removing a service from a proposal leaves its card here for you to delete by hand, since it may already hold the client's documents. |
| 2.14.9 | 28 Jul 2026 | 🐛 Fixed: on a comparison link, "Pay by card" reloaded the page and the payment methods disappeared. When a client opened a two/three-option comparison link and pressed a payment button, the page reloaded straight back to the proposal with no way to pay. (A normal single-proposal link was unaffected.) Two causes, both fixed: the payment step only knew how to find a trip from a single-proposal link and found nothing on a comparison link; and even once it did, the proposal page was being drawn over the payment page a moment later. Verified end-to-end on Mr Hamad Alroumi's live comparison link — both instalments, on both KNET and card. |
| 2.14.10 | 28 Jul 2026 | 💳 One payment method per instalment — no more mixed signals to the client. An instalment used to offer both KNET and card, so a client could pay a "credit card" instalment by KNET and skip the 2.5%, and a split payment was confusing to follow. The tick box in the payment schedule is now a straight either/or, relabelled "Credit card only · +2.5% (unticked = KNET only)": • Ticked → the client sees only Pay by Credit Card, and on the payment page only Visa/Mastercard, Apple Pay, Google Pay and Samsung Pay. The 2.5% is added. • Unticked → the client sees only Pay via KNET, and on the payment page only KNET and Apple Pay (KNET). No surcharge. The button is also renamed from "Pay by card" to "Pay by Credit Card" so there is no doubt what it charges. Your setting is now final: an old or hand-edited payment link can no longer switch an instalment onto the other rail (which could have added 2.5% you never agreed). And a safety net was added: if a client ever clicks a payment button and the page can't work out which trip it belongs to, it now recovers and shows the correct payment page instead of dropping them back on the proposal — whatever kind of link they came from. Verified on Mr Hamad Alroumi's live split: 2,520 credit (charged 2,583.000) and 1,940 KNET. |
| 2.14.11 | 28 Jul 2026 | ✨ Fixed: a Premium proposal flashed the normal design for a second before switching. Opening or refreshing a Premium link showed the classic layout first, then swapped to Premium — because the classic page is built into the file and paints immediately, while the Premium design can only be drawn once the trip data arrives. The trip layout is now held back until the real proposal is in hand, then the correct design appears once, already filled in. A second thing this fixed: that static layout carries placeholder figures — "6 FLIGHTS · 7 HOTELS · 22 DAYS" — so every client, on every link, was briefly shown numbers that were not theirs. Nobody sees those now. The sign-in screen and trip chooser still appear instantly, and if anything ever goes wrong the page reveals itself after 3 seconds regardless, so a client can never be left waiting on a spinner. Measured on a throttled phone connection: zero frames of the wrong design, on Premium and classic links alike. |
| 2.14.12 | 28 Jul 2026 | ✈ Fixed: a Business sector could be shown to the client as First Class. The cabin is worked out from the single booking-class letter on the Galileo line you paste, and the letter P was being read as First. Most Gulf carriers use P for discounted Business — so Mrs Wafaa's Kuwait Airways Kuwait→Bangkok sector (ET2607162) was quoted to the client as First Class when it was Business. Her real seats on the ticket, 12A–17A, are the Business cabin. P now reads as Business; F and A still mean First. More importantly — your own choice now wins. Previously, pressing Apply after a Quick Parse or a flight lookup overwrote the Class dropdown with whatever the letter suggested, so a cabin you had set by hand could be silently changed back. Once you pick the class yourself, nothing re-derives it — not a re-parse, not a fresh flight lookup, not re-opening the item. Mrs Wafaa's proposal, its Vouchers Studio job card and her live client link were all corrected. |
| 2.16.0 | 28 Jul 2026 | 🏷 Hotel logos on client documents. Open Edit Hotel in the Hotel & Room Library and you'll find a Hotel logo section: upload a logo file, or paste the hotel's website and press Fetch to pull it automatically. You see it on cream and on navy side by side before saving, because most luxury hotel logos are white files — dropped straight onto a cream page they would be invisible. The right treatment (navy chip / white tile / no chip) is chosen for you by measuring the file, and you can override it. The logo then appears on the client portal hotel cards, the premium “Your Stay” section, the Proposals Studio client document and the PDFs. It belongs to the hotel you created in the library — a hotel that isn't in your library shows no logo, so nothing ever appears on a client document that nobody chose. Fetch works on roughly half of hotel sites; where it doesn't (Waldorf Astoria's site only ever returns the Hilton mark), upload the file yourself. |
| 2.16.2 | 28 Jul 2026 | 💳 Fixed — a payment link stayed live after the client had paid. A client who reopened their WhatsApp link was shown a working payment page for money they had already sent. Five real links were in that state. A link now closes as soon as the payment is genuinely received, and the client sees a calm “Already Paid — no further payment is needed” page instead. Before showing anything, the system checks the real transaction status with UPayments directly, so a payment that went through but never reached us is still recognised (and the books are corrected at the same time). If a payment fails or is abandoned, the link stays fully usable — only a genuine capture ever closes it. Attaching a payment to an invoice now also updates the link it came from. |
| 2.16.4 | 28 Jul 2026 | 🏨 Import now finds every villa, and never imports the same one twice. Two problems: villa types whose web address didn't contain a word like “villa” or “suite” were silently skipped (One&Only Mandarina's Treehouse), and villas that are only listed on a category page were never reached at all (Villa Pacifico and Villa One). Import now follows the hotel's own page structure a level deeper — that site went from 6 accommodations found to 9. Re-importing is now safe. Anything already in the library is marked “already in library” and is updated rather than added again, keeping its link to any proposal that already uses it. Use + Add as new if it really is a different room. For duplicates already created, there's a new ⧉ Find Duplicates button: it lists every hotel or room recorded twice and merges them, always keeping the original record so existing proposals stay linked. |
| 2.16.6 | 28 Jul 2026 | 🏨 “Find Rooms” is ~2.5× faster, tells you it's working, and no longer offers accessible rooms. Reading a large hotel's site could take almost a minute while the screen showed a motionless “Reading the page…”, so it looked stuck. On Waldorf Astoria Beverly Hills the rooms were found correctly five times and never seen, because the wizard had been closed and reopened before each answer came back. Nothing was broken — it was the wait. Three changes: the pages are now read several at a time instead of one after another (54s → 21s on that hotel); the button counts the seconds and locks while it works, so it can't look frozen and can't be pressed on top of itself; and if you close and reopen the wizard mid-search, the late answer is discarded rather than shown against a different hotel — previously it could have imported one hotel's rooms into another. Accessible rooms are no longer offered for import at all. Mobility-, hearing- and roll-in-shower variants are the same room type with adaptations, not a product you sell, and Waldorf Astoria Beverly Hills listed 14 of them among 30 “rooms”, burying the 14 real types. They are dropped at the search stage, on every hotel and every kind of hotel site. A guest who needs one is handled by request to the hotel, as before. |
| 2.16.7 | 28 Jul 2026 | 💰 Importing rooms now mostly costs nothing, and re-importing costs nothing at all. The import tool rents a paid service (Firecrawl) to read hotel websites — 1,000 “credits” a month, and reading one room page costs 5 of them. 700 were gone in five days. Two changes, no new subscription: 1. We now read the hotel's room list with our own browser — the one already on our server that fetches your room photos. Measured on five real hotels: Waldorf Astoria Beverly Hills, One&Only Mandarina, Patina Maldives and Ritz-Carlton Maldives now cost zero, and return exactly the same rooms as before. Four Seasons Jimbaran is built in a way our browser can't read, so it still uses the paid service and still finds all 15 villas — the paid service is now the backup, not the default, and no hotel finds fewer rooms than it did. 2. A page read in the last 24 hours is not read again. Re-import a hotel to fix one villa and you no longer re-pay for the other nine — 28% of every room read so far was a repeat. A reused page shows ♻ from today's copy in the review list, so you always know when you're looking at this morning's version rather than a fresh read; the next day it reads fresh automatically. Two long-standing import bugs fell out of the testing: Patina was offering an image file as a villa (the word “content” in its web address contains “tent”), and was listing nine of its villas twice — once in English and once under an English-language address. Patina now returns exactly its 10 real villa types. |
| 2.16.8 | 28 Jul 2026 | 💰 Importing a room now costs about half a US cent instead of 5 rented credits. Reading a room page used to be rented from Firecrawl at 5 credits each — 650 of the first 701 credits. Our own server's browser already loads, scrolls and settles that exact page to collect the photos, so its text was sitting there unused. It is now read by Claude Haiku instead: measured across Waldorf Astoria Beverly Hills, One&Only Mandarina and Patina Maldives, zero credits and ~US$0.0027 per room, about 10 seconds — the same speed as before. The imported text got better, not just cheaper. On the same six rooms: Patina's One Bedroom Water Pool Villa came back with a 428-character description instead of 211, and its Beach House 420 instead of 143; feature bullets went from 5 to 12 on the Waldorf Villa Suite and 3 to 8 on Villa Pacifico. Room names are also no longer SHOUTED IN CAPITALS when the hotel's page shouts them. Nothing about photos changed — they still come from the browser, and captions still come only from the hotel's own wording, never written by AI. Hotels our browser cannot read still work exactly as before. Four Seasons Jimbaran serves our browser a blocking page; the system detects that the result is too thin to be a real room and falls back to the paid service automatically, still returning the full villa. So the paid service is now the backup: at these rates the free monthly allowance should stop being something you ever hit. |
| 2.19.1 | 2 Aug 2026 | 🔔 A flight alert now names a real flight, and checks the booking that actually holds it. Rashed Alotaibi's trip raised "⚠ Flight not found on ViewTrip — KU673 KWI DXB MLE" three separate times. The flight had never moved: KU 673 departs 15:00 exactly as booked. What happened. That card is one card holding two different bookings — KU 673 Kuwait→Dubai on Travelport file HLMRCY, then EK 656 Dubai→Malé on HLMS9T. A card could only store one reference, so it kept the Emirates one, while the check took the card's first flight number, the Kuwait Airways one. It asked the Emirates booking for a Kuwait Airways flight, which was never in it, and reported it missing. Three alarms on a flight that was on time — and the leg it named had in fact never been checked by anything. Each leg is now checked on its own: its own booking reference, its own date, its own flight number, reported under its own route ("KWI → DXB", not "KWI DXB MLE"). Timing follows each leg's real departure, so a second leg leaving the following night is no longer judged by the first leg's clock. Across the live trips this brought 3 legs that were never being checked at all under the monitor. And when the reference doesn't belong to that leg, it no longer cries wolf — it verifies the flight against the airline's own schedule instead, and stays silent unless the time genuinely differs. A booking that resolves without its own segment is still treated as a real finding, because that one is real. Every open flight alert was re-verified against live ViewTrip. Eight were confirmed false and closed with the reason written on each: Rashed's three, Aria Alomar's two (KU 101 10:00 AM and KU 102 4:45 PM, both exact — the timezone bug), Abdullah Alhajji's one, and two on a proposal that no longer exists. Two are real and left open, both on Hamad Alsumait's trip: EK 2051 on 14 Aug moved 17:40 → 17:25, and EK 708 on 23 Aug moved 22:45 → 23:55. |
| 2.19.0 | 31 Jul 2026 | 🎫 A seat or ticket number can no longer be shown against the wrong passenger. Seats, e-ticket numbers and airline references were stored as a plain list — "15J, 15H" — and the client portal handed the first one to the first traveller, the second to the second, and so on. That works only while the traveller list is never reordered and nobody is added in the middle. When it wasn't, a client was shown another passenger's seat or ticket number under their own name — the one mistake that becomes visible at an airport counter. Across 408 live trips this had affected five, all repaired. Every list now records who it is for. Vouchers Studio writes the travellers' names alongside the values, and the portal looks each traveller up by name instead of counting positions. Reorder the roster, add a traveller, import a second airline's ticket — everyone still sees their own seat. When it cannot be certain, it shows a dash. If a list has a different number of entries than there are travellers, or this traveller isn't on that particular ticket, the portal shows "—" rather than a number that might belong to someone else. A blank a client asks about is recoverable; a confident wrong ticket number is not. Vouchers Studio warns the agent on the card itself, naming the expected order, so the gap is fixed where it can actually be fixed. 👁 Import Ticket PDF now says what it could NOT read. A field the parser missed and a field the ticket genuinely leaves blank used to look identical — an empty box — so it got filled in from memory, which is where most of these errors began. The review screen now lists, per flight, exactly what the ticket did not give us: flight number, departure date, baggage, and any traveller left without a seat, by name. 🔗 A confirmation card follows its proposal again. Vouchers Studio cards were copied from the proposal once, when the job was created, and never looked again — so a date corrected or a room type changed in Proposals Studio afterwards never reached the voucher. Cards now stay in step with the proposal automatically. A card touched by a ticket import, or edited by an agent, keeps what it holds: the issued fact beats the quoted one, and your correction is never quietly undone. |
| 2.19.1 | 1 Aug 2026 | 💰 We were paying Google again for answers we already had. A US$53.73 bill prompted a look at what the platform actually asks Google for. Two places were re-buying the same information: Venue photos were re-fetched on every single view. The photo on a concierge recommendation was pulled fresh from Google each time anyone opened the card or the client opened their portal — 2,759 fetches in July for 1,179 distinct pictures, and 782 of those came from client portals, so the cost grew every time a client looked at their own trip. One live portal alone carries 48 venue photos: opening it used to bill 48 requests, every time. Each photo is now kept on our own server the first time it is needed and served from there afterwards. Measured on that portal: first pass 48 fetched from Google, second pass 48 out of 48 served locally, zero requests to Google. A client re-reading their trip a dozen times now costs nothing. Venue lookups had a cache that nothing ever read. Every "enrich" in Concierge Desk searched Google by name — 1,801 searches for 1,298 distinct venues. The results were being written to a cache table that no part of the system ever looked in, so the same wording was bought again each time. It is now read before Google is called: a repeat search returned in 9 milliseconds instead of 395, with identical details. The bigger fix is for venues Google cannot find. A failed match saved nothing, so re-running Enrich to pick up the stragglers — exactly what the screen tells you to do — re-bought every failure at full price. A "not found" is now remembered too, and stops being re-billed. Nothing changed on screen. Same photos, same addresses, same opening hours. Stored information is refreshed every 30 days, which is the limit Google's terms allow, so a venue that changes its phone number or hours is still picked up. |
| 2.19.2 | 2 Aug 2026 | 📸 A venue's photograph now comes from the venue, not from Google. Enriching a recommendation no longer asks Google first. It searches for the venue's own website and takes the photograph from there — free, and measurably better: Nikki Beach Koh Samui came back at 2500×1406 from its own site instead of Google's 400-pixel guest snapshot. Google is still asked afterwards, but only for the things nobody else reliably publishes: address, opening hours and rating. That was tested, not assumed — venue websites give a phone number about two thirds of the time and an address almost never, and OpenStreetMap matched only 1 venue in 8, so it was left out altogether. 1,506 of your 1,675 recommendations now carry a photograph, up from 1,155. A one-off pass filled 351 venues that had none, without spending anything at Google. Where a venue publishes no share image, the system now reads the pictures on the page itself — that single change took the success rate from 17% to 67%. A photograph has to earn its place. Del Place's website served its website-template's stock demo picture — a photograph of somewhere else entirely. It was rejected and the card fell back to Google. Every candidate must clear the same bar: not a template or demo image, not a logo or icon, over 15 KB, and at least 400×260 real pixels. The one place to be careful is shopping: a fashion house's website shows its clothes or its flagship store, not the boutique in Porto Cervo, so photos on shopping cards are worth a glance before a card goes to a client. Firecrawl is in the chain as a backup for sites that block us, and it still cannot spend below its credit reserve. |
| 2.19.14 | 5 Aug 2026 | ⚠️ A trip can be live in two versions at once — and one of them is the one your client pays. Hamad Albahar's rates were edited in Proposals Studio. The edit reached the copy the client portal reads, but not the copy the staff apps read. For a while the client was being asked for KWD 13,005 for a Superior Room Garden View, while a colleague looking at the same trip saw KWD 12,880 for a Premier Room Beach Access. Had he saved from that screen, the older price would have been written back over the one the client was paying. Both copies were put back in step and the client paid the correct amount. Why it happens, so you can watch for it: saving in Proposals Studio writes the client's copy immediately, while the staff copy follows separately from your browser. If they fall out of step, the client portal is the one that is right — it is what the client actually sees and pays. If a colleague's screen disagrees with the portal, do not save from that screen. Reload it first. Tell us and we will re-sync. ✈️ Return flights are merged again — but only when it is genuinely one ticket. A there-and-back on a single airline now shows as one line, "KWI → ALY → KWI", instead of an outbound price beside a return reading "Included". It only merges when the proposal has exactly two flights, on the same airline, the return reverses the outbound, and the return carries no price of its own. Two separately priced flights stay two lines, because they are two purchases. Checked against every live proposal before switching on: 10 merge, all plain return trips, and no trip's total changes by a fill. Multi-city journeys are untouched. The itinerary still lists both flights — only the price breakdown folds. 🗓 "Overdue" no longer appears on the day a payment is due. A payment due today was being shown to the client in red as late, on every trip, because the system treated the due date as already past the moment that day began. It now turns red only once the due day has actually finished. |
| 2.19.15 | 5 Aug 2026 | 🔒 "Non-refundable" reads like a term now, not like an error. The badge was a red cross on an alarm-red panel — the same treatment you would give a failure — sitting on a KWD 13,000 booking where non-refundable is simply the rate that was bought. It is now a padlock on a quiet grey: "Non-refundable once paid". Red is kept for the one case that is real news — a free cancellation that has lapsed. That badge stays red, keeps the date it expired, and now carries a warning mark instead of a cross. When every policy looks like an alarm, none of them is read. "Once paid", not "once booked". Your client reads this while deciding whether to press pay, and "booked" leaves him asking booked by whom, and when. Payment is the moment his money is committed — and it is how the platform works, since approved is not confirmed until the money lands. The printed hotel voucher now carries the identical wording, so nobody reads one thing on the portal and another on the document they hand over at check-in. |
| 2.19.22 | 8 Aug 2026 | 🎫 Your own tickets now check each other, and the airline can tell us directly. Two more layers, both free, neither depending on a website that can be blocked or taken offline. 1 — Tickets as witnesses. Every issued ticket is evidence an airline produced against a real booking, and comparing them settles what no feed can. Two tickets for the same flight on the same date with different times means one of those documents is wrong and a client is holding it — that raises an urgent alert naming both trips. The same flight on different dates with different times is not a problem at all: it proves the airline retimes that flight by date, which is exactly what happened with Adel Almajed's KU674. Three of your flights are now proven date-variable (KU674, KU101, KU163), and for those the schedule feed's single generic time is no longer treated as evidence — the false alarm that started all this can no longer be raised. Checked across all 26 ticketed legs: no two tickets disagree. 2 — Schedule-change emails. When an airline or the GDS retimes or cancels a flight they send a message about it, naming the booking reference. That mailbox is now read every 20 minutes: the reference is matched to the trip and an urgent task is raised quoting exactly what the airline said. This is the airline telling us rather than us inferring, so it outranks every other layer. It never edits a proposal — a person confirms and updates, as with every other alert. ⚠ One step is needed from Ahmad for layer 2 to receive anything: airlines send these to the address on the booking. Point your PNRs' contact address at an operations mailbox (or have the ticketing consolidator forward schedule-change notices there) and give us its details. Until then the layer is live and idle — it reads the portal mailbox, where these messages do not arrive. |
| 2.19.21 | 8 Aug 2026 | 🎫 Forgotten ticket uploads now chase themselves. A ticket the agency had issued turned out to exist nowhere in the platform — no job, no booking reference, no invoice — because the upload was simply forgotten. Every check we run can only watch what is IN the system, so a new morning job watches for what should be in it and is not: an approved trip with upcoming flights and no booking reference anywhere (no flight card, no segment, no Vouchers Studio job, nothing in the ticket vault) gets one Task Board task assigned to the ticketing agent and one clear WhatsApp each morning listing every waiting trip, marked ⚠ inside 7 days of departure. The off switch is the task itself. Upload the ticket and the reminders stop on their own. If the client booked their own ticket and there is nothing to upload — it happens — mark the task done and that trip goes quiet for good. One message a morning, never a barrage. |
| 2.19.20 | 8 Aug 2026 | ✈️ A flight alert now says "our sources disagree", never "the airline changed your flight". Adel Almajed's KU674 raised a "flight time changed" alert claiming Kuwait Airways had moved his 8:50 PM departure to 6:55 PM. Ahmad checked the airline's own Manage Booking page: the ticket was right all along — KU674 genuinely departs 20:50 on 15 Aug. The schedule feed we compare against carries one generic daily time (18:55), and airlines retime individual dates without that feed knowing. The same flight five days earlier really does leave at 18:55. The alert wording now tells the truth: it names both times, says the sources disagree, and sends you to the airline's Manage Booking page — which knows the exact booking — before anything is said to a client. The feed is a witness, not a judge. A checked flight stays checked. Once a time is verified against the airline itself, it is recorded on the leg with who confirmed it and when, and the feed disagreeing with a human-confirmed time is silenced — no repeat of the same false alarm at 3 days, 24 hours and 12 hours out. Proven on Adel's own leg before closing the alert. Also (2.19.16, 7 Aug): every uploaded GDS ticket PDF is now kept in a vault on our server, tied to its trip (previously it was read once and thrown away), and Vouchers Studio shows an airline check on every imported leg before you press Apply — green when the airline agrees, amber when something is missing (including a leg with no booking reference, which can never be verified), red when the sources disagree. A shared reference across two legs is labelled "return on one ticket", not flagged as a duplicate. 🛡 The baseline guard — a real change is a source changing against ITSELF. The first schedule answer for every upcoming leg is now recorded as that leg's baseline (all 17 upcoming legs were seeded on 8 Aug, every one matching its ticket). From then on: the feed moving against its own earlier answer raises a loud "airline appears to have RETIMED" alert — the strongest sign of a genuine change — while a stable feed that merely disagrees with the ticket says "sources disagree" once, ever, and never repeats at 3 days, 24 hours or 12 hours. A feed that moves TO the ticketed or human-confirmed time is good news and stays silent. |
| 2.19.17 | 5 Aug 2026 | 🎫 A ticket or voucher can no longer be downloaded before it is a real document. A client who had paid could open his "e-ticket" and find no airline reference, no ticket number, and a passenger row reading TRAVELLER 2. It reads as though we booked the wrong person, or never booked at all — and that is exactly the feedback we received. The rule now, on the portal, the phone app and every shared PDF link: • No hotel voucher without the hotel confirmation number (HCN). • No e-ticket without the airline reference AND the e-ticket number — for every passenger on it, not just the first. Seats are not required, since airlines often release them only at the airport. • No document at all while a passenger or guest is still a placeholder ("TRAVELLER 2", "CHILD 1"). In place of the download the client sees a quiet line — "Your voucher will be available here once the hotel confirmation number is issued." Nothing to switch on: the button returns by itself the moment you enter the missing detail in Vouchers Studio. The passenger table stopped inventing people. While the real names are still unknown the flight card no longer prints a fake roster of dashes; it states the party size — "2 Adults" — and says the names arrive with the tickets. And e-ticket numbers held only in Vouchers Studio now reach the portal: they were being shown as a dash on trips where the numbers existed all along. What this means for you: a trip whose references are not yet entered will show your client no download button. 9 current trips are in that state today — most of them simply need the HCN adding. |
| 2.19.18 | 5 Aug 2026 | ✅ There is now ONE copy of a trip, not two. This closes the problem behind the warning in 2.19.14. Until today your apps read a different copy of each trip than your client's portal did, and the two were written by different routes — the client's the instant you saved, yours afterwards from your browser. If that second step did not finish because a tab was closed, a session had expired or a connection dropped, your screen quietly kept the old version and nothing said so. Your apps now read exactly what your client reads. Nothing changed on any screen and nothing changed about how you work — Proposals Studio, Vouchers Studio, Finance Suite and Agency Hub simply cannot show you a stale trip any more. Checked before switching over: all 411 proposals matched one-to-one, with no trip missing on either side. 🔔 And a watchman, in case anything ever drifts again. Every hour a check compares what your client sees against what your staff see, across every proposal. If they ever disagree it sends Ahmad a WhatsApp naming the trip, the client, and each difference side by side. It only ever looks — it never changes a trip, because deciding which price is right is a person's job, not a machine's. Its first run found nothing across all 411. The rule if you ever get that message: the client portal is the correct one — it is what the client actually pays against. Reload the staff screen rather than saving from it, and tell us. |
| 2.19.19 | 5 Aug 2026 | ✈️ Your client no longer has to know what LGW means. The services list under TOTAL PACKAGE PRICE spoke in airport codes — "KWI → MRU", "LHR → MXP". It now reads Kuwait City → Mauritius and London → Milan. The code is kept in brackets only where the city alone would be ambiguous — a Gatwick-to-Heathrow move would otherwise read "London → London". The destination is named the way the client bought it, not the way a reservation system files it: MRU is "Port Louis" to the GDS and Mauritius to the man paying for it — the same reasoning already used for Seychelles. ◈ Emoji are gone from the price card. 🏨 and ✈ were being drawn by each client's own phone — different shape and colour on every device, full-colour cartoons beside a KWD figure. They are now drawn line-icons in the platform's gold, identical everywhere, and matching the rest of the document. ⏱ A layover was reading a full day too long. On a flight landing after midnight, Rome–Dubai–Kuwait showed "Layover DXB · 33h 15m" for a real 9h 15m connection, and the date printed under the arrival time was the day the flight left, not the day it landed. Both fixed. The connection time is now worked out by the portal itself from the two flights' own clocks, instead of trusting a figure stored when the proposal was built — and it reads "Layover in Dubai", not "DXB". A layover is always the same airport twice, so no timezone is involved: it is simply the next departure minus the previous arrival, counting the extra day when the flight lands after midnight. |
| 2.19.24 | 10 Aug 2026 | 💳 Payment links you created from the UPayments tab were dead for every client. Reported today after five links went to the Alkhonaini party: the client opened the page, saw the right name and the right amount, tapped KNET or Apple Pay, and got "could not start payment: this payment link could not be verified". Both methods, every client. Why: the server checks the amount against its own records before it will open a payment session — from the invoice, or from the payment line on the trip. An ad-hoc link (you type a name and an amount, no trip attached) has neither: the amount is recorded on the link itself, and that was the one place the check never looked. So it found nothing, treated the request as unverifiable, and refused before UPayments was ever contacted. This was not an Apple Pay fault — Apple Pay simply failed the same way KNET did. Fixed. The link's own recorded amount now counts as proof, because it is a record you created while signed in, read back by us — not a number sent by the client's phone. Links already sent keep working — nobody needs a new one. Trip-attached links and portal instalments were never affected. 🍎 And Apple Pay no longer appears where it cannot run. It needs Safari on an Apple device — it does not exist in Chrome on Android, in Chrome on iPhone, or inside the browser WhatsApp opens a link in. The tile was shown to everyone, so a client on any of those tapped it and hit a dead end. It is now shown only where it will actually work, and an Apple user who opened the link inside another app is told: "Paying with Apple Pay? Open this link in Safari." |
| 2.19.25 | 10 Aug 2026 | 📎 Attaching a document works again — it had been failing silently for everyone. You picked the file, it read successfully, you pressed Attach… and nothing happened. Not your file and not your phone: documents were being stored as text inside the shared data every app keeps a copy of in the browser, and that store was 99% full — 5,147,360 characters used of a 5,200,000 ceiling, about 38 KB free. Mr Ahmad Almajed's 1.4 MB visa needed roughly 36 times that, so the browser refused the write and, with nothing catching the refusal, the save died before it ever reached the server. No error, no document. Documents are now real files on the server, exactly as hotel photos and logos already were. Only the file's name and label travel in the shared data, so attaching a large PDF costs the browser nothing and every app gets its breathing room back. Anything already attached keeps working untouched. 🔒 Where they are kept. Visas and passports are not in the public photo folder — they sit outside it and are released only against your own login, or, for a client, against their personal trip link and only for their own trip. Checked before shipping: the owner's link opens the file, another client's link is refused, and the file is unreachable from any public address. 👥 Guest names can now be typed in Vouchers Studio. On every hotel, under the HCN: Guest Names on the Reservation. Add each guest with their title and full name as in the passport. This is what unlocks the client's voucher — the portal will not issue one while the names are still "Traveller 2 / Child 1", because a voucher naming the wrong person is worse than no voucher. If the trip already knows the names, one button copies them across; placeholders are deliberately not copied. Proposals Studio still has the same field — either desk works, and they write to the same place. |
| 2.19.27 | 19 Aug 2026 | 🎫 One ticket is now one document. Ms Aria Alomar flew Kuwait–London and back on a single Kuwait Airways ticket, and the portal handed her two PDFs — both quoting the same airline ref 9E7KJJ and the same e-ticket 2296908712814. She asked whether she had been booked twice. Why it happened: a return is entered as two flight lines, correctly — two dates, two flight numbers — and the ticket document was built per LINE. An airline issues one e-ticket per itinerary and lists every sector on it. Now: documents are grouped by the e-ticket number (or the airline reference when there is no ticket number yet). One PDF, sectors stacked in date order, one masthead and one footer. The flight cards still show one per sector — the client really does take two flights — but the download button appears once, on the first sector, reading "PDF Ticket · 2 sectors"; the later sector says "Included on the same e-ticket as KWI → LHR". A flight on its own separate ticket is unaffected: Mr Alotaibi still has four, because his really are four. Checked before switching on: all 425 ticket documents across every live trip were replayed — 417 after grouping, no sector lost anywhere. Six trips were affected (Alkhunaini 6→3, Alsumait, Alhajji, Aria, Albahar, Adel Almajed). 🧩 "Activities" is now "Add-Ons". Transfers, extra baggage and prepaid seats were never activities, and the tab now says what it holds. 📅 And a standing rule on dates. A day-name, a sort order or a duration must always be worked out from the real date, never re-read from the printed text — "05 Sept" carries no year, and a parser handed that resolves it to 2001. The nightly calendar check now covers flight sector dates and multi-sector ticket order as well as hotels: 186 hotel dates, 102 flight dates, 8 combined tickets and 143 trips verified clean. Separately, 80 weekday/date pairs on 12 real client links were cross-checked against the calendar by hand — no mismatches. |
| 2.18.4 | 29 Jul 2026 | 🪭 A photograph that appears in nearly every room belongs to none of them. Mandarin Oriental injects two images into every room page — the brand's fan artwork and one promo room shot. Photography genuinely shared between suites appears in three to six rooms; only the page's own furniture appears in all of them. ⟳ Rebuild this hotel now counts each photograph across the hotel's rooms and, when one shows up in nearly every room, offers to remove it everywhere. It asks first — some hotels repeat real property photography that widely (Waldorf Beverly Hills does), and whether to keep that is your judgement, not a rule's. |
| 2.18.3 | 29 Jul 2026 | ⟳ Rebuild one hotel, and preview cards can no longer pose as photographs. Small "cover" crops are refused outright. On Mandarin Oriental every room page carries preview tiles of the other rooms at 624×300 — and those tiles exist only at that size, so nothing bigger could outrank them. A cover crop under 1000px is a card, never a photograph; a room's real photos appear at full size on its own page. New button: ⟳ Rebuild this hotel. Re-reads every imported room of the selected hotel and replaces what was imported — the repair for one hotel that went wrong, in a few minutes, without the 40-minute whole-library pass. Same one-click Undo. A lesson from this hotel worth keeping: 🧹 Remove repeated photos treats a photograph shared by 3+ rooms as the property's — but some hotels (this one included) genuinely reuse photography across their suites, and there 🧹 strips rooms to a single photo. It always asks first; for a hotel like this, answer no. |
| 2.18.2 | 29 Jul 2026 | 🖼 Two more ways a wrong or poor photograph could arrive, both closed. Six Senses put a marketing pop-up's photograph into three villas. The image came from an advertising widget on their site, not from the hotel's own photography, and the same file landed in the Oceanfront, Pasyon and Signature Pool Villas. Images served by third-party marketing tools are now rejected outright. Fixing it exposed a second fault: the hotel files "Oceanfront Pool Villa" photographs as Ocean_Front, and comparing names word by word made the villa's own photograph look like another room's — names are now also compared with the spaces closed. Mandarin Oriental's card thumbnails were beating its real photographs. The site serves every photo twice — a small 624×300 preview card and the real 1600px version — and the size logic only understood sizes written in filenames, so the tiny card often won. Worse, the cards on a room's page are other rooms' preview tiles. Sizes written in the web address (cover=, contain=) are now read too, so the real photograph always outranks the card. To repair an already-imported hotel: press ↻ Refresh rooms from source (swaps each card for the real photograph, in place), then 🧹 Remove repeated photos (clears site-wide promos and cross-room cards; it asks first). |
| 2.18.0 | 29 Jul 2026 | 🌐 A third way into a hotel that blocks us — and The Lana finally imports properly. Crawlbase fetches pages from ordinary home internet addresses rather than our server's, which is the only thing The Lana's wall was ever objecting to. 20,000 requests are free, against Firecrawl's 1,500 credits at 5 per room. It is now tried automatically before anything is charged: our own browser first (free), Crawlbase second (free), Firecrawl only if both are refused. It only fetches — every judgement about what a room is and whose photograph belongs to it stays with us. The Lana, at no credit cost: Horizon Room 4 photographs, Sunrise Room 3, Marina Room 6, Marina Junior Suite 6, Junior Suite 5 — each named for its own room — with real descriptions of 400–790 characters instead of the 110 they had. Three "Sky" rooms still come back with none: their pages genuinely carry only other rooms' photography. Two faults found and fixed while proving it. Crawlbase failed on half of The Lana's pages with its own "not charged, try again" code, so a single attempt would have imported half the hotel and called the rest unreadable — it now retries. And where one room's name sits inside another's, the shorter name was claiming the longer one's photographs: the Marina Junior Suite's sofa turned up in the Junior Suite. The longest matching room name now wins. Not a cure-all: Hyatt refuses Crawlbase outright (403), so Alila Kothaifaru is no better off. |
| 2.17.9 | 29 Jul 2026 | 🖼 A photograph a hotel reuses for four different rooms is nobody's, and EDITION now imports for free. The Riviera Maya EDITION publishes ONE guest-room photograph as the preview for four different room types — Premier King, Superior Suite, Superior Ocean View Suite and Obsidian Connecting Suite. It is a real EDITION room, photographed properly, so nothing about the picture itself gives it away. But it cannot be four rooms. The rebuild now compares the rooms of a hotel against each other and removes a preview picture that more than one of them fell back to. Nine EDITION rooms keep their own photograph; four are left with none, which is the honest answer. And EDITION now costs nothing. It was quietly going through the paid scraper at 5 credits a room. Its visible text is three thousand characters of navigation — the room's description is not in it, and the reader correctly declines to invent one — but the photograph is named in the page's own metadata, and the rooms already carry descriptions from earlier imports, which a rebuild preserves. A blank description is no longer a reason to spend a credit. Verified: 14 rooms read, zero credits. The Lana still needs the paid scraper, because its wall refuses our server outright rather than hiding anything. 8 rooms, 40 credits. |
| 2.17.8 | 29 Jul 2026 | 🏨 The Riviera Maya EDITION and The Lana now import — and the reasons they did not were different. EDITION was never blocked. Its pages load perfectly; it builds its gallery with script we cannot trigger, so thirteen of its fourteen rooms had no photograph at all. Every EDITION room page publishes its own link-preview picture, which is the hotel's own answer to "what is this page a picture of". All 14 rooms now import one correct photograph and a real description. One certain photograph beats five that might be another room's — and the five buried in its page's markup did include other villas. The Lana is behind a Cloudflare wall that refuses our server outright ("Performing security verification"). Firecrawl reads it from their own network, so it works, at 5 credits a room. Its pages also carry other rooms' photography, its bar and a wedding — all now removed, so each Lana room shows its own photograph or none. Two rooms end up with none, which is the honest answer: their page never exposes their own picture to us. Three faults found and fixed along the way: seven of The Lana's eight rooms live on ONE page addressed as #room=Sunrise Sky Room, so every room looked to us like it was called "rooms suites" and the check comparing room names had nothing to compare; a shorter room name was treated as the same room as a longer one containing it, so the Sunrise Room's photograph sat on the Sunrise Sky Room; and a room on a shared page skipped de-duplication entirely, so the Marina Room held the same picture twice.Photographs are now also judged by their filename, not only their caption — that is how a "Panoramic Suite" or "Marina Duplex" photograph is recognised as another room's even when that room is not in your library at all. Unambiguous facilities (wedding, bar, spa, ballroom) are dropped too; "exterior" deliberately is not, because a villa's exterior really is that villa's photograph. Combining scrapers only helps where the barrier is the network. Adding more scrapers to our own server would not have helped The Lana — they would all arrive from the same address Cloudflare is refusing. What differs is who fetches: our browser (free), Firecrawl (paid, their network), or your own browser through the saved-page import (free). |
| 2.17.7 | 29 Jul 2026 | ⟳ Four checks on whose photograph it is, and one button to rebuild the whole library with them. Hotels put other rooms' photographs on a room's own page. No single test catches that everywhere, so there are now four, each of which only ever removes a photograph on positive evidence it belongs to someone else: 1. The link around the photograph. A hotel shows other rooms as cards, and a card is a link to that room's page. On Waldorf Astoria Beverly Hills' Villa Suite page, 19 of 24 images sat inside links to the Hollywood, Wilshire, Century and Presidential suites. That page went from 24 photographs to the 5 that are actually the Villa Suite. 2. The hotel's own list of rooms. Patina's villa pages carry photographs captioned "Beach House Bathroom" and "Fari Studios Bedroom" — no link, and no word like "villa" to give them away. But Patina publishes a Beach House and a Fari Studios, so it has told us those are rooms. 31 photographs to 23, with all eight gone. 3. A room type spelled out in the caption. Four Seasons captioned a photograph "Premier One-Bedroom Pool Villa patio" on the Serenity Pool Villa page, and a "Family Pool Villa" bed on the Island Ocean page. Both removed. 4. Captions about the resort, not a room — "Drink & Dine Brasa", "Wellbeing Spa Treatments". Guarded so a caption mentioning any part of a room ("Dining area of the villa") is always kept. ⟳ Rebuild whole library re-reads every imported room under these rules and replaces what was imported before them. Photographs you uploaded yourself are kept — they are stored separately from imported ones, so the two are told apart exactly. A room whose page cannot be read is left completely alone, never emptied. Everything is undone with one click. What this does not do. Where a hotel gives a photograph no caption, no link and no filename that names anything, nothing can prove whose room it is — those are kept, because a missing photograph is recoverable and a wrong one is not. Check a room's gallery before you send it. |
| 2.17.6 | 29 Jul 2026 | 🚫 A photograph the page itself says belongs to another room is no longer taken — and any refresh can be undone. Four Seasons Koh Samui publishes other villas' photographs on a villa's own page. The Serenity Pool Villa page carries one captioned "Premier One-Bedroom Pool Villa patio with chairs, table by plunge swimming pool", and the Island Ocean Pool Villa page carries a "Family Pool Villa" bed. Both were imported as those villas' own photographs. Nothing in the filename could ever have caught this — Four Seasons serves its photography as KOH_733_aspect16x9.jpg from one shared pool. But the hotel names the villa itself, in the caption it writes for screen readers. A photograph whose caption spells out a different room type is now left behind. Only an explicit other name drops a photograph: a caption that merely describes furniture, or names a part of the room like a Living Room, is left alone.↶ Undo last refresh. Deciding which photograph belongs to which room will never be perfect, because hotels genuinely mix them. So a refresh now takes a snapshot first, and one click puts that hotel's rooms back exactly as they were — photographs, descriptions, bullets and tours. It survives closing the page, which is what you do when something looks wrong. Still worth your eye: where a hotel gives its photographs no captions at all, nothing can tell whose room they are. Waldorf Astoria Beverly Hills is the clearest case — its Villa Suite page carries the Hollywood, Wilshire, Century and Presidential suites with no captions on any of them. Check a room's gallery after importing it, and undo if it looks wrong. |
| 2.17.5 | 29 Jul 2026 | 🖼 Refreshing a room replaces a photograph with a better copy instead of showing both. The first refresh of Patina left every room holding each photograph twice. Not the duplicate fault fixed earlier the same day — these really were different files: the original import had saved the page's small copies (22–137 KB) and the refresh fetched the same shots at 326 KB–2.5 MB. Nothing could pair them, because as files they are not the same image. Each saved photograph now records which photograph on the hotel's page it came from, independent of the size it was served at. A refresh that finds a better copy of a photograph you already have swaps it in place and says how many it replaced; only a genuinely new photograph is added. For rooms already doubled — Patina, and anything else refreshed this morning — the refresh now offers to clear the older small copies afterwards, naming the number and asking first. The files stay on the server, so a re-import brings them back if it turns out wrong. Also: Patina publishes its photographs through a ?optimize= setting, which was neither recognised as a size nor stripped. Recognising it is what makes the two copies pair. It is deliberately not stripped when fetching — asking for the true original returned 3–7 MB files, and twenty of those is a 100 MB gallery on a client's phone.On the Patina 3D tours: they are genuine 360° walkthroughs, and each room page publishes exactly one link — Patina's own. Patina starts the One Bedroom Water Pool Villa on an aerial view of the villas and the One Bedroom Beach Pool Villa inside the bedroom; that choice is theirs, not ours. The viewer's own bar (AERIAL / MAIN AREA / ACCOMMODATION / DINING / FACILITIES / UNDERWATER) moves inside. |
| 2.17.4 | 29 Jul 2026 | ↻ One button re-reads a hotel's rooms and fills in what is missing. A sweep of the whole library found 55 rooms holding fewer photographs than their own page still offers, and three Patina villas whose 3D tour was sitting on the page and had never been captured — all of them imported before the reader could see a lazy-loaded gallery or a tour link. Open a hotel and press ↻ Refresh rooms from source. Every room that was imported from a website is read again and anything missing is added: photographs the page has and we do not, a description if the room has none, feature bullets, a 3D tour, a video. It only ever adds. A photograph you already have is kept, a description you wrote yourself is kept, and nothing is ever deleted — so it is safe to run on a hotel whose rooms you have edited by hand. Because photographs are now recognised by their contents, a re-read adds only what is genuinely new. It costs nothing on most hotels — the rooms are read by our own browser. Afterwards it names any room whose new photographs look like they belong to a different room, so you can check those before quoting them. Two hotels it cannot help. Our browser cannot read The Riviera Maya EDITION or The Lana at all — 0 of 14 and 0 of 8 pages. Those are the two with genuinely broken rooms (13 EDITION rooms have no photographs; 7 Lana rooms have one each), and the free way to fix them is the saved-page import. Note: a maximum of 20 photographs per room is taken from any one page. |
| 2.17.3 | 29 Jul 2026 | 🛑 The paid scraper now stops itself before the account can run out. Firecrawl's Smart Upgrade offer raises the free allowance from 1,000 credits to 1,500 — but the condition attached is that running out moves the account onto the paid Hobby plan at $19 a month, automatically. So the extra credits are only free for as long as we never reach the end of them. The system now refuses to make a paid call once the balance falls to a held-back reserve, currently 200 credits. It counts what each call will cost before making it, so it can never overshoot, and it counts calls as they happen so a bulk import cannot spend through the floor between balance checks. If the balance cannot be read at all, nothing is spent — a blocked import is visible and fixable; an automatic monthly charge is not. Why 200 and not 50. On the day this was built, Firecrawl's own dashboard reported 1,065 credits used while its API — the number this cap reads — reported 945. Until that 120-credit gap is explained, the reserve is set wide enough to cover it. Once the two agree it can come back down; it is a single setting, not something buried in the code. The balance is now on screen. Open Import from Website and it is stated at the top: how many credits are available to use, how many are held back, and when the allowance resets. Roughly half of recent imports still reach it. Of the last 30 rooms imported, 14 were read free by our own browser and 16 still fell back to the paid scraper — 80 credits. Those 16 are hotels that block our server, so the way to bring the number down further is the saved-page import above, which costs nothing on exactly those sites. Safe to enable Smart Upgrade. With this in place the account cannot reach zero, so the automatic upgrade cannot be triggered. |
| 2.17.2 | 29 Jul 2026 | 🧽 Importing a room twice no longer doubles its photos, and the cookie banner is no longer a room photo. Three faults found on Cheval Blanc Randheli and The Lana's Marina Sky Room: Re-importing a room used to add a second copy of every photo. Each download was saved under a brand-new random name, so the same photograph came back as a stranger and the "I already have this one" check had nothing to recognise. Photos are now named after their own contents, so re-importing a room to fix it is free and changes nothing else. Across the library this had already left 114 duplicated photographs — 84 of them on One&Only Mandarina alone. 🧹 Remove repeated photos now also clears those duplicates, without asking, because a photo a room holds twice is never a judgement call. It still asks before touching photographs that several rooms share, since those may be the hotel's own style. It also works on a hotel with only two rooms now. The cookie banner's logo and the brand graphic were being saved as room photos on every Cheval Blanc villa. That test existed but was only being applied to one of the two ways we read a page; it now runs on both. A room you re-import now really is re-read. Pages are remembered for a day to save credits, but the finished room was remembered too — so when we improved what an import captures, a re-import kept handing back the old result. Fixed. Still yours to judge: Randheli's pages end with a strip of the OTHER villas plus the spa, the restaurant and the sports centre — 59 photos across its six rooms. Those are on every room, so 🧹 finds them and asks. |
| 2.17.0 | 29 Jul 2026 | 📸 The client portal finally shows the trip, not just a list of its parts. A five-perspective design review of a real client's portal (Alsumait, ET2607387) found the page was rendering about a tenth of what we already knew about his trip. Fixed across the board: The Itinerary now has everything the Flights tab had. Each leg reads like a boarding pass — KWI T1 17:40 → DXB T3 20:25, 1h 45m, then Connection · 5h 50m in DXB, then the next leg — with each traveller's own seat, the aircraft type (shown for the first time anywhere) and the airline reference. Previously the whole outbound journey was one line with no terminals, no connection and no seats. Real room photography. Where the hotel and room exist in the Hotel & Room Media Library, the portal now shows that room's actual photos, its highlights and the hotel's own description (four lines, tap for the rest) — on the Itinerary and again on the Hotels tab, where tapping the photo opens the full gallery. Hotels not in the library simply show no photo; nothing is ever substituted. Hotels say what they are. Room, board, guests, address as a Maps link and phone as tap-to-call, on the Itinerary itself. The balance is stated. The page used to show only "Paid so far: X of Y" and leave the client to subtract. It now reads Package total / Paid to date / Balance due, and every amount uses one format (KWD 6,500.000, not KWD 6500.000). The page went from 25 MB to 103 KB. Five concierge PDFs attached to one hotel were being sent inside the page itself — 18 MB of it — before a single word of the itinerary appeared, on whatever roaming connection the client happened to be on. Documents are now fetched only when actually opened, guarded by the same portal token, and a document you have un-ticked stays unreachable. Also: SEZ now reads "Mahé, Seychelles" instead of "Victoria"; imported AVIF photos are served with the correct image type (they were being sent as raw data platform-wide); and the itinerary no longer overflows sideways on an iPhone. |
| 2.16.16 | 29 Jul 2026 | 🔓 A hotel that blocks us can now be imported from a page you open yourself. A few luxury sites — Dorchester Collection among them — refuse our server outright but open perfectly in your own browser, because their security check is looking for a real person on a home internet connection. That is you. In Import from Website, open “Site blocking us? Import a page you opened yourself”. Open the room's own page in your browser (not the list of all rooms) and scroll all the way down so every photo loads. Then right-click the page → Inspect, right-click the very top <html> line in the panel that opens → Copy → Copy outerHTML, and paste that in along with the page's address. Do not use ⌘+Option+U (View Source) — it shows the page before its photographs are loaded, which is how a room once arrived with eighteen photographs of other rooms. Everything else is the same as a normal import — photos, captions, description and bullets — and it goes to the same review list for your approval.It costs nothing. Tested on The Lana: 16 photos with their captions, full description and features, in 4 seconds, with zero credits used. Two things matter: save the individual room's page, or you will get the property's general photos instead of that room's; and the address is required, because that is how the photos on the page are found. |
| 2.16.15 | 29 Jul 2026 | 🥷 Four Seasons now imports for free, and room text is read by a stronger model. Our browser was being refused by Four Seasons, which is why every Four Seasons room cost 5 paid credits. It now presents itself the way an ordinary browser does and is let in, so those rooms cost nothing. Waldorf Astoria Beverly Hills, Patina and One&Only were re-checked side by side and came back identical, at the same speed. Room descriptions are now read by Claude Sonnet rather than Haiku — about 1.2 US cents a room instead of 0.3, which at your volume is a few dinars a year and buys the stronger reader for text that goes onto client documents. Still not free: Dorchester Collection uses a much harder check that no free tool gets past — use the saved-page import above for those. |
| 2.14.17 | 30 Jul 2026 | 👥 Group trips: settled payments now fold into one card on the client's page. A five-traveller trip showed five full payment cards stacked at the top, each with two large receipt buttons, pushing the itinerary roughly two phone screens down (Mrs Wafaa's link). Payments already received now collapse into a single line — “✓ 5 payments received · KWD 27,770.000 · Show ▾” — which the client taps to open the per-traveller list with amounts, dates and their Receipt / PDF buttons. Two rules kept deliberately: anything still owed is never collapsed (it keeps its own full card with the live payment button, above the folded group, because that is an action the client still has to take), and the fold only starts from two payments — a single payment keeps its normal card. Also fixed: a long traveller name used to run into the amount beside it. |
| 2.14.27 | 02 Aug 2026 | 📱 The e-ticket really does fit an iPhone now — the previous three attempts did not. The ticket is a fixed-width document that gets scaled down to fit the screen. The instruction used to do that scaling (zoom) is obeyed by Chrome, by Safari on a Mac, and by the automated browser used for testing — but ignored by Safari on an actual iPhone. So every test passed while the phone kept drawing the ticket at full size, clipped down the middle. It now scales with a method every browser honours. Verified on the live link with that instruction deliberately disabled, so a pass proves it no longer depends on it. |
| 2.14.28 | 02 Aug 2026 | 📱 The e-ticket preview is now built for the phone instead of being shrunk to fit it. Four attempts tried to scale a fixed-width document down to a phone screen; each depended on the browser honouring a scaling instruction and on measuring the screen at the right moment, and each failed on a real iPhone. Below 720px the document now simply lays itself out for the screen — the journey stacks, the four facts sit two-by-two, and each table row becomes a labelled list (FLIGHT · EK 2051, FROM · KWI (T1), DEPARTURE · 17:40…). There is nothing left to scale and nothing that can fail to scale. Verified with both scaling methods deliberately switched off, in Safari's engine and Chrome's, at iPhone, iPhone Max and desktop sizes. The downloaded A4 PDF is produced on the server at full width and is unchanged. |
| 2.14.29 | 02 Aug 2026 | 📱 Client portal on a phone — four fixes. Concierge documents now open. Hotel documents did nothing when tapped on an iPhone. The files were always fine on the server; the code loaded each one into memory and only then asked the browser to open it, and an iPhone treats an "open" that arrives after that pause as a pop-up and blocks it silently. Documents now open directly on the tap, and Download saves the real file. Passenger and guest details read as a clean list. A six-column table squeezed into a phone card made one passenger look like a table and the next look like loose text, with a wide empty gap beside the airline. Each detail is now a labelled line — name as the heading, seat / reference / ticket beneath it, using the full width. Printed documents keep their proper tables. Hotel names use the space they have instead of wrapping early with 150px sitting empty next to them. "Download All Tickets" is one A4 page per ticket. Three tickets used to come out as six pages, each one split across a break. Every ticket is now measured and fitted to its own sheet: 3 tickets = 3 pages. |
| 2.14.30 | 02 Aug 2026 | 🔄 A client portal page can no longer get stuck on an old version. A phone that already had the page open could keep showing a previous build for hours — the server was serving the corrected file the whole time, but there was no way to tell from the screen, so a fix that had shipped looked like a fix that had failed. Two changes: the portal now prints its build number at the very bottom of the page, under "Prepared by ELITE TRIP"; and on every load it asks the server which build is current and reloads itself once if it is behind. If you are ever unsure whether a client is seeing your latest change, ask them what the small number at the bottom of their page says. |
| 2.14.31 | 02 Aug 2026 | 📄 Client-portal PDF downloads rebuilt — every document is now a true A4 page. The downloaded PDFs (e-tickets, "Download All Tickets", hotel vouchers, the invoice) were silently printing with the PHONE layout and cutting content off the bottom of the page — the print engine treats the document's 182mm width as a small screen, so the mobile styling switched itself on and made every document too tall for its sheet. The PDF is now composed from an exact picture of the finished document, placed one per A4 sheet: a solo e-ticket is 1 page, "Download All 3 Tickets" is exactly 3 pages, vouchers and invoices 1 page each, with nothing cut and the footer on every sheet. Verified by generating and measuring the real files on the live server. |
| 2.14.32 | 02 Aug 2026 | 📱 Phone previews of travel documents redesigned — no more empty gaps or stray lines. On a phone, the fact cards (check-in/check-out, stops/cabin/baggage) crowded into the left half of their box leaving the right half empty; the passenger and guest lists showed dangling numbers, inconsistent dividers and names pushed to odd positions. Now: fact cards fill the full width two per row (a lone fact like Nights takes the whole row), each passenger's name is the card's header strip with seat / cabin / e-ticket listed beneath it, each flight segment is headed by its flight number, and hotel guests read as one clean line each (1 · name). Verified on the live link at iPhone width — zero elements off-screen. Portal footer now reads build 2.14.32. |
| 2.14.33 | 02 Aug 2026 | 🌐 Portal polish round. (1) Terminals written as Roman numerals on GDS tickets now print as digits — SEZ "Terminal I" reads "Terminal 1" everywhere, documents and PDFs included. (2) "View Receipt" and "Download Receipt" sit side by side on one row. (3) The concierge card now leads with Hotel Documents, then At a Glance, then the Curated Guide. (4) Room photos open a full-screen swipeable gallery on tap — swipe or use the arrows, counter shows the position, and the gallery holds ALL the room's photos, not just the five on the card. |
| 2.14.34 | 02 Aug 2026 | 🕑 Client invoice showed the OLD dates after a booking was amended. A room stores its dates twice: the real check-in/check-out fields (which an amendment updates) and a written-once text label (which it does not). The portal invoice printed the stale label — Mr Alroumi's Waldorf stay, moved to 23–28 Aug, still invoiced as "16–21 Aug". The invoice now derives its dates from the real check-in/check-out fields and only falls back to the label when those are missing, so an amended booking can never invoice its old dates again. Verified on the live group link. |
| 2.19.3 | 02 Aug 2026 | 📅 A hotel room's dates label can no longer go stale. The 2.14.34 fix stopped the invoice from printing an out-of-date label; this closes the label at its source. Proposals Studio now rebuilds the room's written dates label from the real check-in/check-out fields every time a room is saved, so amending a stay updates the label everywhere it is stored — not just where it is displayed. A sweep of all 409 proposals found seven rooms on five trips still carrying an old label (including the original Waldorf case); their portals already show the correct dates, and the stored labels are queued for correction on approval. |
| 2.14.35 | 02 Aug 2026 | 🔄 Proposals Studio: amending a room's dates now updates everything. Saving a hotel room rebuilds its dates label directly from the check-in/check-out fields on every save — the label can no longer keep the old dates after an amendment (the cause of the "old dates on the invoice" incident). Nothing changes in how agents work; the dates text simply always matches the real dates now. |
| 2.19.4 | 03 Aug 2026 | 🧾 The same invoice number can never be issued to two clients again. Invoice numbers were worked out by counting the invoice list, so two trips confirmed close together could both be given the same number — which happened once (ET2607394 went to both Mr Alroumi and Mr Alotaibi). Because the invoice records are filed under their number, the second client's invoice was hidden in Finance Suite and his payments pointed at the wrong record. Numbering now takes the highest number actually in use and refuses any number already taken. |
| 2.19.6 | 03 Aug 2026 | 💳 A paid instalment can no longer come back as unpaid — or be billed twice. When a client paid an instalment, the "paid" mark was written to only one of the two places a proposal is stored, so the next save from any studio restored it to unpaid. If an add-on was then added, the automatic "Add-on services" line added the new amount on top of the instalment already settled — Mr Alotaibi's portal asked for KWD 116 when only KWD 84 was owed. The paid mark is now written to both stores at the moment of payment. Platform-wide check afterwards: no other trip affected. |
| 2.19.7 | 04 Aug 2026 | ✨ Premium proposals now show the Concierge Guide — with real document thumbnails. On a premium-styled proposal the concierge card never appeared at all: the premium design had no concierge section, so a linked destination card (Mr Alroumi: 28 Waldorf documents) was invisible to the client. It now renders as its own chapter in the premium navy-and-gold, in the order Hotel Documents → At a Glance → Curated Guide, with empty blocks simply omitted. Each document shows a real preview image — a PDF's actual first page, rendered on the server — instead of a generic file badge. Six show at a time with "Show all". Reminder: a client only sees this once the destination card is linked to their job in Vouchers Studio; if the card is missing from the dropdown there, refresh the destination list first. |
| 2.19.8 | 04 Aug 2026 | 🎨 One design per stage: premium is the PROPOSAL, the classic portal is the TRIP. The premium (cinematic) design is now used only while a proposal is still a proposal. The moment it is approved, the client's link switches to the normal client portal — the one that carries the concierge guide, hotel documents, vouchers, e-tickets and receipts. This ends the mismatch where post-booking sections had to be re-built inside the premium design and never quite fitted. Nothing to set per proposal: mark it approved and the client sees the full portal on their next open. The premium concierge section built earlier today is retained in the code but no longer used. |
| 2.19.9 | 04 Aug 2026 | 🧾 Breakdown of services now says WHAT each price covers, with the price beside it. The end-of-page breakdown printed a service and its amount at opposite ends of the row, with no indication of how much was included. Each line now carries a badge — 2 Tickets, 3 Rooms — taken from the flight's own passenger count and from the room quantity the agent typed ("3 x Premier Room Sea View"), and the amount sits directly beside the service on phone and desktop alike. A return leg priced on the outbound ticket now reads Included instead of "0.000", which clients were reading as an error. Room name, dates, nights, board and guests are listed underneath. |
| 2.19.10 | 04 Aug 2026 | 💰 Total Package Price card: the total no longer sits on top of the service prices. The navy total card was one row — heading on the left, big total on the right — and the itemised service prices right-aligned inside the left half, so they collided with the total ("KWD 980" pressed against "KWD 12,880"). The total is now its own header line and the services run the full width beneath it. Each line also says how much it covers — "Kuwait Airways · KWI → ALY · 2 tickets", "Al Alamein Hotel · 3 rooms · 7 nights" — and a return leg billed on the outbound ticket reads Included rather than showing nothing. Room counts are read from the room name the agent types ("3 x Premier Room"), so the card and the breakdown can never disagree. |
| 2.19.11 | 04 Aug 2026 | ✈ A return flight billed on the outbound ticket now prints as ONE round-trip line — "KWI → ALY → KWI · 2 tickets · 21 Aug – 28 Aug" with a single price — in the total card, the services breakdown and the client's invoice. Previously it appeared as a second line reading "0.000" (then "Included"), which clients queried. The trip total is unchanged; the itinerary still lists both flights, because the client still takes both. Matches how Finance Suite's invoice has always merged them. ⚠ Fixed at the same time: the client's invoice was printing with NO line items on any proposal that has no payment schedule yet (i.e. before it is approved) — header, total, and nothing in between. It now falls back to the live proposal, so an invoice always lists what it charges for. |
| 2.19.12 | 04 Aug 2026 | 📝 Two standing rules for every price a client sees — applied platform-wide, and to everything built from now on. 1. A price says what it covers, and sits next to it. Every money line carries its quantity ("2 tickets", "3 rooms · 7 nights") and the amount sits beside the service, not at the far edge of the row. Room counts are read from the room name you type ("3 x Premier Room Sea View"), so type the quantity there and it flows to the portal, the breakdown and the invoice. 2. A return leg billed on the outbound ticket is merged into it — "KWI → ALY → KWI · 2 tickets · 21 Aug – 28 Aug", one price — never a second line reading "0.000" or "Included". Journeys split across several entries are chained into one line, and if the return flew on a different carrier both are named. Itineraries still list every flight; only the money views merge. Checked across all 401 live proposals: 21 had a zero-priced leg, 19 now read as one journey; the 2 remaining are 2023 proposals whose flight rows are empty (no price, airline, route or dates) and need cleaning up in Proposals Studio. Every trip total is unchanged. |
| 2.19.13 | 04 Aug 2026 | ↩️ Automatic merging of flights has been switched OFF. Yesterday's change combined a return leg into its outbound line automatically wherever it looked like one fare. On multi-city trips that guessed wrong — it chained legs into journeys nobody had entered — so it is reverted. Every flight now appears exactly as the agent entered it, and a leg carrying no price of its own reads "Included". Nothing in any proposal's data was ever changed by this; it only affected how lines were displayed. If a particular trip should show its flights combined, ask and it will be done for that trip alone. The rule that a price must state what it covers ("2 tickets", "3 rooms · 7 nights") and sit beside its service is unchanged. |
| 2.19.20 | 07 Aug 2026 | 🔒 Our clients' phones no longer announce themselves to Google. Every app drew its lettering by fetching the typeface from Google on each visit — which told Google, from the client's own phone and before he had read a word, that someone at that address was opening an Elite Trip page. The lettering is now served from our own servers. This was already done for the client portal and the phone app; it now covers all 21 apps, staff ones included, so a colleague's browsing is no longer reported either. Nothing looks different and nothing to switch on. The typeface is identical — it now loads from us instead of from Google, and it keeps working with no signal, which the old way did not. Two client-facing pages had been missed and are now covered: the Destination Guide and the Hotel Showcase, both of which we send to clients directly. 🔗 New client links are much harder to guess. A portal link ends in a short random tag — hamad-alroumi-t74m. Four characters is few enough that someone who knew a client's name could, in principle, work through the possibilities until they found a real trip and read its itinerary. Links created from today carry a ten-character tag drawn from proper cryptography, which puts that far out of reach. Every link already sent to a client keeps working exactly as it is — nothing you have shared is affected, and there is nothing to re-send. Separately, the portal already limits how fast anyone can try links from one connection. |
| 2.19.21 | 07 Aug 2026 | ⚡ A trip that took 11 MB to open now takes 0.4 MB. Mr Alroumi's Waldorf Astoria trip was sending 10.6 MB to his phone every single time he opened it — on hotel wifi, on roaming, on mobile data, again and again, before a word of his itinerary appeared. It is now 0.43 MB: twenty-five times smaller, and it opens in a fraction of a second. Two things were making it heavy. The venue photographs on his concierge card were stored inside the trip itself rather than as picture files, so all 18 were re-sent on every open and his phone could never keep them. They are now proper files — sent once, then remembered. And his resort's 28 menus and guides were each small enough to slip past the existing size check, but together came to 2.7 MB; they are now fetched only when the client actually opens one. Nothing looks different and nothing is missing — all 18 venue photos, all 28 documents, checked on a phone. Nothing for you to do differently: keep attaching photos and documents exactly as you do now. The rule that a hidden document never leaves our server is unchanged. Why it matters beyond speed: a client abroad pays for that data. This was the trip we are using to test the phone app before it goes to the App Store, and it would have been the first thing he noticed. |
| 2.19.22 | 07 Aug 2026 | 🔄 When you amend a trip, the client's documents now change with it — immediately. Until today, for up to ten minutes after you corrected a flight time or a room, a client opening their e-ticket or voucher could still be handed the version from before your change. Worse, the phone app keeps documents for offline use, so if they opened it in those ten minutes the old document could be stored on their phone and stay there. Nothing for you to do differently. Amend a trip exactly as you always have. The system now stamps every document with the moment the trip was last changed, so a document built before your edit can no longer be handed out after it. Found by accident, while building the demo trip for the App Store submission: a corrected flight time kept coming back with the old time. The app had been asking for the fresh version all along — the server was quietly answering with the old one. Documents are still fast. The first open of a document still takes a moment to prepare; opening it again is instant, as before. Only a real change to the trip now resets that. |
| 2.19.23 | 07 Aug 2026 | 👥 A client can now give the people travelling with him his own trip — without seeing what he paid. Until today only one person got a link. On 22 of our 24 live trips there is more than one traveller, so in practice the wife, the son or the friend was sent screenshots of our documents — our carefully made e-ticket arriving as a blurry photograph. On his Trip screen the client now sees "Travelling with you", listing everyone on the booking. He taps Give access, then Share, and it goes by WhatsApp like any other link. Remove stops that person instantly. What the companion sees: the whole trip — flights, hotels, confirmation numbers, e-tickets, vouchers, the concierge recommendations and your contact details. What they never see: any price, the payment schedule, what is still owed, the invoice, or a pay button. The Pay tab does not even appear for them. This is not hidden on the screen — the prices are never sent to their phone at all. Why it works this way: a client whose phone is dead at the airport, or a daughter travelling on a trip her father arranged and paid for, can open everything themselves. But what a trip cost stays between us and the person who paid for it. Nothing for you to do — the client does this himself, and only he can. Someone holding a shared link cannot pass it on to anyone else. |
| 2.19.25 | 13 Aug 2026 | 🔒 The staff copy of a trip can no longer creep out of step with the client's. Every trip is kept in two places — the record your client's link reads from, and a working copy the apps write through. Since the August fix your apps read the client's record, so what you see on screen is what he sees. But a browser still holding an old working copy could push it back over the live record. Now it repairs itself. Every hour the system compares the two. Where the client's record is the newer of the two — the ordinary case, because that is where Proposals Studio saves — the working copy is quietly brought into line, after a snapshot is taken. Where the working copy is the newer one, that means a browser is holding an edit the record never received: that is not repaired automatically, it is reported, because choosing between two versions of a client's trip is a person's decision, not a rule's. Nothing for you to do. Found on Ms. Lamyaa Alghemlas' trip, where the working copy still held an older hotel and an older total. Her link was never affected, and was verified unchanged afterwards. |
| 2.19.26 | 17 Aug 2026 | 📅 The day of the week under a hotel's check-in was wrong on every booking. On Mr. Hamad Alroumi's Waldorf Astoria confirmation the dates were right — 23 Aug in, 28 Aug out — but underneath them the portal named the wrong days, and a client checking his calendar found they did not match. Why: the card shows the short date, "23 Aug", and the weekday was being worked out from that alone. With no year to go on, the date was falling back to 2001, so the weekday printed was the weekday of that day twenty-five years ago. The dates themselves, the number of nights and the voucher's full dates were always correct — only the weekday line was wrong. Fixed on the Hotels card and on the printed hotel voucher — the weekday is now read from the full date, year included, rather than from the short one. That also keeps last year's trips right: a stay in October 2025 was being given October 2026's weekday. Checked across every trip on the platform — 182 hotel check-in and check-out dates, all now naming the correct day. Nothing to re-issue: any document opened from now on carries the right day. 🛡 And it is now checked for you every night. This one survived because nothing ever compared what a document prints against the date it was given — the code read sensibly, so nobody questioned it. A nightly check now takes the portal's own working parts, runs them over every trip on the platform, and compares each printed day against the calendar. If a date ever disagrees again, you get a WhatsApp naming the trip and the hotel, rather than a client noticing first. 📅 A second fault came out of the same audit. On the screen a returning client sees when he has more than one trip with us, the code looked for date fields that do not exist on a proposal — so no card showed a date, and no finished trip ever moved to "Past": a trip from last year still sat under Upcoming. Now fixed and covered by the same nightly check. |
| 2.19.27 | 22 Aug 2026 | 🔓 Approving an agent's request to change a locked plan did nothing at all. The card appeared, the request was there, pressing ✓ Approve said "Approved" — and the agent was still locked out. Ahmad pressed it eight times from his phone today on two waiting requests; the server received all eight and rejected every one. Why: the button was sending the decision to an address on the server that does not exist, and the reply was being discarded without being read. Nothing was ever recorded, and the screen said the opposite. Fixed. The decision is now sent to the right place, and the confirmation only appears after the server has actually stored it. If it cannot be saved — signed out, no connection — you are told so plainly and the plan stays exactly as it was, instead of being told it worked. Still waiting for you: Mrs Wafaa Alkhunaini (ET2607162, Inzemam Sumra — "activities") and Mr. Hamad Alroumi (ET2607272 — "category change"). Both are still pending; approve or deny them and they will stick this time. |
| 2.19.28 | 23 Aug 2026 | 👥 On a group trip, "generate a link per traveller" only ever worked once. Add anything after everyone has paid — activities, transfers, an upgrade — assign it correctly to each traveller, press the button, and it answered "Every traveller with an assigned amount is already fully paid" and made nothing. Found on the Alkhonaini ladies' Thailand & Bali trip. Inzemam had done the split properly: all seven Bali activities assigned by name, every line balanced, KWD 1,075 in total. The button still refused, so he had to type five payment links by hand — outside the trip, where the portal and Finance cannot see them. Why: it looked for each traveller's instalment, found the one she had already paid, and skipped her. It also billed her whole-trip figure, not what was still owing — so simply removing the skip would have re-charged Aria the KWD 4,927 she had already paid. Now it bills what is actually outstanding: what she is assigned across the trip, minus everything she has already settled, as a new line called "Additional Charges". Paid instalments are never touched, and nobody can be charged twice. If a traveller already has more than one unpaid line, she is skipped by name rather than guessed at — which line a new charge belongs on is your decision. What to do differently: nothing. Assign the new items to the travellers as usual and press the same button. There is no longer any reason to create a payment link by hand for a group trip. |
This file is self-contained — edit the relevant section and the Version Log, then redeploy alongside the apps.