live in Mumbai, London, NYC 2FA · Audit log · TLS
Projects & billing

From clock-in to a sent invoice.

Projects with hourly, fixed-fee, or non-billable types. Tasks per project. Approved time rolls into budget, billable hours, and a per-client invoice in the client’s billing currency. FX snapshot locked at issue. Payment ledger append-only. One chain, no reconciliation. Finance accepts the first export.

No card needed · 14-day full-access trial
app.getfruitful.io/dashboard/projects/atlas-redesign
A
Atlas redesign
Acme Holdings · Hourly · $145/hr
Hourly
Hours logged
142h 30m
Billable
128h 12m
Revenue
$18,591
Budget
89%
Budget burn 142h / 160h · 18h to red
Last 4 approved entries
Anita Desai 3h 45m $543.75
Marcus Wong 2h 00m $290.00
Priya Mehta 5h 15m $761.25
Anita Desai 1h 30m $217.50
3 types
Hourly · fixed · non-billable
Per project
Per client
Currency · FX snapshot at issue
Locked once sent
One chain
Entry → approval → invoice → ledger
Audit-logged each step
Xero export
Sales-invoice template, ready
Plus generic CSV + PDF
01 · Projects

Three billing types.
One workflow. The type just decides what the rollup adds up to.

Hourly projects track billable revenue at the per-employee or per-project rate. Fixed-fee projects track delivery against budget. Non-billable projects track time without surfacing a number — internal R&D, ops, training. All three share the same approval queue.

Project tile · dashboard list

The card the agency lead checks
three times a day.

Each tile shows hours logged, budget %, billing type, and tasks open / total. The budget bar flips amber at 80%, red past 100% — so a partner spots an overrun before it lands on a Friday invoice review. Same component on the projects index in the dashboard.

  • Hourly · fixed · non-billable Three billing types, one approval queue. The billing type only decides what the rollup adds up to — hours, budget burn, billable revenue, or just hours.
  • Per-project hourly rate Each hourly project stores its own rate. Move a senior onto an entry-rate project for one week and the billable math respects that, automatically.
  • Budget bar flips before you do Brand under 80%, amber at 80-100%, red past 100%. Same colour rule on the tile, the detail page, and the report — so the warning is consistent everywhere.
app.getfruitful.io/dashboard/projects
Active · 6 projects
A
Atlas redesign
Acme Holdings
Hourly
Hours
142h
Revenue
$18,591
Budget 89%
M
Mobile MVP
Coalpine BPO
Fixed fee
Hours
78h
Revenue
Budget 54%
P
Pricing teardown
Linework Studio
Hourly
Hours
14h
Revenue
$2,030
Budget 22%
Q
Q3 internals
Internal
Non-billable
Hours
4h
Revenue
02 · Tasks

Tasks that point
at one project. So time entries find their home.

Inside a project

Assignee, estimate, status, due date.
That is the form.

Tasks belong to a project. Each task carries an assignee, an estimated hour count, a status (to-do / in-progress / completed), and an optional due date. Time entries reference task_id, so per-task burn is computed without any extra book-keeping.

  • One task = one home for an entry Manual entries pick from a dropdown of tasks scoped to the project. Auto entries inherit the active task from the agent context.
  • Estimated vs logged, visible Each task row shows logged hours vs estimate. Overruns flag without anyone having to ask.
  • Status, not a Kanban board To-do, in-progress, completed. Three states, no swim lanes. If you need a project tracker, use one — Fruitful tracks the hours.
app.getfruitful.io/dashboard/projects/atlas-redesign?tab=tasks
Atlas redesign · 12 tasks
Task Assignee Status Hrs / Est
Homepage v3 layout Anita Desai in progress 12h / 16h
Pricing block refresh Anita Desai in progress 8h / 10h
Component library audit Marcus Wong completed 24h / 20h
Mobile nav patterns Priya Mehta todo 0h / 12h
Handoff notes Marcus Wong todo 0h / 4h
Per-task hours auto-roll into the project total. No double-counting.
03 · Approval chain

One queue.
Three intents. No drift.

Approval queue

Manual time, project entries, leave.
Same shortcuts.

Manual time entries, project-tagged entries, and leave requests all sit in the same approval queue. Managers approve a week in two minutes with the same keyboard nav. Every approve / reject / edit writes a row to the audit log — manager id, original value, timestamp, reason.

  • Bulk approve with keyboard ⌘A select all visible. ⌘↵ approve. A week of timesheets clears in under two minutes — no mouse required.
  • Project + task tagged at entry Manual entries land on the right project AND task. The rollup updates the moment a manager taps approve.
  • Audit row on every change Every approve, edit, reject is logged with the manager id, the original value, and the timestamp. The audit table is append-only — nothing rewrites history.
app.getfruitful.io/dashboard/attendance?tab=manual-time
Pending · 7 entries
⌘A select · ⌘↵ approve
Employee Project · Task Hours Action
Anita Desai Atlas · Pricing block 2h 30m
Marcus Wong Atlas · Component audit 1h 15m
Priya Mehta Mobile MVP · Nav patterns 3h 00m
Approved entries land on the project rollup immediately. audit-logged
04 · Multi-currency invoicing

Issue in their currency.
Report in yours. FX snapshot locked the moment you send.

How the chain works
  • Per-client billing currency Each client carries its own billing currency. A US client gets a USD invoice, a EU client gets an EUR invoice — automatic, never asked.
  • Org book currency Your company sets a base accounting currency (book_currency). Every invoice carries a total_in_book_currency column so revenue reports stay consistent across the portfolio.
  • FX snapshot locked at issue The exchange rate is recorded once when the invoice is sent and never moves. A revaluation 3 months later doesn’t silently rewrite April’s revenue.
  • Append-only payment ledger Every payment, refund, or credit is a ledger row. Balance is computed by sum — never overwritten, never deleted.
  • Xero sales-invoice export One-click CSV in Xero’s Sales Invoices import format. Generic CSV + PDF for everything else. REST API on the invoice + ledger endpoints.
app.getfruitful.io/dashboard/clients/acme/invoices/INV-2026-114
Invoice · INV-2026-114
Acme Holdings
Period · 1 → 31 May 2026
Sent
due 14 Jun
Description Hours Rate Amount
Atlas redesign · May 142.5 USD 145 USD 20,663
Pricing teardown · May 14.0 USD 145 USD 2,030
SubtotalUSD 22,693
Tax · 0%USD 0
TotalUSD 22,693
FX snapshot · 1 USD = 0.92 EUR locked 1 Jun 2026 09:14 IST. Book-currency total EUR 20,878.
audit-logged · INV-2026-114
Also in projects & billing

The boring bits done right. So Fridays are quiet again.

Recurring invoices

Set monthly / quarterly / annual cadence per client. Catch-up loop creates missed periods automatically when a recurring template comes back online — no silent gaps.

Payment ledger

Every payment, refund, credit note is a row in an append-only ledger. Balance is computed as a sum. Disputes get their own state without rewriting history.

Client disputes

Clients can dispute hours from their portal with a comment. The entry returns to the approval queue with the dispute thread attached. Audit row at every step.

Audit trail

Every project edit, every approval, every invoice issue, every payment row writes to the append-only audit log. Filter by actor and export when an auditor asks.

Branded PDF

Invoice PDFs carry your white-label brand — name, logo, primary colour, support email. Sent from your domain if you wire SMTP.

Multi-currency

Per-client billing currency, org book currency, FX snapshot at issue. Revenue reports stay consistent across the portfolio even when rates drift.

Who uses projects this way

Hourly agencies, fixed-fee studios, internal ops.

Agency founder · hourly billing
Pain

"Friday invoice review was a half-day. Two clients always disputed the total. The exports never matched what Xero expected."

Fruitful does

Approved hours roll into a per-client invoice in the client’s currency. Xero export is one click. Disputes route back through the same approval queue with the audit trail attached.

−4h / wk invoice prep time (illustrative)
Studio partner · fixed-fee delivery
Pain

"Budget overruns landed at the end. By the time we saw 110% burn, two designers had already started week three of a two-week sprint."

Fruitful does

Budget meter flips amber at 80%, red past 100%. Same colour on the tile, the detail page, and the report. Partners catch overruns at 80% instead of 120%.

−61% fixed-fee overruns (illustrative)
Ops lead · internal projects
Pain

"Internal R&D time disappeared into a black hole. We knew it cost something, but no one could say what."

Fruitful does

Non-billable projects track time without surfacing a revenue figure. The report still shows hours per project, per person, per quarter — internal capacity finally has a number.

Visibility on internal R&D capacity
The Xero CSV opened in Xero on the first try. That has literally never happened before.
R
Ravi Krishnan
Founding partner · Linework Studio
We caught a budget overrun at 84% instead of finding it after the fact. The meter flipped amber on a Monday — by Wednesday it was a fixed scope conversation.
S
Sarah Lim
Head of Delivery · Coalpine Studio
Honest questions

Things billing leads actually ask.

Can a project mix billable and non-billable time?
Yes. Each time entry is marked billable or non-billable. Hourly projects default new entries to billable, non-billable projects default to non-billable. Managers can flip individual entries either way when they approve them.
How does the FX snapshot work?
When you send an invoice, the day’s exchange rate is recorded onto the invoice. It never changes after that. A rate move three months later does not silently rewrite that invoice or shift its revenue — what you saw on the send date is what stays in the books.
What happens to overruns on a fixed-fee project?
Hours keep tracking. The budget bar passes 100% and turns red. Revenue stays at the fixed amount — overruns show up as effective-rate compression, not as inflated revenue. The partner or PM sees the burn before the next sprint starts.
Can clients see only their projects in the client portal?
Yes. Each client sees only their own projects, hours, invoices, and payments. An optional setting per client anonymises employee names — so clients see the work, never the people, if that matters to you.
Do you support recurring invoices?
Yes. Set a cadence (monthly / quarterly / annual) and a template on the client. A daily catch-up loop creates missed periods if a template comes back online after being paused. No silent gaps.
What if a client disputes an entry?
Clients with portal access can flag an entry from the invoice view with a comment. The entry returns to the manager approval queue with the dispute thread attached. Approve, edit, or reject — every step writes an audit row.
How does the Xero export work?
One click generates a CSV in Xero’s Sales Invoices import template — one row per line item, with the contact / dates / amounts / TaxType / AccountCode columns Xero expects. Bookkeepers re-map AccountCode if their chart differs. Generic CSV + PDF + REST API are also available on every invoice.

Run a billing cycle. Decide on Friday. Same chain, every client.

14 days, full access, no card. Most teams ship their first Fruitful-built invoice the Monday after onboarding.

No card needed · Cancel anytime · Onboarding in under 10 minutes