What the firm needed
The client is a project-based professional services firm in Texas with 80 to 100 employees across three offices. It runs its projects, billing and financials in Business Central.
Before this project, nothing about time or expenses reached Business Central until someone typed it in. Employees filled in Excel timesheets and emailed them to their project managers. Time off was requested by email or on a shared calendar. Expenses arrived by email with the receipts attached, or were scanned into a shared folder, and finance keyed the approved amounts into Business Central by hand.
By the firm's own estimate, that cost 8 to 10 hours a week of chasing missing timesheets, re-keying time and reconciling expenses. About 15 to 20 percent of timesheets needed a follow-up email, and closing a billing period took 7 to 10 days because submissions arrived late or incomplete.
The firm wanted one place where an employee records project time, requests time off, logs overtime and submits expenses. Each of those needed its own approval rules, and only approved entries could reach Business Central.
Where Business Central time sheets fell short
Business Central has time sheets, and for many firms they are enough. They cover one week at a time, hold project time and absence lines, work on a phone, and post approved lines to the project or resource journal. Four things did not fit this firm.
Each time sheet goes to one approver
Business Central sends a time sheet either to the approver named on the employee's resource card or to the person responsible for the project, and that choice is made once for the whole company in Resources Setup. The firm needed both, in order: the project manager approves the hours charged to the project, then the employee's direct or department manager gives final approval.
Time off is recorded, not requested
An absence line records time off on the week it is taken. The firm wanted employees to request time off ahead of the date, with the remaining balance checked before the request could be sent, and the manager approving it first.
Overtime has no rules
A time sheet records hours. It does not check them against an overtime policy or send them to a different approver. At this firm, anything over 40 hours in a week is overtime and needs its own approval from the employee's manager, and from the project manager as well when the hours are charged to a specific project.
Expenses had no home in Business Central
When the app went live in 2022, Business Central had no expense reports, which is why expenses lived in email and shared folders. Microsoft has since added an expense management module, which entered public preview in May 2026. For a firm starting today we would look at it first for expenses. The approval and overtime requirements above would still have needed the separate app.
Why we built it beside Business Central, not inside it
All of this could have been written as an extension inside Business Central. We kept the screens and the approval rules in a separate app instead, for two reasons.
- Fewer things to retest after updates. Business Central online gets two major updates a year. The only code inside Business Central is a small extension that exposes a custom API, so an update has very little of ours to break. It has come through every major update since it went live in mid-2022 without a change to the app or the API.
- Business Central only sees approved entries. Nothing reaches the project ledger until it has been approved, so project costing, billing and the financials never carry draft or rejected time.
It also means employees who only record time and expenses work in one small app and never have to learn Business Central.
What we built
The app
A React web app hosted on Azure that works the same on a phone and a desktop. Employees sign in with their Microsoft work account, then enter project time, request time off, log overtime and submit expenses, and can see where each one is in its approval.

The app checks policy before anything is submitted, so problems are fixed by the person who made them rather than found by the approver. Two examples:
- A week over 40 hours cannot be submitted until the extra hours are classified as overtime, which also sends them down the overtime approval path.
- An expense over its category limit, or missing a required receipt, is blocked until it is corrected.

Approvals
A .NET Web API holds the business rules. Project time goes to the project manager, then to the employee's manager. Time off and overtime go to the employee's manager, and expenses follow their own route. Managers approve in bulk, and entries that break a rule are held out of the batch for a separate look. A rejected entry goes back to the employee with the approver's comment.
Two details that matter in practice: a manager who is out of the office can hand their approvals to a delegate, and approvals left waiting for a few days trigger a reminder email.

The Business Central connection
Everything the app records, including each approval step, is stored in an Azure SQL database. An Azure Functions app reads the approved records from that database and sends them to Business Central, so the app employees use never writes to Business Central directly.
On the Business Central side, a small extension written in AL exposes a custom API for projects, tasks, employees and resources, dimensions, work types, cost centers and basic resource capacity, and for creating and posting journal lines. The app uses that API to load Business Central's projects, tasks and work types, so employees can only pick ones that exist.
Approved entries go to Business Central shortly after final approval, not in a weekly batch. Time arrives as project journal lines of type Resource (job journal lines, before Microsoft renamed jobs to projects), and finance has a short review window before the batch posts as project ledger entries.
What took longer than planned
Turning the multi-level approval rules, overtime and expenses especially, into an integration that still produced clean project ledger entries took longer than we planned. Our answer was to move every check into the app, so it runs before anything reaches Business Central, and to extend the custom API and the function app that sends entries to Business Central to match. Entries now arrive in Business Central already valid, which cut the rework.
What changed
These are the firm's own figures. Billing close is faster mainly because timesheets now arrive complete and on time: the app will not accept a week that breaks a rule, and reminders chase the approvals instead of finance.
"We needed a timesheet application that integrated into our Microsoft Business Central environment. Craftware has built us a solution on time and on budget. We are very happy with the outcome."
Hina P., Controller
When this approach makes sense
A separate app is worth it when approvals need more than one approver per time sheet, when overtime has to follow a policy, or when time, time off and expenses belong in one place. If one approver per time sheet fits your process, use the time sheets already in Business Central. For other Business Central work, see our Dynamics 365 and Business Central services and integration services.
Sources
Business Central behavior described on this page, from Microsoft's documentation:
