Track time with the timer
Everyone
- Click Start timer in the header or on the Timesheet page.
- Pick a project (only projects you're assigned to appear) and a task.
- Elapsed time counts in your browser β no need to keep the tab focused.
- Click Stop when you're done. If you forget, an amber warning appears the next day so you can stop and fix it.
- Only one timer runs at a time β starting a new one stops whatever was running.
Edit your week on the Timesheet
Everyone
- Click any cell to edit it. Type a value like 1:30, 1.5, or 45m and press Enter.
- Tab moves to the next cell β the grid is keyboard-navigable like a spreadsheet.
- Locked cells (π) belong to an invoice already pushed to Xero and can't be edited until that invoice is voided.
- Use βAdd rowβ to log time against a project/task you haven't used yet this week.
Log an expense
Everyone
- Go to Expenses β Log expense.
- Pick a project, category, amount, and date.
- Attach a receipt: upload a file directly (JPEG/PNG/WebP/PDF, max 10 MB) if your admin has connected receipt storage, or paste a link instead.
- Toggle Billable if the client should be charged for it.
Set up a client and project
Everyone
- Clients β New client. Set their default invoice line grouping and whether hours round when invoiced.
- Projects β New project. Pick the client, a colour, and optionally a budget (hours or $).
- Open the project's detail page to assign team members and set budget alert thresholds β any %, as many as you like.
- Only assigned people can track time against a project.
Set rates
Admin only
- Settings β Rates.
- Billable rates resolve project override β client override β default. Add whichever level you need.
- Cost rates are separate and only used internally for profitability reports β clients never see them.
- Click any rate's dollar amount to edit it in place, or use Add rate for a new one.
Draft and push an invoice
Admin only
- Invoices β New invoice. Pick the client and a line grouping (project, task, person, or every time slot).
- Review the unbilled time and expenses that come up β you can deselect anything you don't want on this invoice.
- Create draft. That attaches the selected entries so they leave the unbilled pool, but they stay editable until you push to Xero.
- Push to Xero from the invoice list once you're ready. That locks the time and expenses. Status (draft / awaiting payment / paid / voided) syncs back via webhook, then shows on GET.
- If a Xero invoice is voided or deleted, its Realtime entries unlock automatically. If Xero isn't configured, drafts never lock β the lock path stays honest.
Connect Xero
Admin only
- Requires XERO_CLIENT_ID and XERO_CLIENT_SECRET set in the app's environment β ask whoever deployed Realtime if you don't see a Connect button.
- Settings β Integrations β Connect Xero, then approve access in the Xero popup.
- Once connected, invoice drafts get a Push to Xero button. Nothing is pushed automatically.
Import from Harvest
Admin only
- Requires HARVEST_ACCESS_TOKEN and HARVEST_ACCOUNT_ID set in the environment.
- Settings β Integrations β Import from Harvest. Status is idle, queued, running, failed, or succeeded β it survives a reload.
- Imports people, clients, projects, tasks, assignments, rates, time entries, expenses, and invoice history one page at a time (Harvest's 100 req / 15s limit, 429 retries). Running timers are skipped.
- Safe to re-run β Harvest IDs are kept as external references so nothing gets duplicated. A dead leftover 'running' job is marked failed so you can retry. Only one job at a time.