Step 1
Upload receipt
↑ Pick a receipt type to enable photo capture & upload.
Step 2
Review & Classify
Step 2
Field capture
Take the photo above, add the work ticket and branch, and send it. A manager will fill in the rest and submit it.
Expense capture
Step 1
↑ Pick a receipt type to enable photo capture & upload.
Step 2
Step 2
Take the photo above, add the work ticket and branch, and send it. A manager will fill in the rest and submit it.
Management console
Checking connection...
Kill-switches for the whole app (e.g. when out of OpenAI credit).
Loading...
Also used automatically as a fallback when Provider is Ollama and the local request fails (tunnel down, model error, etc.) — set this even if Ollama is your primary provider, so a Spark outage degrades to OpenAI instead of the bare local-heuristic draft.
Ollama requires a local installation with a vision-capable model (e.g. qwen3-vl:8b).
Ollama Cloud does not currently offer vision models and cannot be used for receipt OCR.
In production (Railway), API URL should point at the ngrok tunnel exposing the
local Ollama instance, not localhost — see docs/2026-08-11-local-ocr-spark-handoff.md.
Statement parsing (Chase PDF reconciliation): reuses the API keys above. Leave blank to use the same provider/model as receipts; override if a different model parses statement PDFs better.
Pricing intelligence (cross-vendor matching & insights): reuses the API keys above. Leave blank to use the same provider/model as receipts; override to run a stronger reasoning model (e.g. gpt-5.5) for the matching judgment.
Loading...
-TEST to invoice numbers
Enable when submitting test receipts in production. Visible to all users as a warning banner.
Loads on first lookup; auto-refreshes every 10 minutes.
Receipt categories resolved by name → Aspire CatalogItemID. Cached 10 minutes.
Loading...
Read-only access to company card transactions, used later to spot charges with no receipt. Chase credentials are typed into Plaid's own window and are never seen by this app, and the access token never leaves the server. Nothing here can move money.
Pulls new, changed and removed transactions since the last sync. Automatic sync can be enabled in the card below.
Shows how many cached transactions carry a sub-cardholder identity from Plaid, and whether each one resolves to a known active user's card.
| account_owner value | Count | Resolved to |
|---|
Clears the locally cached transactions and re-syncs the full history from Plaid, using the same connection. Use this once after a card-attribution fix so older transactions pick up the correct employee card. Does not disconnect or re-authorize Chase.
Revokes the connection at Plaid and deletes the stored token and transactions here.
Loading…
Automatic sync runs the same logic as the "Sync now" button, on a schedule. After the first sync, every sync (manual or automatic) asks Plaid to refresh from Chase first, then pulls only what changed — not a full historical re-pull — to stay well within Plaid's free-tier API usage. The reminder digest sends the "missing receipt" email (same as the button in the reconciliation dashboard above) once a day to any cardholder with an unsubmitted charge in the configured date range, skipping pending charges since they can still change before posting.
Days of history Plaid attempts to backfill when FIRST connecting an account. Applies only to a new connection — Plaid does not support extending an already-connected account's history retroactively, so this has no effect on the Chase account already connected above without disconnecting and reconnecting.
The digest never fires before this calendar day, even if Enabled is turned on earlier. Leave blank for no floor. Use this to turn the toggle on ahead of a planned go-live date without an early email going out.
Only charges in this range are included in the digest. A historical resync can otherwise flood the digest with charges from before the app collected receipts.
Off by default: a separated employee's card can keep paying for a subscription after they've left, and there's nobody left to email about it. Turn this on only if reminders should keep going to a deactivated user regardless.
Dry run: shows who WOULD be emailed right now, using the settings above (or an explicit range, below), without sending anything or marking the digest sent.
Coming soon — not yet sending anything. The server verifies and logs a genuine Plaid webhook (scaffold added 2026-08-16) but does not yet trigger a sync or a per-charge alert email; that's future work once daily reminders have been running for a while and Plaid API cost is understood. See docs/PLAID-OPERATIONS.md.
Per the controller spec. Edit only if Aspire branch IDs or inventory locations change.
BranchID for every Fleet receipt. Default: OVER
When a work ticket is validated, the receipt's inventory location is auto-set by branch name.
| Branch name | Inventory location |
|---|
Configure executive review for high-value indirect purchases.
Set when the month closes and how long a receipt can go missing.
Configure Resend for nightly reports and exception alerts.
Receipts
| Date | Vendor | Total | Type | Work ticket | Submitted by | Status | Receipt | QB / Rewards | Approval |
|---|
Follow-up
Receipts you have flagged to ask about. Separate from approval — flagging never holds up or changes a receipt's accounting status. Replies to a question arrive in your own email inbox; record what you hear back as a note here.
Follow-up
Receipts on your branch that the owner has flagged for follow-up. Add a note with anything you know about the purchase — it goes straight onto his notes for this receipt. Separate from approval — a flag never holds up or changes a receipt's accounting status.
Reports
Chase CC Reconciliation
Checking connection…
Ignore a recurring charge for a specific cardholder going forward — e.g. a subscription that will never have a submitted receipt. Matches any part of the charge's description, case-insensitive.
| Cardholder | Card | Pattern | Added by | Note | Actions |
|---|
| Date | Merchant | Amount | Receipt on file (date) | Cardholder | Actions |
|---|
| Date | Merchant | Amount | Cardholder | Resolved by | Note | Actions |
|---|
| Date | Merchant | Amount | Cardholder | Card | Actions |
|---|
| Date | Merchant | Amount | Cardholder | Marked by | Note | Actions |
|---|
| Date | Merchant | Amount | Cardholder | Matched rule | Actions |
|---|
| Date | Merchant | Amount | Receipt / invoice | Cardholder |
|---|
Match Chase Ink transactions to submitted receipts. Accepts a Chase CSV or a QuickBooks Excel (.xlsx) export. Identifies missing receipts by cardholder.
AI reads a Chase combined card statement, then matches every charge to submitted receipts across all cardholders. Uses the date range above.
| CC Date | Merchant | Amount | Receipt on file (date) | Cardholder |
|---|
| CC Date | Merchant | Amount | Cardholder | Card |
|---|
| CC Date | Merchant | Amount | Receipt / invoice | Cardholder |
|---|
Storage
Current and previous month stay on the server and view instantly. Months 2+ older can be downloaded as a single archive and then purged to free space — the image still lives in Aspire.
Superadmin
| Time | Level | Category | Message | Detail |
|---|---|---|---|---|
| No entries yet. | ||||
Superadmin
Tip: Export CSV for the template. Existing users are matched by email and updated; anyone new is created ready to sign in with their Ace Microsoft account.
| Name | Role | Home branch | Approves for | Card last 4 | Submissions | Status | ||
|---|---|---|---|---|---|---|---|---|
| Loading users… | ||||||||