
AI Concierge Across a Hotel Group — 3 Properties, 3 Channels, 4 Languages, 91.7% Handled by the Bot, Improved From Real Chats Every Day
An AI concierge live at three properties of a Thai hotel group, on Facebook Messenger, LINE and the website, in four languages. 370 leads from the first property, 91.7% of conversations handled without the bot passing them to staff, the second property built in half the time of the first, and a daily loop that reads yesterday's real chats and fixes what went wrong.
All Case Studies
Auto Financial OpsAutomated Expense Entry into PEAK — 12 of 12 Bill Types Read Correctly, 45 of 48 Real Documents Passed
AI ChatbotOne Owner, 50 Chats a Day — a LINE AI Bot That Took 90% of Them Across 3,260 SKUs
Auto Financial OpsSix Legal Entities, One Message, Every Morning at 07:00 — Multi-Property Hospitality Group
Auto Financial Ops873 Students Off a 900-Parent Group Chat — and 293 Families Found Sitting Under a Silent Do-Not-Chase Flag
Auto Financial OpsA 3-Branch Clinic Now Checks Every Receipt, Every Day — and Matches 99.4% of Gateway Receipts to the Money That Actually Arrived
AI ChatbotLINE AI File Memory — 30-Second Searches Cut to Under One Second, Delivered 23 Days Early

