Skip to main content
Secure Enterprise Engineering

SOC 2 Type II Compliant Software Engineering & Custom ERPs

Security has become a procurement gate rather than a differentiator: enterprise buyers now ask for a SOC 2 report before they will sign. ERPStack engineers custom ERPs and business applications against the AICPA Trust Services Criteria — Security, Availability, Processing Integrity, Confidentiality, and Privacy — so that when your CPA firm runs the examination, the controls it tests already exist in code and produce their own evidence. 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 SOC 2 Type II 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.

SOC 2 Type II control baseline, in numbers

Every row below is a parameter an assessor can test, not a posture we can assert.

Observation window
Controls engineered to produce evidence continuously across a 3 to 12 month Type II period.
Authorisation
Server-side RBAC on 100% of queries; a client-supplied JWT claim is re-checked against PostgreSQL.
Encryption
AES-256 at rest, TLS 1.3 in transit, secrets injected at runtime from a cloud vault.
Availability target
Multi-AZ AWS deployment with automatic failover, designed for 99.9% availability.
Processing integrity
Zod validation at every API boundary, multi-step writes in ACID PostgreSQL transactions.
Change management
100% of merges via reviewed pull request, with GitHub Actions run history retained.
Pipeline gates
Semgrep SAST plus dependency audit on every commit; high severity fails the build.
Identity
SSO over SAML 2.0 or OIDC, so deprovisioning happens in 1 place, not 2.
Log integrity
Append-only tables with UPDATE and DELETE revoked for all PostgreSQL roles.
Handover
100% of the repository, Terraform, and the control matrix your CPA firm will sample.
Delivery
6 to 24 weeks on fixed-fee milestones from $25,000, with a working slice inside 4 weeks.
Licensing
0 per-seat fees; unlimited users and client portals at flat hosting cost.

SOC 2 Type II Checklist

  • Access Control
    Server-side RBAC on 100% of queries; a JWT claim is re-checked against PostgreSQL.
  • Monitoring & Logs
    Append-only event logging with alerts on bulk export and repeated auth failure.
  • Change Management
    Terraform infrastructure-as-code, 100% reviewed pull requests, GitHub Actions history retained.
  • Incident Response
    Documented alerting paths and failover between 2 AWS availability zones, rehearsed quarterly.
  • Data Retention
    Encrypted AES-256 backups on a documented schedule, restorable to any point in 35 days.

Why ERPStack Custom Engineering?

  • Procurement-ready evidenceAnswer a 200-question security review with architecture documents, not assurances.
  • Automated CI/CD gatesSemgrep SAST and dependency audits on 100% of pull requests, blocking on high severity.
  • High-availability designMulti-AZ AWS failover engineered against a 99.9% availability target and measured.

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 SOC 2 Type II controls above. It takes about 4 minutes and returns a written result, not a lead form.

Start Security Audit

Enterprise Security Systems: SOC 2 Type II Compliance Architecture

Executive Summary

This is the control set ERPStack builds into custom ERPs headed for a SOC 2 Type II examination. A Type II report differs from a Type I in one decisive way: it tests whether controls operated effectively over a period, typically 3 to 12 months, rather than whether they existed on a single day. Evidence therefore has to accumulate by itself for the whole window. Systems that depend on someone remembering to take a screenshot fail this, and they fail it late.

The Five Trust Services Criteria, in Code

Security, the common criteria: a Web Application Firewall filters ingress, CORS allow-lists are explicit rather than wildcarded, and PostgreSQL runs in a private subnet with no public route. RBAC is evaluated in the API layer on every query — never trusted from the client.

Availability: multi-AZ deployment on AWS with automated failover, plus alerting on CPU, memory, and connection-pool saturation. The design targets 99.9% availability; what your contract commits to is a commercial decision, not an engineering one.

Processing Integrity: input validated with Zod schemas at the boundary, multi-step writes wrapped in ACID transactions in PostgreSQL. Records are processed completely or not at all — there is no partial-write path to reconcile later.

Confidentiality: contracts, financials, and intellectual property restricted to named roles. Uploads land in private AWS buckets with server-side encryption and short-lived signed URLs.

Privacy: consent state is a first-class column, and a data subject can export or delete their own records through the same REST API the support team uses.

CI/CD as a Control

