Module

Finance

Native invoicing, quoting, expense tracking, and a real double-entry general ledger — built into Genosyn so AI Employees can read and write the same books a human accountant uses. Find it in the sidebar under Finance.

What ships

  • Estimates — quotations issued to customers before a sale. Convert any accepted estimate into an invoice in one click.
  • Invoices — billable documents with line items, tax snapshots, payments, and email / print-to-PDF rendering.
  • Recurring invoices — invoice templates that fire on a repeating schedule (monthly retainers, annual licences). Each run materializes a fresh invoice into the regular invoice list.
  • Bills — the AP mirror of invoices, for what your company owes vendors.
  • Vendors — the counterparties you purchase from, each with billing details, a tax ID, and a default currency. (Customers now live in their own Customers section.)
  • Catalog — reusable Products and Tax rates, snapshotted onto every line so editing a product never rewrites historical documents.
  • Ledger — chart of accounts, journal entries, trial balance, P&L / balance sheet / cash flow reports, bank-feed reconciliation, and accounting periods.

Estimates (quotations)

Estimates are pre-sale documents — proposed line items with prices, sent to a customer for sign-off. They do not affect the general ledger; only the invoice that an estimate converts into does.

Lifecycle

  1. Draft — fully editable. Click New estimate, pick a customer, add line items, save. The slug looks like edraft-xxxxxx until issue.
  2. Sent — clicking Issue (or Issue & send to email the customer) mints a gapless number prefixed with the customer's slug — e.g. ACME-CORP-EST-0001 — and locks the line items, so two customers' first estimates never both read EST-0001. The URL slug becomes the lowercased number.
  3. Accepted / Declined — record the customer's response from the detail page. Accepted estimates can be converted to invoices.
  4. Invoiced — once converted, the estimate keeps a link to the resulting invoice. The status badge flips to invoiced; the estimate becomes read-only.
  5. Expired — a synthetic status shown when validUntil has passed and the estimate is still in sent. Re-issue or void to clear it.
  6. Void — terminal cancellation, available on any non-draft estimate.

Convert to an invoice

From an accepted (or still-sent) estimate, click Convert to invoice. Genosyn copies every line verbatim, inherits the customer and currency, creates a draft invoice, and immediately issues it — which mints the next invoice number and posts the journal entry (DR Accounts Receivable / CR Revenue + Tax Payable) into the ledger. The original estimate stays in the system with its invoiceId set, so you can always trace which quote produced which sale.

Duplicate

Click Duplicate on any estimate (from the row menu or the detail page) to fork it into a fresh draft. The customer, currency, line items, notes, and footer are copied verbatim; issueDate resets to today and validUntil to thirty days out. The new draft has no number until you issue it, and the original is untouched — handy for re-quoting an expired estimate or sending the same package to a different customer (open the duplicate, switch the customer in edit mode, and issue).

Sending and printing

Every issued estimate has a Print / PDF view at /api/companies/:cid/estimates/:slug/html. Use it from the detail page's Print / PDF button —File → Save as PDF in your browser produces a clean A4 PDF with no app chrome. The same HTML is what the customer sees when you click Issue & send or Resend email, and that email now carries a PDF copy of the estimate as an attachment — delivered through whichever EmailProvider the company has configured.

Customers

Customers — the billable accounts you invoice — now live in their own top-level Customers section, alongside the people at each account and the signed contracts you hold with them. One detail stays relevant here: each customer's slug (auto-derived from its name, e.g. Acme Corpacme-corp) is uppercased and prefixed onto every invoice and estimate number issued to that customer, so numbers stay unique and self-identify across accounts.

Invoices

The invoice flow mirrors estimates with two extras: a dueDate and a payments ledger. Issuing mints the same slug-prefixed gapless number estimates use — e.g. ACME-CORP-INV-0001. Record cash, bank transfers, Stripe charges, or other receipts directly on the invoice; each payment posts a matching DR Bank / CR Accounts Receivable entry. Once the cumulative paid amount reaches the invoice total, the status flips from sent to paid. Sending or resending an invoice emails the customer the rendered document. To copy an internal finance mailbox on every delivery, open Finance → Settings and add one or more addresses under Always Cc on invoices. The saved addresses are added to manual sends, recurring auto-sends, and resends automatically. Before a resend, Genosyn shows the exact From and Reply-to addresses in a confirmation modal. Edit the To field to add or remove recipients, see the company's always-Cc recipients, add optional additional Cc recipients, include a one-off message, and choose whether to attach the invoice PDF. Separate multiple addresses with commas. Every resend attempt then appears on the invoice's Activity feed with its delivery status, To and Cc recipients, and attachment result.

