PCI DSS Compliant ERP Systems & Secure Payment Processing
Any system that stores, processes, or transmits cardholder data falls inside the scope of the Payment Card Industry Data Security Standard, currently at version 4.0.1. ERPStack builds custom ERP platforms around tokenised payment processing, network segmentation, and append-only transaction ledgers — with the explicit goal of keeping your assessment scope as small as the business will allow. Delivery runs 6 to 24 weeks on fixed-fee milestones from $25,000, deployed by Terraform into your own AWS account.
Quick Answer
In short: ERPStack designs and builds custom B2B ERP software engineered against the PCI DSS control baseline — server-side RBAC, AES-256 encryption at rest, TLS 1.3 in transit, and append-only audit logging — deployed into your own AWS or Microsoft Azure account with 100% source-code ownership and zero per-seat licensing.
PCI DSS control baseline, in numbers
Every row below is a parameter an assessor can test, not a posture we can assert.
- Standard version
- Engineered against PCI DSS v4.0.1, the current version of the standard.
- Cardholder data stored
- 0 primary account numbers, 0 CVVs, 0 PINs — a gateway token and the last 4 digits only.
- Tokenisation
- Browser-side, inside the processor's iframe; the PAN never reaches your Next.js tier.
- Encryption
- AES-256 at rest on tokens and transaction rows, TLS 1.3 on 100% of payment routes.
- Key management
- AWS KMS or Microsoft Azure Key Vault, 90-day rotation, every use logged with the calling identity.
- Ledger integrity
- Append-only PostgreSQL table; UPDATE and DELETE revoked for every role.
- Requirement 10
- Replication to write-once storage within 5 seconds of the write.
- Scan cadence
- Internal and external vulnerability scans at least 4 times a year, plus after each significant change.
- Authorisation
- Server-side RBAC: billing staff can refund, but 0 roles can edit the ledger.
- Handover
- 100% of the repository, Terraform network definitions, and the segmentation evidence.
- Delivery
- 6 to 24 weeks on fixed-fee milestones from $25,000, with a working slice inside 4 weeks.
- Licensing
- 0 per-seat fees; the ERP and its PostgreSQL database stay in your AWS account.
PCI DSS Checklist
- Tokenised PaymentsBrowser-side tokenisation keeps 0 PANs in PostgreSQL; you store a token and 4 digits.
- Encryption at RestAES-256 on tokens, transaction rows, and customer logs; keys in AWS KMS, rotated every 90 days.
- Strict Ingress FilteringWeb Application Firewall rules returning HTTP 429 on card-testing and credential stuffing.
- Access RestrictionsServer-side RBAC: billing staff refund, 0 roles edit the append-only ledger.
- Network SeparationPrivate PostgreSQL subnets in an AWS VPC described in Terraform, deny-by-default.
Why ERPStack Custom Engineering?
- Reduced assessment scopeTokenisation removes the ERP and its PostgreSQL database from the cardholder data environment.
- Gateway integrationStripe, Braintree, and Adyen through a typed API, with 0 hosted-page redirects.
- Fraud ingress protectionRate limits and AWS firewall rules block automated card testing before checkout.
Grade Your Architecture Readiness
Use our interactive systems grader to evaluate your current PostgreSQL configuration, RBAC model, scaling limits, and audit-evidence gaps against the PCI DSS controls above. It takes about 4 minutes and returns a written result, not a lead form.
Start Security AuditFinancial Transaction Engineering: PCI DSS Compliance Architecture
Executive Summary
This is the encryption, network, and ledger design behind PCI DSS aligned ERP systems built by ERPStack. The current standard is PCI DSS v4.0.1. The most valuable engineering decision in this domain is not a stronger control — it is a smaller scope. Software that never sees a primary account number falls outside most requirements entirely, so every design below pushes cardholder data toward the gateway and away from your ERP and its PostgreSQL database.
Cardholder Data Isolation
Tokenisation at the browser. Card fields render inside the processor's own iframe — Stripe Elements, Adyen, or Braintree — so the PAN travels from the shopper's browser to the gateway without touching your Next.js servers, your logs, or PostgreSQL. The ERP receives a token, the card brand, and the last 4 digits.
Network segmentation. The application tier is separated from payment-adjacent services by security groups that deny by default. Terraform describes the AWS VPC, so the boundary is reviewable as code rather than as a screenshot. Database subnets carrying financial records are private, reachable only through named application roles.
Strong cryptography. TLS 1.3 on every route, with weak cipher suites removed at the load balancer rather than merely deprioritised. At rest, tokens and transaction records are encrypted with AES-256.
Key management. Keys live in AWS Key Management Service or Microsoft Azure Key Vault on a 90-day rotation, with a grant held only by the payment service. Every key use is logged with the calling identity — which is the evidence an assessor tests, rather than the policy document describing it.
Requirement 10: Reconstructing Who Did What
// Append-only payment ledger in PostgreSQL. No PAN, no CVV, no PIN — ever. // Amounts are stored in minor units to avoid float rounding. import { integer, pgTable, serial, timestamp, varchar } from 'drizzle-orm/pg-core'; export const paymentAuditLog = pgTable('payment_audit_log', { id: serial('id').primaryKey(), transactionId: varchar('transaction_id', { length: 256 }).notNull(), userId: varchar('user_id', { length: 256 }).notNull(), actionType: varchar('action_type', { length: 64 }).notNull(), // TOKENIZE | REFUND | VOID amount: integer('amount').notNull(), currency: varchar('currency', { length: 3 }).notNull(), paymentToken: varchar('payment_token', { length: 256 }).notNull(), clientIp: varchar('client_ip', { length: 45 }).notNull(), timestamp: timestamp('timestamp', { mode: 'date' }).defaultNow().notNull(), });
Ledger rows are write-once — UPDATE and DELETE are revoked for every PostgreSQL role — and replicate within seconds to offsite AWS object storage under a write-once lock.
Vulnerability Management
Requirement 6 and Requirement 11 assume continuous work rather than an annual scramble. Semgrep SAST runs on every commit in GitHub Actions and dependency audits fail the build on a high-severity match. Internal and external vulnerability scans run at least quarterly and after any significant change. RBAC lets a billing coordinator read a transaction and issue a refund while denying edits to the ledger itself, and Zod schemas reject malformed payment payloads at the API boundary before they reach business logic.
Operational Outcomes
Tokenisation removes most systems from the cardholder data environment, which is what shrinks a 12-requirement assessment to a short questionnaire. Rate limits and edge filters block card-testing and credential-stuffing traffic before it reaches checkout. And scope reduction is achieved without pushing the customer onto a hosted page that breaks the buying flow.
Stack and Boundaries
The PCI DSS aligned ERP runs on Next.js and TypeScript with PostgreSQL behind Drizzle ORM, deployed by Terraform into your own AWS or Microsoft Azure account. RBAC is enforced in the Next.js API layer, Redis holds 0 payment data, and Zod validates 100% of API boundaries. Semgrep SAST, Vitest, and Playwright run in GitHub Actions on every commit. ERPStack operates 0 of it: after handover no ERPStack account reaches your PostgreSQL cluster or your AWS keys, so we sit outside your cardholder data environment.
Compliance Engineering Technology Stack
Frequently Asked Questions
No. ERPStack is not a Qualified Security Assessor and holds no PCI DSS attestation. Validation attaches to the entity that stores, processes, or transmits cardholder data — your merchant or service-provider account — and is evidenced by a self-assessment questionnaire or a report on compliance signed by a QSA. What we engineer is the payment processing architecture that keeps that scope small: tokenisation at the browser, no PAN in your database, and segmented networks.
No. Card details never reach your servers. Payment processing runs through client-side tokenisation — Stripe Elements, Adyen, or Braintree fields rendered inside the processor's own iframe — so the primary account number goes straight to the gateway and your ERP receives only a token, the card brand, and the last four digits. That single design decision is what moves most merchants from a full report on compliance down to the far shorter SAQ A.
The payment processing ledger is append-only and holds the gateway token, the amount in minor units, the currency, the action type, the acting user, the client IP, and a timestamp — never a PAN, never a CVV, never a PIN. Rows replicate within seconds to write-once object storage. PCI DSS Requirement 10 asks you to reconstruct who did what to cardholder data, and an immutable ledger answers that without a log-collection project during assessment.
Keys live in AWS Key Management Service or Microsoft Azure Key Vault, never in the repository and never in an environment file, and only the payment processing service holds a grant to use them. Rotation runs on a 90-day schedule, with previous key versions retained so historical records stay decryptable. Every key use is logged with the calling identity, which is the evidence an assessor tests when reviewing key management rather than the written policy.
TLS 1.3 on every route, with TLS 1.2 permitted only where a legacy payment processing partner still requires it, and everything below that disabled at the load balancer. HSTS is preloaded, certificates rotate automatically, and mixed content fails the build rather than shipping. Weak cipher suites are removed rather than deprioritised, because an assessor scans what the endpoint actually negotiates, not what the configuration file intended.