Invoices · Approvals · Wallet · Withdrawals

Contractor payroll
without the complexity.

Vectis is not a payroll engine. It is an invoice and payout layer. Contractors raise invoices, you approve them, funds flow to their wallet, they withdraw to their bank.

Invoice · INV 0142
Due in 7d 2h
Subtotal$ 5,000
Tax$ 400
Total$ 5,400
DueMay 30
subtotal · tax · total · dueDate · paidAt
The product

A dashboard that performs.

Every tile below maps to a real column on a real table. Nothing synthetic, nothing for show.

VECTIS · LEDGER
Live
Wallet balance · month
$0.00 USD
0% vs last period
Invoices approved
0
draft · sent · approved · paid
Withdrawals processed
0
method · bankDetails · reference
Twelve week volume
€ 5,400.00 invoice approved for Lucas K.
0.8s
Withdrawal booked · SEPA · reference WD 0412
1.4s
01

Draft, safely private.

The contractor assembles line items, names quantity and unitPrice on each row, picks a due date, and names the currency. Nothing is public yet.

Description
Qty
Unit
Amount
Frontend audit · week 18
32
85
2,720.00
Dashboard redesign · milestone 2
1
1,800
1,800.00
Handoff documentation
6
85
510.00
Bug triage · sprint 12
4
85
340.00
Subtotal$ 5,370.00
Tax · 7.5%$ 402.75
Total$ 5,772.75
Due dateMay 30, 2026
02

Sent, client notified.

The draft crosses the wire. fromOrg and toOrg are stamped, contractId is linked, and the client org sees it land on their approvals queue.

H
Helia Studio → Vectis GmbH
from_org_id · to_org_id · contract_id CTR 0042
sent
POST /invoices/0142/send202 Accepted · 38 ms
webhook invoice.sent OK notify.approver("diana@helia.studio") OK ledger.lock(invoice_id) OK attach(contract_id=CTR 0042) OK
03

Approved, the client signs off.

The client reviews line by line, compares against the contract, and flips the status to approved. The total is earmarked on the wallet pending balance.

DM
Diana Marchetti · approved
role · admin · org · Helia Studio
14:02 UTC
pendingBalance earmarked
wallet · Helia USD · − $ 5,772.75
approved
@
Contractor notified
email · slack via integration · webhook invoice.approved
14:02 UTC
04

Paid, paidAt stamped.

Funds clear, the status flips to paid, paidAt is written, the wallet balance moves. The contractor can book a withdrawal on the next screen.

Wallet · movement
paidAt · 2026-05-12 09:41
Helia USD balance− $ 5,772.75
Lucas EUR balance+ € 5,400.00
Pending balance$ 0.00
Statuspaid ✓
settledexit states:overduecancelled
Wallet and withdrawals

Hold the money. Move the money.

One wallet per organization by default, more when cycles call for it. Withdrawals leave a paper trail with method, bank details, reference, and a failure reason if something goes sideways.

01 · Live balance

Live balance

WalletAccount stores balance and pendingBalance as separate fields so you always know what is available right now versus queued.

$42,180.00
Balance · USD
02 · Methods

Withdrawal methods

The method column plus a bankDetails JSON payload covers local rails, SEPA, wires, and anything finance configures per payout.

7 rails
Configured per wallet
03 · Failure

Failure handling

When a payout fails we write the reason to failureReason on the withdrawal row, keep the status honest, and leave the money on the wallet.

0.4%
Failure rate · illustrative
04 · Audit

Full audit trail

Reference, requestedBy, processedAt, status, timestamps on every withdrawal. The whole history reads top to bottom for an auditor.

100%
Every row logged

Invoices and payouts, done right.

Approve an invoice, watch the wallet move, book a withdrawal, read the audit trail. The whole loop takes less time than forwarding a PDF for signature.

Start free Read the guide