Duplicate works the same way as on estimates — from the row menu or the detail page, you can fork any invoice (even one that's already paid or void) into a fresh draft. Lines, customer, currency, notes, and footer come along; payments and status timestamps do not. The new draft picks up today as its issue date and a fourteen-day default due date, and stays unnumbered until you issue it.

Voiding an invoice

Void means this invoice should never have been issued. It posts a reversing entry that unwinds the original DR Accounts Receivable / CR Revenue + Tax Payable, keeping both the original and the reversal in the journal so the audit trail stays intact.

Two things it deliberately will not do. Voiding an invoice that already has payments recorded against it is refused — money that genuinely arrived is given back with a refund or a credit note, never by rewriting history. And voiding an invoice issued inside a closed accounting period is refused too, because the reversal carries today's date and would pull a closed period's revenue into the current one; reopen the period first. Both rules apply identically to Void on a bill.

Writing off a balance

When a receivable won't be collected, open the invoice and click Write off. A write-off clears part or all of the open balance without a payment and without reversing the sale — the revenue stays recognized in the period it was earned. Pick Bad debt for an uncollectible debt or Residual for an immaterial short-payment (a few cents of rounding or a settlement discount). It posts DR Bad Debt Expense / CR Accounts Receivable and can never exceed the open balance. Unlike a credit note it does not relieve tax — a bad debt isn't a sales-tax refund.

A fully written-off invoice shows the Written off status (it never counts as cash collected). Write-offs appear under Adjustments on the invoice and as a balance adjustment on the customer's statement. Made a mistake, or the customer paid after all? Reverse the write-off — it puts the balance back and posts the matching reversing entry, which is also how you record a bad-debt recovery.

Credit notes

A credit note reduces a sale you've already invoiced — a return, a goodwill adjustment, a billing correction. From an invoice, click Credit note: credit it in full (every line, tax included) or a partial ex-tax amount. Issuing posts DR Sales Returns & Allowances / DR Tax Payable / CR Customer Credits — it reverses revenue (and tax, on a full credit) but never touches Accounts Receivable directly, and credit notes can never total more than the invoice they came from.

A credit is spent by applying it to an invoice, which is the only way to lower a receivable without cash: it posts DR Customer Credits / CR Accounts Receivable, capped so the invoice balance can never go negative. Raising a credit against an invoice applies it there by default; an on-account credit can be applied to any of that customer's invoices in the same currency from the Credit notes section. An invoice fully cleared by credit shows the Credited status. Unapply to put the balance back, and void an unused credit memo to reverse it entirely.

Refunds, deposits and overpayments

A credit can be paid back in cash instead of applied: from a credit note, click Refund. It posts DR Customer Credits / CR Bank against the credit's open balance, and can be reversed if the money comes back. A deposit takes money before any invoice exists — DR Bank / CR Customer Deposits, held as unearned revenue (no sales tax on receipt) until you apply it to the eventual invoice.

When a customer pays more than an invoice's balance, tick Record the excess as an on-account customer credit in the payment dialog: the balance-due portion posts as a normal payment and the overage becomes a credit (DR Bank / CR Customer Credits) you can apply to their next invoice or refund. Without that tick, overpayment is refused, exactly as before.

Recurring invoices

Open Finance → Recurring and click New schedule to set up a template. Pick a customer, choose how often it should bill — every N days, weeks, months, quarters or years, on the day and at the time you set — and compose the line items just like a normal invoice. The count lets you say every 2 weeks or every 3 months, not just every one. A plain-English summary (for example Every 2 weeks on Monday at 9:00 AM) appears beneath the picker so you can confirm the cadence before saving.

Draft vs auto-send

Each schedule has an Auto-issue and email toggle. Off (the default), every tick lands as a fresh draft — you review and click Send on each one. On, the tick issues the invoice (minting its invoice number and posting the AR / Revenue ledger entry) and emails it to the customer through the company's configured EmailProvider — same path a human-sent invoice takes, so the email log captures it identically.

Pausing, ending, running now

From the detail page, Run now generates an invoice immediately without consuming the scheduled slot, useful for catch-up runs or testing the template. The More actions menu holds the lifecycle controls: Pause stops scheduled runs without losing the template and Resume restarts the next tick from now; End is terminal — the schedule becomes read-only but every invoice it already created stays in your books; Duplicate clones the template into a new, paused schedule so you can tweak and resume it without touching the original. Optional caps — max runs and end date — flip the status to ended automatically once hit.

Bank reconciliation

Open Finance → Reconciliation to match external bank lines to the payments and journal entries already recorded in Genosyn. CSV upload works with any bank; Stripe payout and Brex Cash feeds can pull directly from an encrypted Connection under Settings → Integrations.

Expand a line and Genosyn suggests two kinds of match, ranked by amount and date: recorded invoice payments (the money-in side), and any posted journal entry that already touches this feed's bank account — a bill payment, a card settlement, a refund, or a manual entry. That second kind covers the whole money-out side that payment matching alone used to miss. Entries already matched to another line, and the categorization entries described below, are never offered twice.

A bank line that isn't a recorded payment — bank interest, a fee, an owner transfer, a cash sale — can be categorized straight into the books. Expand the line and pick a category account under Or post it straight to a category: Genosyn posts a balanced journal entry (money in debits the bank account and credits the category; money out reverses) and marks the line reconciled. Unmatching a categorized line reverses that entry, so the books always follow what you see on the feed. (Bank categorization is home-currency in this release.)

For Brex, create a Brex Connection using a read-only user token, then click New feed, choose Brex Cash, select the Connection and Cash account, and map it to the corresponding asset account in the chart of accounts. Sync walks the settled transaction history on the first pull and fetches only recent changes after that. Repeated syncs are safe because Genosyn deduplicates rows by Brex transaction id.

Vendor credits

The AP mirror of credit notes. When a supplier credits you — a return, a billing correction — open the bill and click Vendor credit. Issuing posts DR Vendor Credits / CR the expense account(s) / CR Tax Payable, reversing the bill's expense and input tax and parking the value in 1300 Vendor Credits (an asset — the supplier owes you). Apply it to a bill to reduce what you owe (DR Accounts Payable / CR Vendor Credits, capped so AP can't go negative), or record a Refund when the supplier pays you back in cash (DR Bank / CR Vendor Credits). Manage them under Vendor credits; unapply, void and reverse work exactly like the customer side.

