Core Module

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:

Draft

Being prepared. Editable. Can be deleted. Not sent to client.

Actions: Edit, Send, Delete

Sent

Sent to client. No longer editable.

Actions: Mark Paid, Download PDF

Viewed

Client opened the invoice via the Client Portal.

Actions: Mark Paid, Download PDF

Paid

Payment received. Time entries marked as invoiced.

Actions: Download PDF only

Overdue

Due date passed, not paid. Automatically detected.

Actions: Mark Paid, Download PDF

Cancelled

Voided. Cannot be deleted or reinstated.

Actions: Download PDF only

State machine flow

DraftSentViewedPaidor directly Draft → Paid for in-person payments

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)

1

Open the project → Finance tab

You'll see unbilled hours and a Generate Invoice button.

2

Click Generate Invoice

ACOS pulls all billable, un-invoiced time entries for this project and groups them into line items.

3

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.

4

Set bill-to and dates

The contact is pre-filled from the project. Set the invoice issue date and due date (payment terms).

5

Save as Draft

Review the invoice one more time. Download the PDF preview if needed.

6

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:

FieldNotes
DescriptionWhat was delivered. Pulled from the task description or time entry description when auto-generated.
QuantityHours for time-based items. Units for flat items.
Unit PriceBilling rate per hour (or per unit for flat items).
TotalQuantity × 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:

1

Open the invoice detail page

Find the invoice in Finance → Invoices or from the project's Finance tab.

2

Click Mark Paid

A confirmation dialog appears. Confirm the payment.

3

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.

1

Open the invoice → click Record Payment

The dialog shows the full outstanding balance. Change the amount to the partial payment received.

2

Save

The invoice status becomes Partially Paid. The outstanding balance is shown on the invoice detail.

3

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 cardDefinition
BudgetThe project budget set at creation (from deal value on conversion, or manually set)
RevenueTotal billed_amount across all billable time entries on this project
CostTime cost (hours × rate) plus all hard expenses logged against this project
Gross ProfitRevenue − 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

1

Open the project Finance tab

Navigate to the project and click the Finance tab.

2

Click Add Expense

Scroll to the Expenses section at the bottom and click Add Expense.

3

Fill in the details

Enter a title, amount, currency (USD / EUR / PKR), category, and date.

4

Set billable status

Toggle Billable on if this cost will be passed through to the client invoice.

5

Attach a receipt (optional)

Paste a receipt URL for documentation and audit trail.

6

Save

Click Save — the expense appears immediately and the project cost and margin recalculate.

Expense categories

CategoryTypical use
SoftwareSaaS tools, licences, API credits bought for this project
ContractorFreelancer fees, subcontractor invoices
TravelFlights, hotels, client-site visits
HardwareEquipment purchased for a specific deliverable
MarketingAd spend, promoted posts run on behalf of the client
OtherAnything 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

ActionMemberManagerAdminOwner
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.

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.

TriggerWhen it firesSent to
3 days before dueDue date minus 3 daysInvoice contact email
Due todayThe due date itselfInvoice contact email
7 days overdueDue date plus 7 daysInvoice contact email
14 days overdueDue date plus 14 daysInvoice contact email
21 days overdueDue date plus 21 daysInvoice 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.