LINE AI File Memory — 30-Second Searches Cut to Under One Second, Delivered 23 Days Early
Full Case Study
The Client
A pre-launch Thai startup building a consumer AI product: a LINE Official Account that works as a personal storage box. Users send in a photo, a PDF or a link; AI reads the contents, summarises and tags it automatically; and they search for it again later from inside the LINE chat, without leaving for another app.
The team planned to sell it as a monthly subscription, and needed an MVP that actually worked for a first group of real users — with a back office they could run themselves, and a structure that could accept a payment system later without being torn apart.
Designed for 50-1,000 users and 20-300 items a day.
The Challenge: Something You Saved and Cannot Find Was Never Saved
Unlike most projects there was no existing system to improve — only the problem. Users send in anything at all, and the system has to read it, store it correctly, and find it when they ask for it.
Search that "worked" and was unusable
Once the first version was running, the client tested it themselves and hit results they could not ship:
| The user searched | What came back |
|---|---|
| "photo of medicine" | a photo of medicine, plus a bus, plus an invoice |
| "photo of memo" | nothing at all — despite a logo with the word memo clearly written on it |
| "Canada file" (in Thai) | missed CX_CANADA Ottawa-Niagara.pdf entirely, because its name is in English |
| "bus" | 3 results, but 2 of them were the same file uploaded twice |
And each one took 20-30 seconds, against the 1-5 seconds a LINE user expects.
Two more constraints set by the client
- •The chat must not get cluttered. Returning the full AI summary and tag list into the conversation made it unreadable once a user sent several files in a row. The bot had to answer in a line or two.
- •A user's original files must never disappear on their own — and must never be deleted because a signed download URL expired.
What is at risk if it is not fixed
For a product whose whole promise is "we will keep this for you", a failure to find something is a failure of the entire product. A user who searches once and finds nothing stops using it, and does not say why. A pre-launch startup does not get a second attempt.
How the Work Was Chosen and Shaped
The client approached through Fastwork on 18 May 2026. Three tiers were proposed, and the middle one was chosen within a single day — along with five additional requests, all of which were absorbed at the same price:
- •Closed file storage, with download links expiring in 1 hour by default
- •Linking a user's search term to the file they just sent (a 2-minute window)
- •Delete with 30-day recovery
- •Thai search across multiple fields, with a fallback path
- •Separate acceptance criteria per installment
And one more thing the client never asked for, included free: an abstraction layer separating the AI provider from the system, so the provider can be swapped in future without touching the core code — with a written guide on how to do it.
The client's own condition became the working principle for the whole project
Fix it by looking at real data, not by adding guessed synonyms.
Alongside a second one: do not hard-code anything that makes adding payments later difficult — keep plan and quota logic separate so plans can change.
The client was a product owner who knew what they wanted and set the right conditions from the start. That is the main reason the work moved as fast as it did.
Why 3 Phases, Each One Proven Before Moving On
The project was deliberately staged into 3 phases — foundation, then AI and search, then an admin dashboard — rather than built all at once and handed over at the end. Each phase had to pass real testing from a real phone before the next one started, with nothing assumed to "probably work": phase 1 proved files sent into LINE were actually received and stored; phase 2 proved AI could actually read files and search actually found them from a real phone; phase 3 proved the product owner could genuinely operate the system without help, not just look at a demo.
Every phase shipped with its own written test report — specific enough for the product owner to verify each item themselves from a phone in 5-15 minutes before signing off on the next phase.
One rule was locked in from phase 1, not bolted on later: every file lives in a private space nobody else can reach, with no public link left open — download links expire within an hour, per data-protection requirements, from day one.
What Was Built
| Part | Detail |
|---|---|
| Core system | Next.js + Supabase (database and closed file storage) |
| AI reading | Claude Vision reads images and PDFs, then summarises and auto-tags |
| AI abstraction layer | Swap the AI provider without touching core code (included free) |
| Search | Two layers across 6 fields, plus a Thai-English dictionary, per-field weighting by how trustworthy each field is, and a minimum confidence threshold |
| Duplicate suppression | Compares real file size at the byte level — the same file uploaded twice shows once |
| Link capture | Pulls the page title, classifies 9 platform types, and auto-tags |
| Chat UX | A 1-2 line reply, a swipeable file card, and an 8-cell usage summary card |
| Recycle bin | Delete with 30-day recovery before automatic permanent deletion |
| Back office | A 7-page dashboard — overview, users, files, tags, search history, errors, recycle bin |
| Rich Menu | A 6-button LINE menu (20 design rounds) |
| Handover docs | Six documents — install, deploy, how to change AI provider, the data guarantee, the search logic, how to edit the Rich Menu |
Key Technical Decisions
- •Auto-tagging happens at upload time rather than at search time, so search stays instant even as the file library grows
- •Replies are split into two stages: an instant acknowledgment (1-3 seconds) confirming the file was received, then the AI's actual analysis follows a few seconds later in the background — so the user always knows the system caught the file, without the chat stalling while AI works
- •Chat replies stay short and specific rather than dumping the AI's full summary back at the user, keeping the conversation readable while the full detail is still saved and searchable later (this alone cut the number of messages sent by half)
- •A filter strips generic nouns (like "photo" or "file") out of search queries before matching, built from real search logs rather than guessed synonyms, since users type these words constantly without meaning them literally
- •A custom Thai-English term dictionary expands every search into both languages before matching, with the AI tagging files in both languages at read time too — so a user can search in whichever language they're comfortable in, regardless of which language a file happened to be tagged in
- •Duplicate-file detection compares file size and type directly instead of the AI's own description of the file, since the AI writes a slightly different description every time it reads the same image
- •Search runs multiple phrasings in parallel instead of one after another, and stops expanding once the top result is confident enough — this, more than anything else, is what took search from 20-30 seconds down to under 1 second, without giving up bilingual search
- •Built and tested directly against natural Thai search phrasing rather than an English-first design ported over afterward
- •Kept as a limited early-access rollout rather than a public launch, so real usage patterns could be observed before opening it up further
The Hardest Part — 8 Rounds in 3 Days
Search was reworked across 8 rounds between 29 and 31 May 2026, all of it inside the warranty at no extra charge.
Every round began by writing a throwaway script to pull the real data out of the database and see why it was wrong, rather than guessing and adding synonyms:
Why "photo of medicine" returned a bus. In Thai, the word for medicine is a substring of the word for vehicle. Fixed with a short-token matching rule and a minimum confidence threshold.
Why "Canada file" found nothing. The AI had tagged that file in English and the user searched in Thai. Fixed with the Thai-English dictionary in the search layer.
Why it took 20-30 seconds. An earlier round had added chained synonym expansion — up to 16 terms across 2 search layers, which is up to 32 database queries fired one after another. Fixed by firing them all in parallel and stopping expansion once the top result was confident enough.
Why "bus" returned a duplicate. Round 7 had already added duplicate suppression by comparing the first 60 characters of the AI summary, and it was still duplicating. Pulling the real rows out showed the two files were exactly the same size, 88,068 bytes — unquestionably the same file. But the AI had written two different summaries — "large black luxury bus (Ford)" and "black luxury bus (Ford)" — which diverge at character 16, so the suppression logic saw two different files.
Round 8 therefore switched to comparing real file size and file type instead of the summary text.
The core lesson: AI does not write the same text twice, even from the same input. Never use AI-generated text as a file's identity.
The PDF the AI could not read
A separate problem took four failed approaches — the AI read a PDF and returned an empty result. The three documented failures were upgrading to the newest model, giving it more room to write a longer answer, and pre-writing the start of its answer for it to continue. The last failed worst: the AI read a pre-written opening as "almost done", rushed to close, and produced a technically valid but completely empty result with no error thrown, because the format was still correct.
The fifth approach — forcing the AI to answer into a fixed, structured format rather than free text — passed on the first attempt. On a 14-page course document it returned a complete summary with 5 Thai tags, shown in LINE in roughly 15 seconds.
Scope Discipline
Around 17 additional requests arrived during the build. Every one was sorted into the same three categories:
- •Already in scope — done free
- •Lay the groundwork now — done free, charged only if it is built out later
- •Genuinely additional — quoted separately
Not one round ended in an argument about scope.
The best example of the middle option: 30 minutes spent preparing the database structure for a next-phase feature at the time, which saved 4-6 hours when it actually came to be built.
The Results
| Before | After |
|---|---|
| No product at all | A live system on the client's own LINE OA |
| "photo of medicine" returned medicine + a bus + an invoice | 9 of 9 test cases return the right file |
| Search took 20-30 seconds | Under 1 second (fastest 381 ms) |
| English-named files invisible to Thai searches | A Thai-English dictionary inside the search layer |
| The same file listed twice | Byte-level comparison, listed once |
| The chat cluttered with long summaries | A 1-2 line reply plus a file card (half as many messages sent) |
| No back office | A 7-page dashboard the team runs themselves |
| Deleted meant gone | A recycle bin with 30-day recovery |
1. Delivered 23 days ahead of schedule
The agreed plan was 26 days (25 May to 19 June 2026) across 3 installments.
| Installment | Actually delivered |
|---|---|
| 1 — foundation | 11 days early |
| 2 — AI and search | 22 days early (finished the same night as installment 1) |
| 3 — back office and handover | closed 31 May, against a 19 June deadline |
That was possible because the infrastructure was built ahead of the client's own data arriving — so on the day it arrived, the first installment was ready to install immediately.
For a pre-launch startup, time is the one thing that cannot be bought back. Those days were spent testing with real users instead of waiting for a system.
2. Search: from 20-30 seconds to under a second, and right every time
After the 8 rounds, the standard test suite passed 9 of 9, with every case answering in well under a second:
| Query | Time |
|---|---|
| "photo of medicine" | 897 ms |
| "photo of bus" | 381 ms |
| "cartoon website" | 431 ms |
| "cartoon" | 651 ms |
| "Canada file" | 414 ms |
| "find invoice file" | 422 ms |
Against a target of 5-8 seconds, that is at least an order of magnitude faster than asked for.
And the suite re-runs in under 30 seconds without writing to the database, so the client's team can verify it themselves after every code change rather than taking anyone's word for it. The suite is both the evidence that it was fixed and the safety net afterwards.
3. Around 17 change requests absorbed without a fight — and follow-on work quoted
Product builds usually end in an argument about scope, because a client only discovers what they want once they see the real thing.
Here every request was categorised openly. More than 10 features beyond the quote were delivered free, and all 8 search-hardening rounds sat inside the warranty.
The result was follow-on work quoted across three lines — a payment system, phase-2 features, and the Rich Menu. Scope discipline earned more work rather than costing a client.
4. A back office and an operating cost a founder can live with
Seven dashboard pages give a non-technical owner full visibility: system overview, users, files, tags, search history, error history, and a recovery bin for accidentally deleted files. Running cost at MVP scale sits at roughly 200-500 baht a month, paid by the client directly.
Limitations Still Open — Stated on Handover Day
- •Searching inside the summary text is still limited by the database's Thai word segmentation. The client was told on the day of handover; it was not hidden.
- •Automatic tagging for links was deliberately left out of this phase, by explicit agreement.
- •Cross-provider data backup has not been built — it sits in the phase-2 proposal.
Lessons Learned
- •Fix search problems with real usage data, not guesses. Across all 8 rounds, every fix started by pulling the user's actual search history first — what they typed, what the system answered — rather than assuming a missing synonym and adding it blind. That discipline is why the search feature hasn't broken again since handover.
- •When AI doesn't answer the same way twice, find something else stable to check instead. An AI reading the same image twice writes a different description each time, so duplicate detection built on comparing AI descriptions quietly missed real duplicates. Two rows identical at 88,068 bytes had summaries that diverged at character 16. The fix was comparing file size and type, which never change. Whenever AI sits inside a workflow step, find a stable reference point to decide on, or the system fails silently with nobody noticing why.
- •Forcing AI to answer in a fixed structured format is far more reliable than asking nicely. Four approaches failed before a rigid output format passed on the first attempt. The worst failure produced a technically valid but entirely empty result with no error at all, because the shape was still correct. Work that has to be 100% reliable should be enforced by a format, not requested in words and hoped for.
- •Background work that "fires and forgets" can silently disappear on modern cloud infrastructure. The very first live test of phase 1 went completely silent — the code told AI to start working and replied immediately without waiting. On the hosting platform used, which shuts down execution the instant a reply is sent, unfinished work is cut off with no warning, so the AI's answer simply vanished. Background work always has to be awaited before replying. This is the most dangerous kind of bug precisely because there is no visible error; the system just goes quiet.
- •Performance problems are often a previous fix. The 20-30 second search was not a slow database — it was chained synonym expansion from an earlier round firing up to 32 queries in sequence. Before optimising, check what an earlier round added.
- •Non-technical clients need three concrete options, not a binary "can do / can't do." Every scope request got a clarifying question and then three paths: free within existing scope, groundwork free now and charged only if built out later, or built in full now for an added cost. The middle option was chosen almost every time, and this prevented scope creep roughly 10 times across the project — even with feedback arriving fast and sometimes shifting direction 4 times in one day.
Project Information
More Like This
AI ChatbotAI Concierge Across a Hotel Group — 3 Properties, 3 Channels, 4 Languages, 91.7% Handled by the Bot, Improved From Real Chats Every Day
96% MatchAn AI concierge live at three properties of a Thai hotel group, on Facebook Messenger, LINE and the website, in four languages. 370 leads from the first property, 91.7% of conversations handled without the bot passing them to staff, the second property built in half the time of the first, and a daily loop that reads yesterday's real chats and fixes what went wrong.
AI ChatbotA Beauty Clinic AI Assistant Got an Answer Wrong — Stopped in 4 Minutes, Then Traced to Why Using 345 Real Staff Replies
96% MatchAn AI sales assistant on Facebook Messenger for a single-branch beauty and weight-loss clinic, with medical-safety gates before and after the AI, PDPA consent, staff alerts on LINE and a kill switch. Three weeks after launch it told a real customer something that broke clinic policy. The owner stopped it within 4 minutes. What followed: closing a hole in the kill switch, a refund gate, and using 345 real staff replies to find that the bot's data — not its prompt — was the problem.
AI ChatbotFive Months After Handover — 96.5% Handled Without a Human, Worth 2.4 Times Its Upkeep, and Leads Recovered from 6 to 23
96% MatchA LINE AI assistant for an occupational safety training institute, built in 7 days and then measured for five months. It handles 96.5% of its conversations without a human and returns 2.4 times what its upkeep costs — and the maintenance habit behind those numbers found 15 of 16 leads quietly going missing, staff alerts dying halfway through every month, and a customer who sent 15 messages without a reply. None of it ever raised an error.