Pillar Optimization Partners
Strategic Finance & Automation
{{ it.num }} {{ it.label }}
How this is built
Ross Armstrong
Ross Armstrong
Managing Member
Book a call
DEMO ENVIRONMENT · SYNTHETIC DATA
Talk with Ross
Pillar CFO Suite

Six companies. One screen. Every exception surfaced before you open a single spreadsheet.

{{ excAcross }} open exceptions across six entities — counted per entity, never combined. Each card below is an independent set of books, refreshed on its own schedule.

{{ e.n }}
{{ e.pill }}
{{ e.ind }}
Cash
{{ e.cash }}
A/R over 60
{{ e.ar60 }}
Exceptions
{{ e.exc }}
{{ e.note }}

Five workflows. One discipline.

Deterministic rules first, a reasoning pass second — and when the reasoning layer fails validation, the document routes to a human instead of a guess. Every run writes an audit row.

WORKFLOW {{ w.num }}
{{ w.title }}
{{ w.sub }}
Open the workflow →
Ross Armstrong
If this is useful, let’s talk about your situation.
No pitch, no obligation. Thirty minutes with Ross Armstrong — bring one process that eats your week and we’ll walk through how it would run here. ross.armstrong@pop4success.com
Book a working session
Workflow 01

Invoice Audit & Compliance Engine

Every vendor and subcontractor invoice checked against the actual contract terms before anyone approves it.

{{ aChip1 }}
{{ aChip2 }}
{{ aChip3 }}
Input — pick an invoice
{{ p.id }} {{ p.amt }}
{{ p.vendor }}
{{ p.meta }}
Rules drawer — {{ rulesOnCount }} of 6 active {{ rulesChevron }}
Toggle a check off and the run recomputes. The findings are produced by the rules, not by a recording.
Try it with your own invoice
Access on request — documents are processed for your session only, never persisted, never used for training. Request access
Trace — what actually ran
{{ s.title }} {{ s.tag }}
{{ s.meta }}
{{ s.detail }}
Each stage is expandable — click to see the rule that fired and the values it compared.
Outcome — routed result
{{ verdictCode }}
{{ verdictLabel }}
{{ verdictSub }}
{{ f.sev }} {{ f.clause }}
{{ f.title }}
{{ f.note }}
Expected
{{ f.exp }}
Observed
{{ f.obs }}
Delta
{{ f.delta }}
All six checks passed against contract terms. Nothing for a human to look at — which is the point.
Audit trail immutable · every decision writes a row
{{ t.line }}
Workflow 02

AP Match & Approve

Invoices matched against what your accounting system says was actually received — designed to post the approval back once you click it.

{{ pChip1 }}
{{ pChip2 }}
{{ pChip3 }}
Live thresholds — the rules recompute as you move them
Set the tolerance to $10.00 and watch three more invoices flip to exception. The queue is computed by the same function every time — not a recording.
RefVendorInvoiceVarianceStatus
{{ r.id }} {{ r.v }} {{ r.amt }} {{ r.varr }} {{ r.status }}
{{ apSelVendor }}
{{ apSelId }}
{{ apSelMeta }}
{{ x.badge }} {{ x.name }} {{ x.val }} · {{ x.th }}
Intercompany invoice — this one bypasses the AP queue and routes directly to the CFO for approval.
The approval — as your approver sees it
From: approvals@pillar · To: you · Subject: Approval needed — {{ apSelId }} {{ apSelVendor }}
Pillar Pillar · AP Approval
An invoice from {{ apSelVendor }} for {{ apSelAmt }} matched receiving within your rules. Approve to release it for payment in your accounting system.
{{ apEmailMono }}
{{ apDecided }}
Your approver never learns a new system. They click a button in an email they already trust — and the decision writes an audit row either way.
Workflow 03

Multi-Entity Close Monitor

Built for someone who is CFO of six companies at once. Every figure below derives from standard accounting-system reports — onboarding requires no new data entry from the client.

{{ c.n }}
{{ c.state }}
{{ c.out }}
{{ t.n }}
DATA UNAVAILABLE
Stonebridge Equipment Rental
Bank feed authorization expired. Last good pull: Aug 3, 6:00 a.m. CT. Nothing below is shown from that stale pull — a wrong number presented as current is worse than an honest gap.
One entity’s connection failing never blocks the other five, and never silently reports stale numbers as current. Every fractional CFO has been handed a report that was quietly three days old. This one refuses to be.
Revenue MTD
{{ eRev }}
Cash
{{ eCash }}
Open A/R
{{ eAr }}
Open A/P
{{ eAp }}
A/R aging
{{ a.label }}
{{ a.amt }}
{{ agingNote }}
Top customers
{{ c.n }}{{ c.amt }}
Top vendors
{{ c.n }}{{ c.amt }}
What changed since yesterday
{{ d.label }} {{ d.val }}
The actual daily question — answered per entity, never blended.
Bank balances
{{ b.n }}{{ b.amt }}
Morning digest — 6:00 a.m. CT preview {{ digestChevron }}
From: digest@pillar · Daily 6:00 a.m. Central · Subject: Portfolio digest — Aug 5
Pillar Pillar · Morning Digest
{{ d.n }} {{ d.state }}
{{ d.line }}
Six sections, six independent data pulls. A failure in one section names itself and never touches the other five.
Workflow 04

