Security and compliance

Built like it has to hold money.

CashPilot targets OWASP ASVS 5.0 Level 2 for the application layer and keeps card data out of scope entirely with Stripe's hosted Checkout. Every release must pass an automated acceptance checklist; the current one runs 26,863 checks, all passing, and is readable inside the product.

✓
OWASP ASVS 5.0 Level 2Controls mapped chapter by chapter and executed on every release.
✓
PCI DSS SAQ ACards are entered on Stripe Checkout, never on CashPilot.
✓
Encrypted provider secretsFernet (AES-128-CBC + HMAC-SHA256), key derived from SECRET_KEY via HKDF, shown masked.
✓
Tenant isolationEvery entity load filters by organisation; cross-tenant access returns 404.
✓
Signed, idempotent webhooksHMAC-SHA256 with timestamp tolerance, event-id idempotency in a savepoint, live re-fetch.
✓
Password and session hygienescrypt hashes, throttling and lockout, HMAC-signed HttpOnly SameSite cookies, 12-hour lifetime.
✓
Strict browser policyCSP without unsafe-eval, frame-ancestors none, nosniff, referrer and permissions policies.
✓
Audit everythingEvery mutation, rejection, sync and integration event recorded with before and after values.
✓
26,863 automated checksLedger and prediction integrity, routes × roles matrix, ASVS probes, connectivity, design invariants.
Controls by ASVS chapter

What is verified, and how.

ASVS 5.0 chapterControl in CashPilotVerified by
V1 EncodingTemplate autoescape everywhere; Decimal money; parsers reject malformed input and XML entitiesTemplate audit, stored-XSS probes
V2 ValidationPydantic models; bounded pagination; enumerated sorts and statuses; length-capped forms422 and injection probes
V3 Web frontendCSP, X-Frame-Options, nosniff, referrer and permissions policies, COOP; no inline handlersHeader matrix on every page
V4 APIHashed, scoped, revocable bearer keys; rate limit with standard headers; JSON errorsAPI and rate-limit checks
V5 FilesUpload size limits, format detection, no execution, server-side exportsUpload probes
V6 Authenticationscrypt; 10+ char policy with denylist; per-IP+email throttle and lockout; generic errorsWeak-password and lockout probes
V7 SessionsSigned cookie, HttpOnly, SameSite=Lax, Secure in production, 12 h; logout invalidatesCookie and tamper checks
V8 AuthorisationFour roles; every route declares a minimum role; every query scoped by organisationRoutes × roles matrix, tenancy checks
V9 TokensReset and simulated-checkout tokens signed, time-limited and bound to the password hashReset-token checks
V11 CryptographyFernet for provider secrets; HKDF key derivation; constant-time comparisonsRound-trip and masking tests
V12 TransportTLS at the edge with automatic certificates; HSTS; X-Forwarded-Proto honouredTransport checks
V13 ConfigurationSecrets in .env (mode 600); no debug endpoints; non-root container; pinned dependencies; AlembicOps checks over SSH, source audit
V14 Data protectionPer-tenant isolation; administrator export; secrets never rendered; 192-bit rotatable portal tokensExport and masking checks
V16 LoggingStructured JSON logs with request ids; audit log for every mutation; generic errors to clientsLog and audit checks
Payments

PCI DSS scope: SAQ A

Card entry happens on checkout.stripe.com. CashPilot never receives card numbers. Merchants qualify for SAQ A (v4.0.1, January 2025 revision), provided their own pages carry the script-integrity protections CashPilot ships: a strict Content Security Policy and Subresource Integrity on the single CDN script.

Webhooks are verified on the raw body with HMAC-SHA256 (t=/v1= parsing, 300-second tolerance, constant-time compare, multiple v1 values for secret rotation), made idempotent on the event id inside a database savepoint, and the checkout session is re-fetched from Stripe before any ledger change. Every signature problem is a 400 with an audit entry.

Bank data

Statements are parsed with the standard library; XML entity declarations are rejected; amounts are exact decimals; duplicates are rejected per account and transaction id. Open-banking credentials for Plaid and GoCardless are encrypted at rest, sync cursors persist per account, and every sync and application is audited.

Reporting a vulnerability

Email hello@cashpilot.app with steps to reproduce. We acknowledge within two business days and aim to ship fixes for high-severity issues within seven.

Deployment options

Multi-tenant cloud, a dedicated instance, or on-premise in your own cloud account. The product ships as two containers and a Postgres database; the same release checklist runs against every deployment.

Start today

Stop financing your customers’ cash flow.

Import a CSV and see your own ranked worklist and 13-week forecast in about ten minutes. Or click around the live demo workspace with 18 months of ledger history.

Free plan for up to 25 invoices14-day trial on every paid planCancel any time