Finance & Invoicing
Where the operational loop closes. Billable hours become invoice line items. Invoices become revenue. Revenue minus cost becomes the profit number on your dashboard. All without leaving ACOS.
What Finance Does
- Generate invoices from logged billable hours and billable expenses (one click from the project Finance tab)
- Support manual line items for retainers, flat fees, and expenses
- Manage invoice lifecycle: Draft → Sent → Viewed → Paid
- Generate branded PDF invoices (downloadable, shareable with clients)
- Track per-project expenses: hard costs that feed directly into profitability calculations
- Show per-project profitability: budget consumed, revenue, cost (time + expenses), gross profit, margin %
- Partial payment recording — track installments against a single invoice
- Invoice branding: logo, brand colour, footer note, bank/payment details on every PDF
- Stripe payment links — generate a hosted checkout link per invoice; clients pay with one click
- Automated payment reminders at 5 scheduled intervals (3 days before through 21 days overdue)
Finance in ACOS is an invoicing tool, not a full accounting system. It does not handle taxes (use your accountant), payroll (use a payroll provider), or double-entry bookkeeping. It tracks revenue and margin from the work you deliver.
Invoice Numbering
Every invoice gets a sequential number in the format INV-YYYY-NNN — for example, INV-2026-001. The sequence is per organization and resets each calendar year.
Numbering is atomic — two invoices created simultaneously will never get the same number. The counter lives on your organization record and is incremented with a database lock on creation.
Invoice Lifecycle
Invoices follow a defined state machine. Each status has specific allowed actions:
Being prepared. Editable. Can be deleted. Not sent to client.
Actions: Edit, Send, Delete
Sent to client. No longer editable.
Actions: Mark Paid, Download PDF
Client opened the invoice via the Client Portal.
Actions: Mark Paid, Download PDF
Payment received. Time entries marked as invoiced.
Actions: Download PDF only
Due date passed, not paid. Automatically detected.
Actions: Mark Paid, Download PDF
Voided. Cannot be deleted or reinstated.
Actions: Download PDF only
State machine flow
A paid invoice cannot be deleted. If you need to void a paid invoice, use Cancel and create a corrective invoice. This preserves your audit trail.
Creating an Invoice
Method 1: From a project (most common)
Open the project → Finance tab
You'll see unbilled hours and a Generate Invoice button.
Click Generate Invoice
ACOS pulls all billable, un-invoiced time entries for this project and groups them into line items.
Review line items
Each line item shows the service description, hours, rate, and total. You can edit descriptions, remove items, or add manual line items.
Set bill-to and dates
The contact is pre-filled from the project. Set the invoice issue date and due date (payment terms).
Save as Draft
Review the invoice one more time. Download the PDF preview if needed.
Send
Click Send Invoice. The status changes to Sent. An email notification is sent to the contact automatically.
Method 2: From the invoices list (manual invoice)
Go to Finance → Invoices → New Invoice. Select a project and contact, and manually add line items. This is useful for flat-fee retainers, expense reimbursements, or milestone-based billing that doesn't directly map to logged hours.
Invoice Line Items
Each line item on an invoice has:
| Field | Notes |
|---|---|
| Description | What was delivered. Pulled from the task description or time entry description when auto-generated. |
| Quantity | Hours for time-based items. Units for flat items. |
| Unit Price | Billing rate per hour (or per unit for flat items). |
| Total | Quantity × Unit Price. Calculated automatically. |
When generating from time entries, ACOS groups entries into line items by service type (if tasks are linked to services) or by team member. You can reorganize these groupings before saving.
PDF Invoices
Every invoice can be exported as a branded PDF. PDF generation happens in the background (via Celery + WeasyPrint). When you click Download PDF, ACOS checks whether the PDF is ready:
- If ready: download starts immediately.
- If not yet ready: ACOS returns a 202 Accepted response. Wait 5 seconds and try again (a Retry-After header tells the client how long to wait).
- PDFs include your organization logo, bill-from details, bill-to contact, invoice number, dates, line items table, and total.
PDF contents
- Your organization's name, logo, and address
- Client's name and address (from the contact record)
- Invoice number, issue date, and due date
- Line items table with description, quantity, unit price, and line total
- Subtotal, tax line (if applicable), and grand total
- Payment terms and any notes you added to the invoice
Marking Invoices Paid
When a client pays:
Open the invoice detail page
Find the invoice in Finance → Invoices or from the project's Finance tab.
Click Mark Paid
A confirmation dialog appears. Confirm the payment.
ACOS records payment
The invoice status changes to Paid. The paid_at timestamp is set. All linked time entries get is_invoiced = true.
What happens to linked time entries
Once an invoice is marked Paid, all the time entries that were included in that invoice have is_invoiced = true set. They will not appear in future invoice generation for the same project. This prevents double-billing.
Partial Payments
Available on Growth and Scale plans. Allows recording payment in installments against a single invoice.
Open the invoice → click Record Payment
The dialog shows the full outstanding balance. Change the amount to the partial payment received.
Save
The invoice status becomes Partially Paid. The outstanding balance is shown on the invoice detail.
Record additional payments
Each payment is tracked with an amount and date. When the total paid equals the invoice total, the status automatically moves to Paid.
Project Finance Tab
Every project has a Finance tab that gives you the full financial picture of that engagement — KPI cards at the top, invoices below, and the full expense list at the bottom.
| Metric card | Definition |
|---|---|
| Budget | The project budget set at creation (from deal value on conversion, or manually set) |
| Revenue | Total billed_amount across all billable time entries on this project |
| Cost | Time cost (hours × rate) plus all hard expenses logged against this project |
| Gross Profit | Revenue − Cost (time + expenses) |
| Margin % | (Gross Profit ÷ Revenue) × 100, color-coded green/amber/red |
The Finance tab is only visible to Managers, Admins, and Owners. Regular Members do not have access to financial data on any project.
Expense Tracking
Expenses capture hard costs on a project — software subscriptions, contractor fees, travel, hardware, marketing spend — separate from time-based cost. Every expense either is or isn't billable to the client, and all expenses roll up into the project's profitability numbers automatically.
Adding an expense
Open the project Finance tab
Navigate to the project and click the Finance tab.
Click Add Expense
Scroll to the Expenses section at the bottom and click Add Expense.
Fill in the details
Enter a title, amount, currency (USD / EUR / PKR), category, and date.
Set billable status
Toggle Billable on if this cost will be passed through to the client invoice.
Attach a receipt (optional)
Paste a receipt URL for documentation and audit trail.
Save
Click Save — the expense appears immediately and the project cost and margin recalculate.
Expense categories
| Category | Typical use |
|---|---|
| Software | SaaS tools, licences, API credits bought for this project |
| Contractor | Freelancer fees, subcontractor invoices |
| Travel | Flights, hotels, client-site visits |
| Hardware | Equipment purchased for a specific deliverable |
| Marketing | Ad spend, promoted posts run on behalf of the client |
| Other | Anything that doesn't fit the above |
Billable vs non-billable expenses
A billable expense will appear as a selectable line item when you generate an invoice from the project. Toggle the Billable switch when adding or editing the expense. Non-billable expenses still count toward your project cost and reduce your margin — they just don't appear on the client-facing invoice.
When generating an invoice, the invoice form shows an Unbilled Expenses panel alongside the Unbilled Hours panel. Check the expenses you want to include — each becomes a separate line item on the invoice at the recorded amount.
Editing and deleting expenses
Click the edit icon on any expense row to open the form pre-filled with existing values. Click the trash icon to delete — a confirmation dialog prevents accidental deletion. Both actions immediately recalculate the project's total cost and gross profit.
Global expenses view
Go to Finance → Expensesto see every expense across all projects in one table. Filter by category, billable status, or search by title. Click any row to jump directly to that project's Finance tab. This view is useful for end-of-month cost reviews or when you need to find a specific contractor invoice across multiple engagements.
The global Expenses page does not convert between currencies — if your team logs expenses in PKR, EUR, and USD, the summary totals add raw amounts across currencies. Use the per-project Finance tab for accurate per-currency cost figures.
Overdue Invoice Detection
ACOS runs a daily background task that checks for invoices with status = sent and due_date < today - 7 days. It creates a Smart Alert (Overdue Invoice warning) for each one found. If the invoice is still unpaid 21 days past due, the alert severity escalates to Critical.
These alerts appear on your Dashboard and in the Smart Alerts section. See Smart Alerts for details.
Roles & Permissions
| Action | Member | Manager | Admin | Owner |
|---|---|---|---|---|
| View invoice list | ✗ | ✓ | ✓ | ✓ |
| View invoice amounts | ✗ | ✓ | ✓ | ✓ |
| Create invoices | ✗ | ✓ | ✓ | ✓ |
| Send invoices | ✗ | ✓ | ✓ | ✓ |
| Mark invoice paid | ✗ | ✓ | ✓ | ✓ |
| Download invoice PDF | ✗ | ✓ | ✓ | ✓ |
| Delete draft invoices | ✗ | ✓ | ✓ | ✓ |
| Add / edit / delete expenses | ✗ | ✓ | ✓ | ✓ |
| View global Expenses page | ✗ | ✓ | ✓ | ✓ |
| View org-wide finance dashboard | ✗ | ✗ | ✓ | ✓ |
Best Practices
- Always save as Draft first and preview the PDF before sending. Errors on a sent invoice (wrong amount, wrong client) require a cancellation and reissue.
- Set net payment terms consistently — if your standard is 30 days, always set the due date to issue date + 30. This makes the overdue alert system reliable.
- Invoice regularly, not just at project end. Monthly invoicing keeps cash flow healthy and gives clients predictable billing.
- Add meaningful descriptions to time entries — they become line item descriptions on the invoice. 'Frontend development sprint 3' is more professional than 'dev work'.
- Match your invoice to the proposal scope. If the invoice total is significantly higher than the original deal value, expect the client to question it.
FAQ
Can I edit an invoice after it's been sent?
No. Once an invoice is in Sent status, it is locked. To correct it: cancel the current invoice, then create a new one with the correct details. The client will receive an updated PDF. The cancellation also triggers an email notification to the contact.
My invoice shows zero revenue even though I have billable time entries.
Check two things: (1) Are the time entries marked is_billable = true? (2) Is a billing rate set on the ProjectMember or service? If billing_rate = 0, billed_amount will be 0 regardless of hours.
Can I add tax to an invoice?
Yes — you can add a tax line item manually when creating or editing the invoice in Draft status. ACOS does not automatically calculate tax because tax rules vary by jurisdiction. Consult your accountant about the correct rate to apply.
Can two invoices reference the same time entries?
No. Once a time entry is included in an invoice (and the invoice is paid), is_invoiced is set to true and that entry will not appear in future invoice generation. This prevents double-billing.
The PDF generation seems slow. Is this normal?
PDF generation runs as a background task. For most invoices, the PDF is ready within 3–5 seconds. For invoices with many line items, it may take up to 15 seconds. If the PDF isn't ready when you click Download, wait a few seconds and try again.
Can I log expenses in a different currency than the project?
Yes. Each expense has its own currency field (USD, EUR, PKR) independent of the project's billing currency. The amounts are stored as-entered; ACOS does not convert between currencies. For clean profitability figures, keep all expenses on a project in the same currency as its revenue.
An expense is billable but didn't show up when generating an invoice.
The invoice form only shows expenses that are marked billable AND have not already been included in a previous invoice. If the expense was already invoiced, it will not appear again. Check the expense's edit form — there is no "invoiced" flag on expenses (unlike time entries), so if it's missing, confirm the expense exists and is marked billable.
Does deleting an expense affect already-sent invoices?
No. Invoice line items are stored independently once created. Deleting an expense only removes it from the project expense list and recalculates the project cost — it does not alter any existing invoices that included it.
Invoice Branding
Every invoice PDF can carry your brand. Configure branding at Settings → Invoice (Growth+ plans). Changes apply to all future PDFs and regenerated PDFs immediately.
- Logo — upload PNG, JPG, or SVG (max 2 MB). The logo replaces the org name text in the PDF header. If no logo is uploaded, the org name is shown in your brand colour instead.
- Brand colour — hex colour applied to the invoice table header row, the Total row background, and the accent line below the header. Defaults to ACOS gold (#C9A84C).
- Footer note — a short message printed at the bottom of every invoice PDF. Use it for a thank-you line, your registered business address, or tax information.
- Bank / payment details — multi-line field for bank name, account number, IBAN, routing number, etc. Each line renders on its own line in the PDF under a Payment Instructions heading.
- Default payment terms — pre-fills Due on Receipt, Net 7, Net 14, or Net 30 on every new invoice. Individual invoices can override this.
The PDF footer shows Powered by ACOS on every page. This cannot be removed.
Stripe Payment Links
Connect your Stripe account under Settings → Integrations → Stripe. Once connected, an invoice detail page shows a Generate Payment Link button. Clicking it creates a hosted Stripe Checkout page and stores the link on the invoice.
- The payment link appears as a Pay Now → button in the client portal.
- Links are per-invoice — each invoice gets its own Stripe Payment Link.
- Stripe sends you a webhook when the payment completes. ACOS marks the invoice Paid automatically.
- Disconnect Stripe any time from Settings → Integrations. Existing links remain valid.
Stripe payment links are billed through your Stripe account — standard Stripe fees apply. ACOS does not add any additional fee.
Automated Payment Reminders
ACOS sends automatic reminder emails to the invoice contact at five scheduled points. Reminders use your org email (Gmail API) and include a link to the client portal where the client can view and pay the invoice.
| Trigger | When it fires | Sent to |
|---|---|---|
| 3 days before due | Due date minus 3 days | Invoice contact email |
| Due today | The due date itself | Invoice contact email |
| 7 days overdue | Due date plus 7 days | Invoice contact email |
| 14 days overdue | Due date plus 14 days | Invoice contact email |
| 21 days overdue | Due date plus 21 days | Invoice contact email |
- Reminders only fire on invoices with status Sent or Overdue — Draft and Paid invoices are skipped.
- Each reminder type is sent at most once per invoice — no duplicate sends.
- Org-level toggle: Settings → Invoice → Automatic reminders. When off, no reminders fire for any invoice in the org.
- Per-invoice toggle: the Reminders section on each invoice detail page. Disable reminders for a specific invoice without affecting others.
- Manual send: click Send reminder now from the invoice detail page to fire a reminder immediately regardless of schedule.
- Reminder history: every sent reminder is logged with type, recipient email, and timestamp. Visible on the invoice detail page.
The reminder Celery task runs nightly. If an invoice is paid before a scheduled reminder fires, the reminder is skipped automatically.