Financial Command Center

The four dashboards an owner actually opens — built entirely off standard accounting reports for one synthetic entity, Harbor Point Manufacturing.

{{ t.n }}
{{ k.label }}
{{ k.val }}
{{ k.sub }}
Sales & gross profit — six months Sales   Gross profit
{{ m }}
Top-five vendor spend — July
{{ v.n }}{{ v.amt }}
Cash-runway scenario
runway to {{ runwayDate }}
Collection days{{ collectDays }} days
Deterministic math, computed live, no AI. Assumes revenue flat at July, expenses at the 3-month average, debt service, owner distributions, and committed expansion capex continuing, and a one-time working-capital shift of (days − 45) × daily sales.
projected cash, next 24 months · baseline crosses zero at {{ runwayDate }}
Top customers — trailing 6 months
{{ c.n }}{{ c.amt }}
Bottom five — watchlist
{{ c.n }}{{ c.amt }}
New customers
3
last 30 days
7
last 90 days
Sales by product — July
{{ p.n }}{{ p.amt }}
P&L — July
{{ p.n }}{{ p.amt }}
Balances
{{ b.n }}{{ b.amt }}
Cash — six months
{{ m }}
Every figure on this tab derives from the P&L, balance sheet, A/R and A/P agings, and bank balances your accounting system already produces.
CustomerSales YTDLast invoiceLifetimeCurrent aging
{{ c.n }} {{ c.ytd }} {{ c.last }} {{ c.ltv }} {{ c.aging }}
Workflow 05

Source-Document Reconciliation

Two documents that are supposed to agree, reconciled line by line, with every variance explained. In production this workflow reconciled a vendor’s monthly log against a client’s own settlement worksheet and landed on $18,087.60 — matching the client’s independently prepared figure to the cent.

3 source formats → 1 canonical
reviewer flags: 17 → 5
{{ recTotalChip }}
Document A — vendor monthly log
{{ recDocA }}
Quantities in tons. Table shape varies month to month — three distinct formats in this sample.
Document B — client settlement worksheet
{{ recDocB }}
Quantities in pounds. Conversion factor shown on screen: 1 ton = 2,000 lb. Precision is the message.
Reconciliation — canonical shape after normalization
LineLog (tons)× 2,000 lbRule appliedReconciledFlag
{{ r.item }} {{ r.tons }} {{ r.lb }} {{ r.adj }} {{ r.amt }} {{ r.flag }}
Reconciled settlement total — matches the client’s independent figure to the cent {{ recTotal }}
Reviewer flags: 17 → 5
As rules were refined against real paperwork, open flags dropped from seventeen to five. The remaining five are named, not hidden — each needs a client ruling, not a better model.
FLAG {{ f }}
Why the normalization stage matters
Real documents arrive in inconsistent table shapes — this sample alone carries three. The engine resolves them into one canonical form before any rule runs, and shows the conversion factor wherever the two documents disagree on units. It is the least glamorous stage and the most credible one: it says this has been run against real paperwork, not a clean sample.
How this is built

The page your board will ask about.

How documents reach us. Structured payloads over authenticated HTTPS. Clients do not email documents into a shared mailbox and do not upload into a general-purpose environment. When we say API, we mean the document never sits in an inbox.

Who can see what. Per-user authentication. Every database query runs under the requesting user’s own credentials, with row-level policies enforced at the data layer — so an application bug cannot return another tenant’s rows. There is no privileged service key anywhere in the application.

Multi-tenant isolation. Every job row is tagged to its client. Clients receive only their own results. Access is per-key, with per-key quotas, and an invalid or inactive key is refused outright.

Secrets. Centrally managed and injected at deploy time. Nothing in source control, nothing in a repository, nothing in a config file a contractor can read.

Audit trail. Every request writes an immutable row: who, what, when, which rules fired, what was decided, who approved. The excerpt below is the same live trail your Approve and Reject clicks on the audit page write to.

{{ t.line }}

Approval gates. Nothing reaches a client-visible or system-of-record state without a human decision:

{{ m.n }}

Failure behavior. Validation failures route to human review. Upstream outages degrade one entity, never the report. Nothing is ever reported as current when it is stale.

What we do not do
We do not train on client data. We do not store client credentials in the application. We do not retry silently in a way that masks a failure, and we do not report success when a step failed. Stating limits out loud is part of the design.
Ross Armstrong
Questions about the architecture?
Ross built it. Ask him directly — no pitch, no obligation.
Book a call with Ross
Pillar Optimization Partners · Strategic Finance & Automation · All data on this page is synthetic and computed at runtime.
ross.armstrong@pop4success.com Book a call