Navbatly — A Support Desk SaaS for Agencies, Built on Laravel and Inertia.js

Karve Digital is a Dubai-founded engineering studio that builds and looks after websites and apps for clients across the UAE, the GCC and the UK. A large share of that work runs on monthly support plans: a set number of hours each month for updates, fixes, checks and small improvements.
Navbatly is the tool we built to run that work. It is our own product, made by the team that uses it every day, and it is now live at navbatly.com for other agencies and freelancers.
Our support work lived in Linear, our project tracker, and every month someone rebuilt each client's hours by hand. Three things kept going wrong.
- Tracking support hours. Hours were written into issue titles, like "[3 hours]", with sub-issues holding the internal breakdown. Adding up a client's month meant reading every issue again.
- Carrying hours over. Unused hours on a plan should roll into the next month, up to whatever cap was agreed. None of our tools knew what a monthly allowance was, so rollover lived in a spreadsheet and in our heads.
- A simple report. Each client wanted one page: what we did, in plain English, and which hours were included or billable. We built that sheet from scratch every month instead of pressing one button.
On top of that, a lot of late work was really waiting on the client — copy, logins, approvals — and nothing recorded for how long.
We built the tool we kept wishing we had
Every agency that sells support hours ends up with the same patchwork: a project tracker for the work, a timer or a spreadsheet for the hours, and a document for the client at the end of the month. We had that patchwork too, and month-end meant rebuilding the same numbers by hand for every client.
So we designed Navbatly around the thing the other tools leave out: the client's contract. Every request becomes a ticket numbered per client, like HBL-12, and every hour logged on it counts against the right contract in the month it was worked.

Problem one: tracking support hours
Time is logged on the ticket as client contact (calls, meetings, emails) or delivery (building, fixing, testing), and each entry is included in the plan, billable on top, or no charge. Change how a ticket is charged and it applies to new time, so a month you have already reported never changes under you. A month's hours export to CSV for invoicing.
Problem two: carrying hours over
A support plan holds a monthly allowance, with unused hours rolling into the next month up to an optional cap. When a month runs over, the agency chooses what happens: show it, bill it, carry it into next month or write it off. Goodwill hours go in as an adjustment with a reason, and terms can change from a chosen month without rewriting the months before.

Problem three: a client report in one click
Each ticket gets one plain-English line for the client, written once while the work is fresh. At the end of the month the report is already there: work completed and in progress, the hours for each, and the hours used and left on the plan. It goes to the client's contacts by email or as a private link with no sign-in, and Navbatly reminds the team if a month's reports have not gone out.

Why not Linear, Notion or a help desk?
We tried to make our existing tools do it first. Linear is excellent for product engineering, but it is built around issues and cycles, not a client's monthly allowance, so hours ended up in issue titles. A Notion database could hold anything, but every rollover rule, client view and report would have been ours to build and maintain. Service desks and time trackers each cover part of the job, and the gaps go back into a spreadsheet. The full story is in why we built Navbatly instead of using Linear or Notion.
The feature we did not plan: Client Clock
Once the hours were right, the next pattern was obvious: much of our late work was waiting on the client. Client Clock puts what we need — copy, files, access or an approval — on the ticket, asked of one person, with its own count of days waited. The client sends it from a private link without signing in, reminders go out on set days, and a project's target date moves later by every day it waited.


Why Laravel and Inertia.js
Navbatly is a Laravel application with an Inertia.js front end. Laravel handles routing, sign-in, permissions and the billing rules; Inertia renders the screens as a fast single-page interface without a separate API to version and secure. For a product whose value is in its rules — which month an hour counts in, how rollover is capped, who may change a contract — keeping those rules in one codebase was the deciding factor.
The same rules sit behind Navbatly's MCP server. Connect Claude or another MCP assistant, sign in with a Navbatly account — no API key to copy — and it can find and update tickets, log time, ask clients for what is needed and pull a client's report, with exactly the permissions that person has in the app.
Running Karve Digital on Navbatly
We moved our own client support into Navbatly before launch. On 28 October 2026 it held five clients (Karve Digital itself included), four monthly support plans and 139 tickets, 112 of them resolved, with 36 hours 55 minutes logged in October across 45 time entries. The work on Navbatly itself runs as one of those contracts, so we meet every rough edge first.
Much of the ticket and time work now goes through Claude. Even this case study was planned as tickets in Navbatly, opened and closed from Claude through the MCP server.
Building a SaaS product of your own?
This is the work we do for clients: product design, a Laravel application with a modern interface, an MCP server for AI assistants, and the marketing site that explains it all. See our SaaS development service, or try Navbatly yourself.
The approach
Model the contract first
Support plans, project budgets and hourly work are first-class records, so every hour has a home before a ticket is even opened.
Count time where it was worked
Each entry counts in the month it was worked and is marked included, billable or no charge, so rollover and overage are calculated, not typed.
Write the client's line once
A plain-English summary on each ticket becomes the monthly report, so it needs no rebuilding and the client needs no login.
One set of rules for people and AI
The Inertia.js app and the MCP server go through the same Laravel permission checks, so Claude can do what the user can and nothing more.





The outcome
- Product strategy & UX
- Laravel application
- Inertia.js front end
- Support plans with rollover & overage
- One-click monthly client reports
- Client Clock & no-login request links
- MCP server for Claude
- Passkeys & two-factor sign-in
- Marketing site & comparison pages
Questions
What is Navbatly?
Navbatly is a support desk for web agencies and freelancers, made by Karve Digital. Requests become tickets numbered per client, hours count against each client's contract in the month they were worked, unused hours can roll over, and every client gets a plain-English monthly report.
What is Navbatly built with?
Navbatly is a Laravel application with an Inertia.js front end. It also has an MCP server, so Claude and other assistants can work with tickets, time and reports using the same permissions the person has in the app.
Why didn't Karve Digital use Linear or Notion for client support?
Linear is built for product teams' issues and cycles, not monthly client allowances, so we were writing hours into issue titles and rebuilding reports by hand. Notion could be shaped into a tracker, but the rollover rules, client views and reports would have been ours to build and maintain.
Can Karve Digital build a SaaS product like this for us?
Yes. We design and build SaaS products end to end — product discovery, Laravel and Inertia.js or Next.js applications, AI and MCP integrations, and the marketing site — for clients in the UAE, the GCC and beyond.