Automated gates generate the change-management evidence a Type II window needs. Semgrep SAST scans the TypeScript codebase on every commit for injection and unsafe deserialisation. Dependency audits fail the build on a high-severity match rather than warning. Merges to the release branch require a reviewed pull request, and GitHub Actions retains the run history, so approvals, tests, and scans exist as dated artefacts.

// Server-side authorisation. RBAC is re-checked on every request:
// a client-supplied role claim is an assertion, the PostgreSQL row is the fact.
import { headers } from 'next/headers';

export async function verifySoc2SecurityContext(requiredRole: string): Promise<boolean> {
  const reqHeaders = await headers();
  const authHeader = reqHeaders.get('authorization') ?? '';
  if (!authHeader.startsWith('Bearer ')) {
    return false;
  }
  const token = authHeader.slice(7); // verify the JWT signature, then re-read
  return verifyRoleInDatabase(token, requiredRole); // the role from PostgreSQL
}

Infrastructure Safeguards

Every SOC 2 oriented deployment uses one isolation pattern. PostgreSQL is reachable only through the application role or a bastion host with session recording. Connection strings and API keys live in a cloud vault, injected at runtime through workload identity, so no engineer holds standing production credentials and there is no standing access to review. Terraform describes all of it, so an auditor reads infrastructure change history as pull requests. Log monitoring alerts on unusual export volume, bulk reads, and repeated authentication failures, with thresholds tuned per tenant rather than globally.

Operational Outcomes

Enterprise sales cycles shorten because a security questionnaire is answered with architecture documents instead of promises. Least-privilege RBAC and append-only logs limit both blast radius and time to detect. And the evidence a CPA firm samples already exists, dated, across the entire observation window — which is the difference between a 2-week fieldwork exercise and a 2-month scramble.

Stack and Boundaries

Custom ERPs for a SOC 2 examination run on Next.js and TypeScript with PostgreSQL behind Drizzle ORM, deployed by Terraform into your own AWS account. RBAC is enforced in the Next.js API layer; Redis caches only non-confidential data; Zod validates 100% of API boundaries; SSO handles identity. Semgrep SAST, Vitest, and Playwright run in GitHub Actions on every commit, and Sentry carries the error telemetry. ERPStack operates 0 of it: after handover no ERPStack account reaches your PostgreSQL cluster or your AWS keys, which removes us from the SOC 2 boundary entirely.

Compliance Engineering Technology Stack

Frequently Asked Questions

No, and the distinction is worth stating precisely. A SOC 2 is an attestation report issued by a licensed CPA firm about a service organisation's own system; the AICPA's SOC suite is a CPA service rather than a vendor badge, and it cannot be inherited from a supplier. ERPStack holds no SOC 2 report. We build custom ERPs whose controls are designed to survive that examination, and we hand your auditor the design documentation — but the opinion is theirs to write, about your organisation.

All five, weighted to the scope your report will cover. Security is the common criteria every custom build includes: firewall rules, explicit CORS allow-lists, and a PostgreSQL subnet with no public route. Availability adds multi-AZ failover and capacity alerting. Processing Integrity is enforced in the software through Zod validation and ACID transactions. Confidentiality restricts documents to named roles via RBAC. Privacy adds consent state and self-service export. Your auditor decides which criteria the report covers.

A Type II report tests whether controls operated over a period of 3 to 12 months, not on one day, so the evidence has to accumulate without anyone remembering to collect it. Every custom repository requires a reviewed pull request, runs Semgrep SAST and dependency audits on each commit, and blocks the merge on failure. GitHub Actions retains that history, so change management, access review, and testing evidence exist as dated artefacts across the entire window.

Yes. Every inbound and outbound API call in a custom ERPs build is logged with origin IP, route, latency, response code, and schema validation result, and the log table is append-only. Rate limits and anomaly thresholds raise alerts on unusual export volume or repeated authorisation failures. Because the software runs inside your own cloud account, those logs stream to your SIEM rather than to a vendor dashboard you would lose when the contract ends.

Yes — SSO over SAML 2.0 or OIDC against Okta, Microsoft Entra ID, or Google Workspace, so custom ERPs never become a second directory someone has to remember to deprovision. Joiner, mover, and leaver events flow from the identity provider, RBAC roles map to directory groups, and multi-factor policy stays where your security team already manages it. Removing a person from the directory removes their software access, which is the control most examinations test first.

Explore Custom ERP Solutions by Location, Industry, and Alternatives

Global Architectures