Corporate card expenses

Open Finance → Card expenses to connect the primary Brex corporate card account. Choose the 2300 Corporate Card Payable liability, a default expense category, and the bank asset used to pay the statement. The Brex user token needs transactions.card.readonly.

Sync imports the complete settled card history and posts balanced entries automatically: purchases debit the expense category and credit the card liability; refunds reverse those legs; statement payments debit the liability and credit the selected bank account. Changing a purchase category writes a separate reclassification entry, preserving the audit trail. Failed postings remain visible with a retry action.

Ledger and reports

Every state change on an invoice or bill emits a journal entry into the same ledger you can write to by hand from Finance → Journal. The chart of accounts seeds sensible defaults on first visit (1100 Bank, 1200 Accounts Receivable, 2100 Tax Payable, 2300 Corporate Card Payable, 4000 Sales Revenue, 4910 FX Gain, 6900 FX Loss), but you can rename, reparent, or add accounts freely as long as you don't touch the system codes the auto-posting depends on. From there, the Trial balance and Reports pages produce the standard accountant outputs (P&L, balance sheet, cash flow) with optional period comparisons. Each report opens with a monthly graph built from the same ledger calculation as the table beneath it: revenue, expenses, and net income for P&L; assets, liabilities, and equity for the balance sheet; and operating, net, and closing cash for cash flow. Custom periods longer than two years graph the most recent 24 months so the axis stays readable.

Proposals (maker-checker)

A journal entry can be staged for review instead of posted straight away — the classic accounting maker-checker control, where one person drafts an entry and another signs it off. Compose the entry as usual under Finance → Journal → New manual entry, then click Propose for review rather than Post entry. Nothing hits the ledger yet.

Staged entries collect under Finance → Proposals. Expand one to see its full debits and credits, then Apply to post it — it becomes an ordinary manual journal entry, tagged as one that went through review — or Reject it with an optional note back to the proposer. Applying re-checks everything a direct posting would (balance, live accounts, an open period), so a proposal staged before a period closed fails cleanly rather than back-dating into frozen numbers; the reason is shown on the row and the proposal stays pending so it can be fixed and retried.

