From $0 to $250K: Spending Tier Policies That Actually Enforce Themselves
From $0 to $250K: Spending Tier Policies That Actually Enforce Themselves
Category: Financial Services | Reading time: 5 min
The Approval Matrix Nobody Follows
Every finance team has one. A spreadsheet, a policy document, maybe a Confluence page: "Payments under $1,000 — AP clerk. $1,000–$25,000 — manager approval. $25,000–$250,000 — VP Finance. Over $250,000 — CFO."
In practice, it's a suggestion. Someone is on holiday, so the CFO approval "can wait until Monday." A manager bulk-approves a queue without reviewing individual amounts. An AP clerk finds a workaround to split a $30,000 invoice into three smaller ones. The policy exists on paper. Enforcement is inconsistent.
When an AI agent takes over payment processing, inconsistent enforcement becomes a risk you can no longer explain away. The agent will either enforce the policy correctly every time — or it won't. There's no nuance, no judgment call, no "I'll flag this for review." You need the approval matrix to actually work.
Encoding the Matrix as Policy
Taos translates spending tier rules into Rego — deterministic, evaluable, auditable:
package taos.paymentpilot.vendor_payment
# Tier 1: Auto-approve (< $1,000)
tier_auto_approve {
input.amount >= 0
input.amount < 1000
input.vendor_status == "approved"
input.is_ofac_cleared == true
}
# Tier 2: Manager approval ($1,000 – $25,000)
tier_manager_approval {
input.amount >= 1000
input.amount < 25000
input.vendor_status == "approved"
input.is_ofac_cleared == true
}
# Tier 3: VP Finance ($25,000 – $250,000)
tier_vp_finance_approval {
input.amount >= 25000
input.amount < 250000
input.vendor_status == "approved"
input.is_ofac_cleared == true
}
# Tier 4: CFO (≥ $250,000)
tier_cfo_approval {
input.amount >= 250000
input.vendor_status == "approved"
input.is_ofac_cleared == true
}
# Required approver role for each tier
required_role = "manager" { tier_manager_approval }
required_role = "vp_finance" { tier_vp_finance_approval }
required_role = "cfo" { tier_cfo_approval }
This isn't an if-else chain in application code. It's a policy document that the governance kernel evaluates at runtime. The application code doesn't know about thresholds — it only knows whether policy returned allow, require_approval, or deny.
Authority Levels: No Self-Approval Above Your Tier
The second half of the problem is who can approve what. A manager shouldn't be able to approve their own $200,000 payment. A VP Finance shouldn't be able to unilaterally approve a CFO-tier payment.
Taos encodes authority levels as a role hierarchy:
| Role | Authority level | Can approve |
|---|---|---|
| AP Clerk | 0 | Nothing (submit only) |
| Manager | 1 | Manager tier (< $25K) |
| VP Finance | 2 | Manager + VP Finance tier (< $250K) |
| CFO | 3 | All tiers |
When a payment request arrives, the kernel:
- Evaluates the Rego policy → determines
required_role - Checks the submitter's role against the authority matrix
- If the submitter has sufficient authority — auto-approved with OBO chain recorded
- If the submitter does not — raises
ApprovalPendingError→ routes to the correct approver
An AP clerk submitting a $500 payment gets it auto-approved. An AP clerk submitting a $30,000 payment gets routed to a manager. A manager submitting a $30,000 payment approves it themselves. A manager submitting a $100,000 payment gets routed to VP Finance. This is not configurable at the application layer — it's enforced at the kernel layer.
The Invoice-Splitting Problem: Solved
What about the classic workaround — splitting a $30,000 invoice into three $9,999 invoices to stay under the manager threshold?
With Taos, each invoice is evaluated independently against the policy. However, you can add an aggregate rule:
# Deny if vendor total in current period exceeds auto-approve threshold
deny_aggregate_threshold {
input.vendor_period_total >= 25000
input.amount >= 1000
}
The vendor_period_total is computed before policy evaluation and passed as an input attribute. The split-invoice workaround hits the aggregate rule and gets routed to manager approval anyway.
The rule lives in the policy bundle. Finance updates it — not engineering.
Changing Thresholds Without Changing Code
In Q4, your CFO decides to lower the auto-approve threshold from $1,000 to $500 due to a budget crunch. In a traditional system, this means:
- Engineering ticket
- Code change
- Test suite update
- Deployment
In Taos:
- Finance manager opens the Policy Bundles page in the control plane
- Edits the
tier_auto_approverule:input.amount < 1000→input.amount < 500 - Publishes the new version
- The kernel picks it up on the next evaluation — no restart, no deployment
The change is versioned, timestamped, attributed to the person who made it, and auditable. If the CFO wants to revert in January, that's another two-minute policy edit.
What the Approval Queue Looks Like
When a payment requires approval, the agent pauses and creates an approval request:
{
"approval_id": "appr-abc123",
"invoice_id": "INV-7821",
"amount": 18500.00,
"vendor_name": "Acme Supplies Ltd",
"required_role": "manager",
"submitted_by": "aclerk",
"policy_rule": "tier_manager_approval",
"nonce": "f3a2b1c4"
}
The manager sees this in the approval queue, reviews it, and approves or rejects. The approval is signed, the OBO chain is extended, and the workflow resumes — or compensates if rejected.
The Bottom Line
Spending tier policies aren't hard to write. They're hard to enforce consistently across thousands of payments, multiple agents, and changing business conditions.
Policy-as-code makes the approval matrix a first-class technical artifact — something that runs deterministically, can be changed without engineering, and produces an auditable record of every decision. Your approval matrix stops being a Confluence page and starts being an enforceable control.
Tags: spending tiers, AP approval workflow, policy-as-code, financial controls, AI governance, accounts payable