H.A Fashion is a women’s woven-wear manufacturer based near Hanoi, producing for export markets across the US, Germany, Denmark, the Netherlands, the UK, and Australia. Their main factory runs 50 to 70 staff, backed by a partnership factory (500+ employees, 25 lines) for larger orders. They’ve worked with European brand partners since 2019.
The Hanoi office is 20 people: merchandising, QA, accounting. They live inside Microsoft Teams. Leave requests happen in one shared channel, the Hanoi office staff group, General tab. An employee types a quick message (“Hi boss, taking tomorrow afternoon off”), the manager replies “OK”, and that’s the record. Casual, fast, and it works. Until it doesn’t.
Chat was the inbox, but nobody filed anything
Over 12 months, the channel accumulated 416 messages. About 95% were leave-related (roughly 200 leave events a year across the 20-person office). The channel had become the HR inbox by default, except nothing about it worked like an inbox: no filtering, no export, no audit trail.
The real cost shows up once you add up what was actually happening every month.
Employees who tried to follow process wrote a quick Teams chat for the manager (5 minutes), then a formal email to HR afterward so there’d be a paper trail (10 to 15 minutes). At 200 leave events a year, that email alone was ~50 hours of employee time spent on paperwork nobody wanted to do. Most people skipped it.
HR picked up the slack, every single month:
| Monthly HR task | Hours |
|---|---|
| Scroll the channel to reconcile who took leave | 1 to 2 |
| Build the monthly leave summary report | 1 to 2 |
| Update timesheets and salary calculations from the report | 3 to 4 |
| Total | 5 to 8 hours / month |
That’s 60 to 96 hours a year of HR work on leave admin alone, and it scales linearly with headcount. H.A Fashion’s office is 20 people today. If the team doubles, so does this number. On top of all of that, requests that arrived during a busy morning sometimes got buried entirely.
The ask from the client was specific: don’t change how employees or managers behave. Build something that watches the channel, understands what’s happening, and produces a clean record.
Client framing: "95% of messages in this channel are leave requests. The HR inbox was already here. It just didn't look like an inbox."
One automation, three jobs
Every hour, a background system reads the Teams channel, figures out what happened in each conversation, and files the result two ways: a clean email to HR, and a row in a live spreadsheet. Nobody on the team does anything different.
Design principle: No new tool. No training. No process change. The system runs beneath the conversation that already exists.
What happens when Thu asks for Friday afternoon off
Thu types her usual “Hi boss, taking Friday afternoon off” in the channel. Her manager replies “OK” ten minutes later. Thu closes the chat and gets on with her day.
An hour later, the automation wakes up, reads every new message and reply in the channel, and notices Thu’s thread has both a request and an approval. It hands the conversation to an AI that reads what she wrote, pulls out the details (who, what type of leave, when, who approved), and fills in a short template.
HR’s email client pings. Thu’s manager is on the Cc line. The CEO is on Cc too. The email shows exactly what was requested and exactly who approved it, formatted the same way every time. Simultaneously, a new row lands at the bottom of the HR spreadsheet: name, department, date, leave type, reason, approver.
If a manager approves something on Friday evening, Monday’s first poll picks it up. The system keeps a 14-day memory of pending requests so nothing falls through the gap.
Why AI, not keyword matching
The team looked at the 416 historical messages. Employees don’t write the same way twice. Some greet the manager by name, some don’t. Some write dates with slashes, others with dashes. Some mix in English when a foreign partner is on the channel. A rules engine would be hundreds of lines of brittle pattern-matching that breaks the first time somebody spells a word differently.
The AI classifier is one prompt. It reads the conversation the way a person would, pulls out the five things HR needs (requester, type, date, reason, approver), and hands back a structured record. It handles Vietnamese and English equally well, and picks up new phrasings automatically.
Five leave categories are recognized: full or half-day off, early departure, late arrival, work-from-home, and cancellations. If the AI can’t confidently classify a message, it retries up to three times and alerts me if it still fails. Nothing silently disappears.
The output
Here’s what actually lands in HR’s inbox:
From: no-reply@[client-domain]
To: hr@[client-domain], manager@[client-domain]
Cc: ceo@[client-domain]
Subject: [Leave] [Employee] - Afternoon off 28/03/2026 ✓ Approved
✓ Approved
..........................
Employee: [Employee]
Department: Accounting
Type: Personal leave
Date: 28/03/2026
Time: Afternoon
Reason: Family matter
Manager: [Manager]
Approved by: [Manager]
..........................
Original Teams message:
"Dear [A], Dear [B]. I'd like to take tomorrow afternoon off
(Sat 28/03/26) due to a family matter. Thank you."
The actual template at the client is in Vietnamese. Shown in English here for readability. Labels and language are configurable per client.
The original Teams message is quoted at the bottom so the email is self-contained. HR can filter the Sheet by month, by department, by leave type, or copy rows straight into a payroll workbook they already know how to use.
Built on tools they already had
No new software was purchased. No accounts were created for employees or managers. The automation authenticates with its own identity (one-time admin approval), uses the same Microsoft 365 already running in the office, and writes to a Google Sheet because that’s what HR already uses for everything else.
The checkpoint is deliberate: every design choice was made to avoid creating a second system for anyone to maintain. The value of “nothing changes” compounds every week nobody has to think about it.
What it runs on
| Component | Tool | Cost |
|---|---|---|
| Automation engine | n8n (self-hosted) | Shared MPStudio server |
| Reading Teams and sending email | Microsoft 365 (built-in) | Already in place |
| AI classification | GPT-4o-mini via OpenRouter | ~$0.02/day |
| Live audit log | Google Sheets | Free |
Runtime cost is about $0.02 per day in AI inference. Everything else is infrastructure the client already pays for.
What changed
- ~50 hours of HR time reclaimed per year. The scrolling and monthly report-building (2 to 4 hours a month) collapse to a filter on a spreadsheet. Timesheet and salary work still happens, but HR starts with clean, structured data instead of raw chat.
- ~50 hours of employee time reclaimed per year. The formal confirmation emails nobody wanted to write now write themselves.
- No missed requests thanks to the 14-day memory on pending approvals.
- 100% classification accuracy on the 416-message historical dataset used to tune the AI.
- Any language handled because the AI reads like a person, not a keyword matcher.
- Employees and managers change nothing. Teams chat stays Teams chat.
The bigger picture
This covers the 20-person Hanoi back office, which is planning significant expansion over the next year. The factory floor is a different scale entirely: hundreds of staff already working there today, none of whom live inside Microsoft 365 the way the office does. Extending the same pattern to them is the next conversation we’re having: plugging in a different entry point (Zalo, a simple web form, or a tablet on the factory floor), while the logic underneath stays the same. Read the request in natural language, extract what HR needs, file it automatically.
The point was never to build an HR app. The point was to make the messy, human conversation that already happens turn itself into a clean, audit-ready record. For a 20-person office that was already starting to feel the cost of growth, that’s 3 weeks of work and $0.02 a day to keep the back office running smoothly while everyone stays focused on the actual business.