Skip to main content

Service Pilot (Bookkeeping)

V2 only — invite-only edition. This is part of AI Partner V2 and is not in the open-source V1 you self-host from the Quick Start. V2 is available now, by invite. See V1 vs V2.

The model

You operate AI Partner; your clients are tenants who never see the UI. They email bank-statement CSVs (or message you on WhatsApp/Telegram), the month-end-close workflow categorizes + reconciles + builds the P&L workbook, and the deliverable lands back in their inbox. You review HITL approvals and invoice from per-tenant usage.

v1 is file-based: CSV statements in, Excel out. (QuickBooks/Tally integration and PDF statement parsing are future phases.)

Onboard a client (~10 minutes)

  1. 1
    Create the client's tenant

    Admin Console → Users → generate an invite code and register an account for the client (e.g. acme-stores). They never log in — the account exists for isolation: their statements, books, memory, and costs live in their own workspace.

  2. 2
    Connect your operator Gmail

    Integrations → Gmail (GMAIL_USER, GMAIL_APP_PASSWORD, GMAIL_ACCESS_TOKEN). This mailbox receives client statements and sends back deliverables.

  3. 3
    Create the statement trigger

    POST /api/triggers/email (as the client tenant's user, or set userId):

    {
    "name": "Acme — statements",
    "filter": "from:owner@acmestores.com has:attachment",
    "fetchAttachments": true,
    "mode": "goal",
    "taskTemplate": "A bookkeeping client emailed bank statements. Saved files:\n{{attachments}}\nRun the month-end close for these statements: categorize every transaction, reconcile balances to the cent, build the P&L workbook with formulas, and email it to owner@acmestores.com with the workbook attached. Subject: '{{subject}} — books closed'."
    }

    fetchAttachments: true downloads the CSVs into the tenant workspace (uploads/email/<message_id>/) and substitutes their paths into {{attachments}}.

  4. 4
    Map their messaging handle (optional)

    Admin Console → Users → Client Channels → map their WhatsApp number / Telegram ID to the tenant. Now "what was my biggest expense last month?" from their phone is answered from their books. Unmapped numbers are unaffected.

  5. 5
    Set the approval posture

    Outbound email to clients is governed by the AuthorityPolicy — by default send_* actions are draft-and-ask, so you approve every outgoing deliverable at first (via the in-app prompt or Telegram HITL). Once the pipeline has earned trust, add an AUTHORITY.md rule to auto-approve sends to known client counterparties.

  6. 6
    Dry-run

    Email two sample statement CSVs from the client's address (format below). Watch Admin Console → Overview for the goal; approve the send; confirm the workbook arrives with live SUM/SUMIF formulas and a zero reconciliation difference.

The workflow

The shipped Month-End Close template (Workflows gallery, month-end-close) runs four contract-gated steps:

categorize ──▶ reconcile ──▶ report ──▶ deliver
(bookkeeper) (bookkeeper) (excel- (bookkeeper:
categorized.csv reconciliation.csv builder) gmail_send + attachment)
+ balances.json diff itemized formulas,
csv schema gate to the cent 4 sheets

Each step's output is validated before the next starts (column schemas, freshness, minimum size); a failed reconciliation retries once with feedback. The bookkeeper profile enforces the discipline: no guessed categories (ambiguous → UNCATEGORIZED, listed explicitly), totals must tie to the statement, formulas not pasted numbers.

You can also skip the workflow and just talk to it — the bookkeeper profile auto-selects on keywords like reconcile, bank statement, p&l, or explicitly via @bookkeeper.

Statement CSV format

Any reasonable bank export works; the canonical shape:

date,description,amount,balance
2026-06-01,UPI/ACME SUPPLIES/payment,-12500.00,184300.50
2026-06-02,NEFT CR SALARY REIMB,45000.00,229300.50

Negative amounts = outflows. If the export lacks a balance column, include the statement's opening/closing balances in the email body.

Pricing the service

Each client's exact AI cost is in Admin Console → Usage & Cost (their tenant row). Cost-plus pricing is straightforward: a typical month-end run costs cents in LLM usage and replaces hours of manual work — price the outcome (₹/month per client), not the tokens.

Limits to know

  • CSV statements only in v1 — PDF statements need conversion first (note it in your client instructions).
  • The first sends require your approval (by design) — budget a minute per client per month until you loosen the authority rule.
  • One operator Gmail serves all clients in v1; per-tenant mailboxes work too (store Gmail credentials as that tenant's secrets).