In just 12 months, a 28-person digital agency in Ho Chi Minh City grew from 22 clients to 41, and revenue climbed 45%. The leadership team celebrated, but when the books closed, the profit they actually kept was lower than the year before. Revenue grew faster than the agency’s ability to control costs: every new client brought more work, more hours and more change requests, but not a proportional increase in profit.

This case study looks at how that agency escaped the “growth trap” in 90 days: moving from gut-feel quoting and last-minute timesheets to an Odoo Sales – Project – Timesheets workflow that measures profitability for every client, project and retainer.
Table of Contents
💡 Core insight: Agencies rarely get poorer because they lack clients. They get poorer because they can’t tell which clients are profitable and which ones are quietly consuming the team’s hours. When pricing, hours and costs live in the same system, decisions about taking on a client, raising a price or declining a change request are based on data instead of instinct.
21% → 31%
Gross margin recovered after 90 days on Odoo
90 days
From initial assessment to full operation with a live profitability dashboard
41 clients
Every client measured for profitability by project and retainer
PART 1
The Growth Trap: Revenue Goes Up, Cash Doesn’t
The agency has 28 people across four teams: Account (4), Creative & Content (10), Performance/Media (8) and Tech & Web (6). After 12 months of expansion, revenue was up 45% but gross margin had fallen from 34% to 21%. Leadership identified three traps that repeat in most fast-growing agencies:
| The Trap | How It Shows Up in Operations | Impact on Margin |
|---|---|---|
| Gut-feel quoting | Account managers estimate prices from experience and competitor rates, not from the actual hours each task requires | Many contracts are signed below the true labor cost without anyone realizing it |
| Scope creep inside retainers | Clients keep asking for “just one more tweak,” and the team hesitates to push back or log the extra hours | Hours rise while fees stay flat, so retainers slowly turn negative-margin |
| Watching revenue, not profit per client | Month-end reports show only total revenue and total payroll, with no profit or loss by client or project | Loud, unprofitable clients get priority while profitable ones are neglected |
PART 2
The Odoo Solution: Protecting Margins from Quote to Delivery
Sonix did more than install software. We redesigned the “path of the money” inside the agency, from the first quote to final acceptance, across three connected apps: Odoo Sales, Odoo Project and Odoo Timesheets.
💰 Quotes Built on Standard Hours and Real Costs
Each service (brand identity design, social page management, ad campaigns, landing pages) is standardized as a service product in Odoo Sales, with planned hours for each role. Account managers see the expected margin on a quote before it goes to the client.
🛡️ Controlling Retainers and Change Requests
Each retainer is tied to a fixed hour allowance in Project. When actual hours hit the warning threshold, the project manager is alerted to negotiate an addendum or bill the extra work, instead of silently absorbing it for the client.
📈 Profitability Reports by Client and Project
Hours logged in Timesheets flow into project costs automatically and are matched against sales order revenue. Leadership can see profit and loss by project, client and service type on a dashboard, without waiting for month-end consolidation.
PART 3
The 90-Day Implementation Roadmap
The agency still had to deliver for 41 clients throughout the transition, so the project was split into three phases to avoid disrupting operations:
- Days 1 – 30 (Diagnose & Standardize): Review the past 12 months of data to identify which clients are profitable and which are not. Standardize the service catalog, planned hours per task and labor cost rates by seniority level.
- Days 31 – 60 (Pilot with 8 Clients): Run the quote – project – timesheet flow on 8 clients, covering both retainers and one-off projects. Build the daily time-logging habit and fine-tune the over-hours warning thresholds.
- Days 61 – 90 (Go-Live & Pricing Review): Roll out to all 28 team members and 41 clients. Add the client profitability report to the monthly leadership meeting and begin repricing negative-margin contracts.
PART 4
Results: Margins Recover Within 90 Days
After three months of operation, Odoo reports showed that the main “leaks” had been closed:
| Metric | Before Implementation | After 90 Days on Odoo |
|---|---|---|
| Average gross margin | 21% (down from 34% the previous year) | 31% (labor cost under control) |
| Negative-margin clients/projects | Unknown | 9 clients identified, 6 of them repriced or rescoped |
| Non-billable hours ratio | 38% | 22% (extra work now logged and billed) |
| Time to complete a quote | 2 working days | 4 hours (using standardized service templates) |
PART 5
Lessons for Growing Without Sacrificing Profit
From this agency’s journey, service businesses on a growth path can take away three lessons:
- Measure profit before you measure revenue: Evaluate every new client by expected margin, not just contract value. A large contract with a negative margin makes an agency poorer faster than a small profitable one.
- Turn “extra work” into numbers: When every additional hour is logged, conversations with clients shift from opinion to evidence, and declining or charging for extra work becomes much easier.
- Be willing to reprice or part ways with negative-margin clients: With clear data, leadership has the basis to raise prices, tighten scope or end a relationship, freeing capacity for clients who deserve it more.
Learn more about our methodology and real-world solutions in Sonix’s international-standard Odoo implementation services.
KEY TAKEAWAYS
| Core Element | Practical Impact |
|---|---|
| Quotes based on standard hours | Stops contracts from being signed below cost from day one. |
| Retainer hour allowances with alerts | Catches scope creep early so you can negotiate an addendum instead of absorbing the cost. |
| Profitability by client | Lets you raise prices, keep or end a client relationship based on real numbers. |
Is your agency growing while profit fails to keep up?
Book a 1-on-1 consultation with a Sonix expert to review your margins by client and build an Odoo workflow that protects your agency’s profit.
Sonix – Helping businesses optimize operational productivity.

Leave us your comment