This is also the spine that AI employees post finance work through: an AI can propose an entry, but only a person applies it, so no automation ever moves the books unattended. Every apply and reject is recorded in the audit log with who decided and when.

Review and approve transactions

Open Finance → Transactions. Every posted journal entry — whether it came from an invoice, bill, card purchase, or a manual posting — starts under Needs review. Open a row to inspect its complete debits and credits. Expense and revenue lines have an account-category picker; control accounts such as Bank, Accounts Receivable, and Card Payable stay visible but cannot be casually recategorized. Owners and admins click Approve transactionfor final sign-off.

Category corrections are append-only. Approval writes a balanced reclassification entry and preserves the original posting, so the Journal and audit log show both sides of the decision. Nothing edits a posted ledger line in place.

When several transactions call for the same decision, tick the checkbox on each row (or the header checkbox to take the whole list) and a selection bar appears with bulk Approve, Return, Change category, and Delete. Change category moves each transaction's single expense or revenue line to one category and approves it in the same step. Bulk delete only removes unapproved manual drafts. Every action runs per-transaction: rows that don't qualify — already approved, auto-posted, or the wrong shape for a shared category — are skipped and reported back, never silently changed. Approve, Return, and Change category stay limited to owners and admins.

Who can see and change finances

Finance access is a per-member setting, separate from a member's company role. Owners and admins always have full finance access; for everyone else, an owner or admin sets a level under Settings → Members:

  • Full — the historical behaviour and the default: post, edit, send, and reconcile without restriction.
  • Read-only — view every finance page but change nothing. Any attempt to post, edit, or send is refused by the server, not just hidden.
  • None — the finance section is closed to them entirely.

Existing members are Full after the upgrade, so nothing changes until an owner dials someone down. The check is enforced on the server for every finance route — a read-only member is blocked from mutations even if they reach the API directly — and each change to a member's level is written to the audit log.

Give AI employees finance access

By default an AI employee cannot touch Finance at all. Open Finance → AI access (owners and admins only) to grant an employee access at one of three escalating levels:

  • Read only — list and open invoices and customers, and read the P&L, balance sheet, cash flow, trial balance, chart of accounts, and posted transactions. Changes nothing.
  • Invoicing — everything in Read, plus the full accounts-receivable loop: create, issue, email, and void invoices; create and update customers; and record payments to mark an invoice paid. Issuing an invoice mints its number and posts it to the ledger; sending emails it to the customer on file.
  • Full accounting — everything in Invoicing, plus staging ledger re-categorizations for a human to approve (below). Final approval always stays with a human.

Access is per employee and takes effect immediately — grant it, change the level, or revoke it from Finance → AI access. Every write an AI employee makes lands in the audit log (marked as an AI actor) and on the employee's journal, exactly like the human finance routes. Members still reach Finance through the app as usual; grants govern the AI surface only.

The finance tool family

Granted employees get a built-in finance tool. Its read ops (list_invoices, get_invoice, list_customers, get_customer, plus the accounts / transactions / report ops) need Read. The invoice lifecycle — create_invoice, send_invoice, record_payment, void_invoice, create_customer, and update_customer — needs Invoicing. Amounts are integer minor units (cents), so 5000 is $50.00. An employee with no grant gets no finance tool at all.

When an AI employee sends an invoice, any To / Cc it supplies is restricted to the customer's own email domain or a finance mailbox you saved under Finance → Settings → Always Cc — an AI can't mail company documents to an arbitrary outside address, even if a malicious invoice memo or bank description tries to talk it into doing so. A person sending from the invoice page is unaffected and can still address anyone.

Emailing an invoice PDF

An employee that also has an Email grant can attach an invoice's PDF straight to a message — no need to dig the file out of a past email. The create_mail_draft and send_mail tools (and the Gmail integration's gmail_create_draft / gmail_send_message) take an attachments list; name an invoice by invoiceSlug and Genosyn renders the PDF on the fly and attaches it. So a routine can reply on the original billing thread — preserving the recipient and CCs — with the invoice attached. Rendering the PDF needs at least Read finance access; sending needs the matching mailbox grant.

AI transaction review

At the Full accounting level an employee can also inspect posted transactions and semi-approve one with a concise review note and optional category proposals. The proposal does not change the ledger. It moves the transaction to AI reviewed and notifies company owners/admins, who accept the proposal, change it, or return the transaction for another look. AI employees cannot issue final approval.