Search vendors, amounts, documents… ⌘K
QBO connected · realm 9130…4471
{{ notifCount }}
Notificationsclear when you visitClear all
{{ n.tag }}
{{ n.title }}
{{ n.sub }}
{{ n.when }}
You’re caught up.
AI Advisor
{{ subTitle }}
Review queue
Upload{{ upActive }}
Filed
Files
Push to QBO
+ New client
Last extraction · 40 s ago
{{ client.ini }}
{{ client.name }}trades as {{ client.trade }}{{ client.prov }} · {{ client.bn }} · {{ client.pst }}
{{ clientMatchCount }}
{{ c.ini }}
{{ c.name }}
{{ c.trade }} · {{ c.prov }} · FY {{ c.fy }}
{{ c.queue }}
No client matches "{{ q }}"
+ Add a client uploads need a client first
Purchases {{ nPurchase }}
Sales {{ nSale }}
Bank {{ nBank }}
Fiscal year {{ client.fy }}
GST year {{ client.gst }}
{{ bulkLabel }}
!
{{ misfiledTitle }}
{{ misfiledWhy }}
{{ misfiledShowLabel }}
Move to {{ streamOtherLabel }}
FILED TO · BY MONTH
candima-inc
All months{{ allMonthsCount }}
{{ y.name }} {{ y.count }}
{{ f.mark }}{{ f.name }}{{ f.count }}
Fiscal folder and GST period come from the client's own year-ends. One document, two paths — both stored.
THIS PERIOD
In queue {{ total }}
Needs review {{ reviewCount }}
Ready {{ readyCount }}
Approved {{ approvedCount }}
Duplicates held {{ dupCount }}
KEYBOARD
J / Kmove Aapprove Eedit field Xflag
{{ folderTitle }}
Actions{{ checkedCount }}
{{ checkedCount }} selected · Space toggles a row
Approve selected
Flag selected for review
{{ moveCheckedLabel }}
Select all visible
Clear selection
Clear all filters ✕{{ fltLabel }} · clear ✕
Archived HIDE Review Ready Approved Duplicate
{{ allMark }}
DATEVENDORCATEGORYSUBTOTALTAX · TIPTOTALTAX CODECONF.STATUS
No period is selected, so nothing is showing.
Click All months to bring everything back, or tick the months you want.
{{ r.mark }}
{{ r.date }}
{{ r.vendor }}
SALES?MATH{{ r.currency }}SELF-ASSESS{{ r.meta }}
{{ r.category }} {{ r.subtotal }}
{{ r.tax }}
{{ r.tipLabel }}
{{ r.total }} {{ r.code }} {{ r.conf }} {{ r.statusLabel }}
Showing {{ shown }} of {{ total }} Duplicates detected on file hash + (vendor, date, total) Fixed column widths · vendor flexes
{{ sel.doc }} UNSAVED {{ sel.statusLabel }}
VENDOR
DATE
CATEGORY
TAX CODE
SUBTOTAL
TAX
TIP
OTHER CHARGES
{{ otherCharges }}
not recoverable
TOTAL
PRINTED TAX
{{ sel.printed }}
ENGINE EXPECTS
{{ sel.expects }}
RECOVERABLE ITC
{{ sel.itc }}
VENDOR TAX №
{{ sel.vtax }}
CLOSES {{ sel.closeMath }} {{ sel.closeLabel }}
⚠ SURFACED{{ sel.note }}
TOTAL FROM DOCUMENT · {{ sel.totalFmt }}
{{ sel.path }}
Rescan
Flag X
Edit E
Cancel
Save
Approve A
click to enlarge Zoom on hover
Drop receipts, invoices or statements for {{ client.name }}
Click to browse your computer · PDF · JPG · PNG · HEIC · CSV · OFX · XLSX
Browse files…
ATTACHMENTS · {{ stagedCount }}{{ stagedSize }}Clear all
{{ s.name }}{{ s.size }}
Process {{ stagedCount }} files
Files are hashed, deduplicated and sent to extraction. Nothing leaves this client's folder.
No attachments yet. Load a demo batch to see the pipeline run.
This batch{{ batchStatus }}
{{ upDone }}/{{ upTotal }}
uploaded
{{ exDone }}/{{ upTotal }}
AI extracted
{{ filedDone }}/{{ upTotal }}
filed & in table
Upload{{ upPct }}
AI extraction{{ exPct }}
Filed to folders + table{{ filedPct }}
{{ dupNote }}
Files in this batch one row per file · no page spinner Dedupe on file hash and (vendor, date, total)
FILESIZEPROGRESSSTAGEAI FOUNDFILED TOIMPORTED
{{ f.name }}
{{ f.src }}
{{ f.size }}
{{ f.pct }}
{{ f.stageLabel }} {{ f.found }} {{ f.filedTo }}{{ f.imported }}
Filed documents appear in the review queue sorted by confidence Open the full table →
FOLDERS · drop to move
{{ f.name }} {{ f.count }}
Moving a file never changes its bytes or checksum. The move is logged and the filing path is rewritten.
/clients/candima-inc/{{ fsPathNice }} {{ fsCount }} files Drag a file onto a folder on the left
FILEDATETOTALSHA-256STATUS
{{ f.name }}
{{ f.vendor }} MOVED
{{ f.date }} {{ f.total }} {{ f.sha }} {{ f.statusLabel }}
This folder is empty. Drop a file here from another folder.
Originals are immutable · a new version is a new file + version row {{ fsLast }}
All documents · CANDIMA INC. {{ allCount }} documents · every period
FY2027 All statuses Export CSV
DATEVENDORCATEGORYSUBTOTALTAXTOTALTAX CODEFY / GST PERIODCONF.STATUS
{{ r.date }}
{{ r.vendor }}
doc {{ r.id }}
{{ r.category }} {{ r.subtotal }} {{ r.tax }} {{ r.total }} {{ r.code }} {{ r.period }} {{ r.conf }} {{ r.statusLabel }}
Click a row to open it in the review queue Period = client year-ends (FY Jun–May · GST Dec 31), never the calendar
Clients {{ clientCount }} active
+ New client
LEGAL · TRADE NAMEJUR.GST/HST №FISCAL YRGST YEAR · FREQ.QUICKBOOKSQUEUE
{{ c.ini }}
{{ c.name }}
{{ c.trade }}
{{ c.prov }} {{ c.bn }} {{ c.fy }} {{ c.gst }} {{ c.qboLabel }} {{ c.queue }}
Uploads are refused until a client exists — there is no "unassigned" bucket.
New clientuploads need a client firstCancel
NAMES
LEGAL NAME
TRADE / OPERATING NAMES
Receipts often show the trade name. The matcher needs both.
JURISDICTION & TAX NUMBERS
PROV.
GST/HST NUMBER
PST
Registered
YesNo
Charges PST
YesNo
YEAR-ENDS — STORED SEPARATELY
FISCAL YEAR
{{ ncFyLabel }}
{{ o.label }}
GST YEAR END
{{ ncGstLabel }}
{{ o.label }}
GST FILING
MonthlyQuarterlyAnnual
TAX TRACKING STARTS
Fiscal and GST years are often different. Documents are filed by both.
QUICKBOOKS · optional now, required before push
REALM ID
{{ ncSlugLine }}
Create client
{{ client.ini }}
{{ client.name }}
{{ cfHint }}
UNSAVED
LEGAL NAME
TRADE / OPERATING NAMES
PROV.
GST/HST NUMBER
PST
Registered
YesNo
Charges PST
YesNo
FISCAL YEAR
{{ cfFyLabel }}
{{ o.label }}
GST YEAR END
{{ cfGstLabel }}
{{ o.label }}
GST FILING
MonthlyQuarterlyAnnual
TAX TRACKING FROM
ASSIGNED
{{ m.ini }}
{{ m.name }}{{ m.role }}
{{ cfNote }}
Discard
Save changes
Tax codes · {{ client.name }} recoverability is per component
+ Add code
CODECOMPONENTS · RATE · RECOVERABLEAPPLIES TOEFFECTIVEDEFAULT FOR
{{ t.code }}
{{ p.txt }}
{{ t.applies }} {{ t.eff }} {{ t.def }}
Categories · chart of accounts pulled from QuickBooks · names match exactly Engine applies the default; the human can override.
CATEGORYQBO ACCTDEFAULT TAX CODERECOVERABLERULE
{{ c.name }} {{ c.acct }} {{ c.code }} {{ c.rec }} {{ c.rule }}
CONNECTION
Connected
realm 9130…4471 · token renews in 41 min
SALES TAX IN QBO
Enabled
Read back from TaxPrefs — cannot be switched on via API
LAST READ
2 min ago
61 accounts · 9 tax codes · year-ends match client
SNAPSHOT
snap_0917-1402.json
pre-state of every field to be touched · the only rollback
Dry run · {{ pushCount }} approved documents → Purchases (unapproved) diff printed before any write
Re-read state
{{ pushLabel }}
DOCVENDOR → QBOACCOUNTNETTAXTOTALFINGERPRINTRESULT
{{ p.id }}
{{ p.vendor }}
{{ p.entity }}
{{ p.account }} {{ p.net }} {{ p.tax }} {{ p.total }} {{ p.fp }} {{ p.stLabel }}
Every line: net + tax = document total, asserted before the writeA 200 is not a write — each value is read back
⚠ CREATE-ONLYTaxAgency, TaxRate and TaxCode cannot be renamed, deleted or deactivated through the API. This portal never creates them — it maps to the 9 codes already in the company.
MAILBOX
{{ m.name }}{{ m.count }}
CONTACTS
{{ c.ini }}
{{ c.name }}
{{ c.role }}
Attachments are routed to intake automatically and appear in Upload.
{{ m.ini }}
{{ m.from }}{{ m.when }}
{{ m.subject }}
{{ m.preview }}
📎 {{ a }}
No mail matches.
{{ mail.subject }}
{{ mail.ini }}
{{ mail.from }} <{{ mail.addr }}>
to {{ mail.to }} · {{ mail.date }}
{{ client.name }}
{{ mail.body }}
ATTACHMENTS · routed to intake
📎 {{ a }}filed
Reply
Forward
Open related documents →
MONTHS · BY YEAR
{{ g.mark }}
{{ g.name }}
{{ g.sub }}
{{ g.stLabel }}
{{ m.mark }}
{{ m.name }} {{ m.count }}
Tick months to combine them in one export. Tick a year to take all of it.
{{ exTitle }} {{ exLayout }}
Purchases {{ exNP }}
Sales {{ exNS }}
Bank {{ exNB }}
{{ exNote }}
Export CSV
{{ pushLabelEx }}
DATE{{ xh2 }}{{ xh3 }}TAX CODE{{ xh5 }}{{ xh6 }}{{ xh7 }}{{ xh8 }}{{ xh9 }}
{{ r.date }}
{{ r.vendor }}
{{ r.ref }} · {{ r.memo }}
{{ r.payShort }} {{ r.code }} {{ r.account }}{{ r.lastCol }}
Nothing approved in the selected months yet — tick a month on the left.
TOTALS{{ exCount }} lines · {{ exItcLabel }} {{ exItc }}{{ exMathNote }} {{ exNet }}{{ exTax }}{{ exTotal }}
SETTINGS
Workspace
Users & roles
Intake & extraction
AI rules{{ ruleCount }}
Storage & retention
Integrations
Security
AI · key & spendADMIN
Changes are logged to the audit trail with the previous value.
{{ stTitle }} {{ stNote }}
Save
FIRM NAME
INTAKE DOMAIN
DEFAULT CURRENCY
TIMEZONE
Dark theme
Applies to this workspace for you
Keyboard-first review
J/K move · A approve · E edit · X flag · Space select
Sort review queue by confidence
Doubtful documents first, every time the queue opens
{{ userCount }} users · roles decide what a person can approve and push
+ Invite user
USERROLECLIENTSACTIVE
{{ u.ini }}
{{ u.name }}
{{ u.email }}
{{ u.role }} {{ u.clients }} {{ u.last }} Edit
PERMISSIONOWNERACCOUNTANTBOOKKEEPERREAD-ONLY
{{ p.name }}{{ p.o }}{{ p.a }}{{ p.b }}{{ p.r }}
BULK-APPROVE THRESHOLD
ARITHMETIC TOLERANCE
ACCEPTED FILE TYPES
EXTRACTION MODEL
Refuse uploads without a client
No unassigned bucket
Deduplicate on file hash and (vendor, date, total)
Second copies are held, never booked twice
Never infer a tax that is not printed
Extractor reports the paper; the engine decides what should apply
Surface engine disagreements, never auto-correct
Disagreements become review items
Re-runs never overwrite human-verified fields
Edited values are pinned
FILING PATH PATTERN
RETENTION
STORAGE BUCKET
BACKUP DESTINATION
Originals immutable
New version = new file + version row
Store checksum on upload
Proves what was filed is what was uploaded
Soft delete only
Deletion is reversible and logged
⚠ SERVED PATHBackups, exports and archives are never written inside the web-served directory. Nothing is served from the upload path.
{{ i.ini }}
{{ i.name }}
{{ i.sub }}
{{ i.stLabel }} {{ i.action }}
Plain-language rules the extractor and tax engine must follow. Each rule is checked on every document and every action; conflicts are surfaced, never auto-resolved.
{{ g.name }}{{ g.count }}
+ Add
{{ r.kind }}{{ r.meta }}
Require two-factor authentication
All users, all roles
Client isolation at the query layer
One bookkeeper never sees another client’s receipts
QuickBooks tokens encrypted at rest
Per client · never shipped to the browser
Immutable audit log
Every upload, extraction, edit, approval and push
SESSION TIMEOUT
ALLOWED SIGN-IN DOMAINS
Audit log · {{ client.name }} append-only · {{ auditCount }} events
All actors All events Export
WHENWHOEVENTDOCUMENTDETAIL · OLD → NEW
{{ a.when }}
{{ a.ini }}
{{ a.who }}
{{ a.event }}
{{ a.doc }}
{{ a.docId }}
{{ a.detail }}
Who uploaded · what the AI returned · every human edit · who approved · what was pushed · what QBO returned. Nothing here is editable.
Originals immutable · checksum stored · retained ≥ 7 years Every write asserts net + tax = total (±$0.01)
{{ lbPos }}
{{ sel.vendor }}
{{ sel.date }} · {{ sel.doc }} · original, immutable
{{ sel.statusLabel }}{{ sel.closeLabel }}
{{ r.k }}{{ r.v }}
{{ sel.note }}
Editing · {{ sel.doc }}
VENDOR
DATE
CATEGORY
TAX CODE
SUBTOTAL
TAX
TIP
TOTAL (from document)
Approve & close A
Edit E
Flag X
Open in new window ↗
Close esc
Save
Cancel