Enterprise Security

Security you can show your IT team

Every security control on this page is implemented and verifiable in production. We list only what is built — not what is planned. Community banks deserve transparency, not a marketing checklist.

100/100
Security Audit Score
0 Critical
0 High
0 Medium
0 Low
April 2026 assessment · all findings resolved May 2026 · 40 passing checks
SAML 2.0 + OIDC + Google & Microsoft SSO
MFA with TOTP & 30-day device trust
AES-256-GCM encryption at rest (TOTP secrets & EINs)
Automated daily security audit engine
Immutable audit trail & compliance PDF exports
Rate-limited APIs & global brute-force protection
Authentication & Access

Enterprise-grade identity controls

Full SSO integration for enterprise deployments, hardware-compatible MFA, and layered session security built on Node.js cryptographic primitives — no third-party auth dependencies.

SAML 2.0 + OIDC Enterprise SSO

Per-organization SSO configuration supporting all major enterprise identity providers. Administrators choose between optional SSO and enforced SSO — enforced mode blocks email/password login entirely, routing all authentication through your identity provider.

Azure AD, Okta, OneLogin, PingFederate, ADFS
SAML 2.0 via SP-initiated flow with metadata endpoint
OIDC Authorization Code flow with discovery document caching
Automatic user provisioning on first SSO login
Domain-aware login routing (one domain per org, no conflicts)

MFA with TOTP

Time-based one-time passwords (RFC 6238) compatible with any standard authenticator app — Google Authenticator, Authy, 1Password, and hardware tokens like YubiKey (OTP mode). Implemented with zero external authentication libraries.

RFC 6238 TOTP — 6-digit codes, 30-second window
160-bit secrets encrypted at rest with AES-256-GCM
10 one-time backup recovery codes (HMAC-SHA256 hashed)
Lockout: 5 failed MFA attempts → 15-minute lockout
SSO users are unaffected — MFA applies to email/password only

Google & Microsoft SSO

OAuth 2.0 social login via Google and Microsoft for organizations that prefer consumer-identity SSO over enterprise SAML/OIDC. Each provider is configured per-organization. User accounts are provisioned automatically on first login with email matching for existing accounts.

Google OAuth 2.0 — authorization code flow, email-verified accounts
Microsoft OAuth 2.0 — Azure consumer and work/school accounts
Existing accounts linked by email — no duplicate account creation
State parameter prevents CSRF in OAuth redirect flow

30-Day Device Trust

After a successful MFA verification, users can opt to trust their current device for 30 days. Trusted devices bypass the MFA challenge without weakening session security — trust tokens are cryptographically signed and validated server-side on every use.

HMAC-SHA256 signed trust token, stored as httpOnly cookie
Token hash stored in database — revocable server-side
30-day hard expiry, not rolling

JWT Sessions

Session tokens are signed JWTs (HMAC-SHA256) delivered as httpOnly, Secure, SameSite=Lax cookies — never exposed to JavaScript. All tokens are tracked in the database for revocation. A deactivated user's session is terminated at the next request.

24-hour expiry, timing-safe signature verification
httpOnly; Secure; SameSite=Lax cookie flags — never accessible to JavaScript
Algorithm header verification — HS256 enforced, rejects "alg: none" attacks
Session revocation via database-tracked token store
Two-step MFA flow — password verifies first, MFA token required before session is issued
CSRF double-submit cookie — X-CSRF-Token header verified on all state-mutating requests

Login Brute-Force Lockout

Failed login attempts trigger progressive lockout, preventing brute-force attacks against email/password accounts. The same lockout policy applies to MFA attempts — both layers are protected with matched thresholds. Security events are logged to the audit trail.

5 failed login attempts → 15-minute account lockout
5 failed MFA attempts → 15-minute lockout (symmetric policy)
Lockout state stored server-side — not bypassable via cookie manipulation
Admin can unlock accounts immediately from the user management console

Self-Service Password Reset

Users can reset their password via a time-limited, single-use token sent to their verified email address. Tokens are SHA-256 hashed before storage — even if the database were compromised, reset tokens could not be replayed. The endpoint is rate-limited to prevent abuse.

Cryptographically random token — 32 bytes via crypto.randomBytes()
SHA-256 hashed before database storage — token not recoverable from DB
1-hour expiry — single-use, invalidated immediately on use
Rate-limited endpoint — prevents enumeration and abuse
Data Protection & Encryption

Encryption in transit and at rest

Sensitive credentials are encrypted at the application layer before reaching the database. All communication is TLS-only. Password hashing uses scrypt — a memory-hard algorithm resistant to GPU-accelerated brute force.

AES-256-GCM Encryption at Rest

Sensitive credentials — TOTP secrets, EIN/tax ID numbers, and other regulated data — are encrypted with AES-256-GCM before being written to the database. Even with direct database access, these values cannot be read without the application encryption key.

AES-256-GCM with 12-byte random IV per encryption operation
Authenticated encryption — tamper detection via GCM auth tag
Encryption key stored separately from database credentials
Covers: TOTP secrets, EIN/tax IDs, OAuth tokens, sensitive org metadata

TLS Everywhere

All traffic is TLS-encrypted. HTTP connections are redirected to HTTPS in production. HSTS headers instruct browsers to enforce HTTPS for all future visits — including subdomains — for one year, with preload eligibility.

HTTP → HTTPS redirect enforced in production
HSTS: max-age=31536000; includeSubDomains; preload
Database connections enforce SSL (rejectUnauthorized: true)

Password Hashing — scrypt

Passwords are hashed using scrypt, a memory-hard key derivation function. Each password uses a unique 16-byte random salt. All comparisons use crypto.timingSafeEqual() to prevent timing attacks.

scrypt N=16384, r=8, p=1 — 64-byte derived key
16-byte cryptographically random salt per password
Timing-safe comparison — resistant to timing side-channels

Parameterized Queries

Every database query uses parameterized statements with the Node.js pg driver. User-supplied input is never interpolated into SQL strings, eliminating SQL injection as an attack surface.

All queries use $1, $2 placeholder binding — no string interpolation
Applies to all user-supplied inputs: filters, IDs, search terms
Audit Trail & Compliance

Examiner-ready record keeping

Every material action in BankerMarketer is recorded in an append-only audit log. Records are never modified or deleted. Your compliance examiner can see exactly who approved what, when, and why.

Immutable Audit Event Log

Every administrative and compliance action writes an event record. Records are insert-only — no updates, no deletes. The log cannot be retroactively altered by any user, including administrators.

Captures: actor identity, target, event type, description, metadata, timestamp
Org-scoped — each bank sees only its own audit history
Covers: user management, role assignments, approvals, budget changes, CRA edits
Searchable and filterable from the admin console

CRA Reporting & Budget Controls

Every sponsorship request is tagged with CRA categories at submission. Reports are exportable for examiner review. Budget tracking enforces annual and quarterly spend limits with automated alerts at 75% and 90% of threshold.

CRA category tagging with reviewer override capability
Summary, detail, and year-over-year export formats
75% and 90% spend alerts — by category, annual or quarterly
All approvals include approver identity, timestamp, and comments

Automated Security Audit Engine

A daily automated audit runs 20+ security checks across every tenant at 2am UTC. Each check probes real-time system state — not configuration snapshots — across five categories: Authentication, Access, Data, Configuration, and Compliance. Results surface immediately in the owner dashboard.

20+ checks per tenant across 5 categories (Auth, Access, Data, Config, Compliance)
Severity levels: Critical, High, Medium, Low — with 30/90 day trend tracking
Daily cron at 2am UTC — findings stored per run for historical comparison
Alert configuration for critical findings and score drops — email delivery

Tenant Security Scorecards

Every tenant receives a letter-grade security scorecard (A through F) computed from the daily audit results. Scores are visible in the owner console alongside per-tenant findings. Banks can export their scorecard as a compliance PDF for vendor review or examiner presentation.

A–F letter grades per tenant, recomputed after each daily audit run
Findings explorer with severity filtering and dismissal workflow
Examiner-ready compliance PDF export — per-tenant, point-in-time snapshot
30/90 day severity trend charts visible in owner portal

DLP Findings & Access Review Certifications

Data Loss Prevention findings are tracked per tenant with severity classification, status workflow, and audit-logged dismissals. Access review certifications allow administrators to certify the appropriateness of user access on a scheduled basis — supporting periodic access control attestation required by bank regulators.

DLP findings tracked with severity, status, and resolution workflow
All finding dismissals audit-logged with actor and timestamp
Access review certifications — admin attests to user access appropriateness
Review records exportable for regulatory access certification audits
CRA & Fair Lending Data Handling

Geographic and demographic data controls

Census tract geocoding, LMI income designation, and Fair Lending analysis handle sensitive demographic information. Every step — from data sourcing to classification — is governed by controls designed for regulatory scrutiny.

Census Data Sourcing

Census tract and income data is sourced exclusively from the US Census Bureau API (geocoding.geo.census.gov) and FFIEC Census data. No third-party data brokers. All API requests use HTTPS. No API key required — public endpoints only.

Census tract geocoding via geocoding.geo.census.gov (HTTPS, no API key)
LMI income designation via FFIEC Census API (HTTPS)
ACS demographic data auto-fetched per request on geocoding completion
Geocoding failures logged and surfaced for manual resolution

Demographic Data Privacy

Beneficiary demographic fields (population served, count estimate, geographic area) are collected at the request level and stored with full org scoping. Demographic fields are stored in the same org-scoped database as financial data — not separated into a different system.

Beneficiary data fields collected at request submission (user-provided)
Census tract demographics auto-populated — never exposed to applicants
All demographic data org-scoped — no cross-tenant access
Audit trail captures every demographic field change with actor identity

Audit Trail for CRA Classifications

Every CRA classification change — activity type assignment, reviewer override, eligibility determination — is written to the immutable audit log. The log records who changed what, when, and why, supporting examiner scrutiny of your CRA program decisions.

CRA activity type assignment logged at submission
Reviewer override of CRA classification logged with approver identity
Demographic field edits (population served, beneficiary count) logged
Assessment area definitions tracked with full change history

Volunteer Data Integrity

Volunteer hours and headcount logged on CRA community service calendar events are timestamped at event creation and last modification. The audit log captures all changes to volunteer data — supporting the Service Test narrative with verifiable numbers.

Volunteer hours and count logged per calendar event, timestamped
Volunteer data aggregation for CRA Service Test quarterly report
Audit log records all volunteer data modifications with actor identity
Exportable CSV with full event history for examiner presentation
Access Control

Least-privilege, multi-tenant isolation

Data isolation is enforced at the database query layer — not just the UI. Every query is scoped to the requesting organization's ID. Server-side auth guards protect all routes. Cross-tenant data leakage has been verified absent through security testing.

Multi-Tenant Data Isolation

Every tenant data table carries an org_id foreign key defined as NOT NULL at the schema level. All queries enforce organization scoping — no data leaks between tenants regardless of IDs, filters, or sort parameters supplied by the client. Cross-tenant isolation has been verified by security testing.

org_id NOT NULL constraint on all tenant tables — enforced at schema level
org_id enforced on: requests, budgets, calendar, users, audit log, roles
Scoping applied at query layer, not just route middleware
Server-side auth guards on all protected routes — no client-side-only access control
No cross-tenant data leakage — verified by security pentest

Role-Based Access Control

Four default roles — Admin, Approver, Manager, User — with permission sets stored as structured JSON per organization. Users can hold multiple roles simultaneously. Role assignments are logged in the audit trail with the assigning administrator's identity.

Admin: full org management, user provisioning, audit access
Approver: approve/deny sponsorship requests
All role changes captured in the immutable audit log
Deactivated users are blocked at authentication — sessions terminated immediately

Owner Console Isolation

The platform owner console — which provides cross-tenant visibility and administrative controls — is protected by a dedicated requireOwner middleware layer. Owner-only endpoints are completely inaccessible to regular tenant users, regardless of role or privileges within their organization.

requireOwner middleware enforced server-side on all owner API routes
9 owner-only endpoints — not accessible via tenant session tokens
Owner identity validated on every request — no cached permission escalation
Security Headers & Infrastructure

Browser-level attack surface reduction

Response headers are set on every request to restrict what browsers permit. These controls prevent clickjacking, MIME-type confusion, cross-origin data leakage, and unauthorized feature access.

Content Security Policy

A strict CSP restricts script and resource loading to trusted origins only. No unsafe-inline — all scripts are loaded from external files. Inline frames and object embeds are blocked entirely. Insecure requests are upgraded automatically.

No unsafe-inline — all scripts loaded as external files, not inline blocks
frame-ancestors 'none' — prevents clickjacking in all browsers
object-src 'none' — disables Flash, Java, and plugin attacks
upgrade-insecure-requests — forces HTTPS sub-resources
connect-src 'self' — no unauthorized data exfiltration

Additional Security Headers

A defense-in-depth set of HTTP response headers locks down browser behavior across all response types — blocking framing, MIME sniffing, referrer leakage, and browser feature access. Server-identifying headers are removed to limit reconnaissance.

X-Frame-Options: DENY — clickjacking protection for older browsers
X-Content-Type-Options: nosniff — prevents MIME-type confusion attacks
Referrer-Policy: strict-origin-when-cross-origin
Permissions-Policy: camera=(), microphone=(), geolocation=(), payment=()
X-Powered-By removed — Express server fingerprint not exposed
X-Forwarded-For spoofing protection — trusted proxy config prevents IP header injection

Global Rate Limiting

Rate limits are enforced globally at the application layer using IP-based tracking. Counters are persisted in the database — rate limit windows survive server restarts and deploys, preventing window-reset attacks. Authentication endpoints (login, MFA, registration) have tighter limits than general API calls. Public-facing forms have separate limits to prevent abuse. All limits are server-side — not bypassable via client manipulation.

Login, MFA, and registration endpoints — tightest per-IP limits
Public forms (password reset, contact) — separate rate window
All API endpoints — general rate limit applied globally
Rate limit counters persist across restarts — no brute-force window resets
429 Too Many Requests returned on limit breach — no silent drop

File Upload & Download Security

Uploaded files are validated against their actual binary content (magic bytes), not just the file extension or declared MIME type. File downloads are served through a secure proxy that forces browser download behavior and prevents content sniffing — eliminating serving of user-uploaded content as executable HTML or scripts.

Magic byte validation — file type verified from binary content, not extension
Extension spoofing rejected — .jpg renamed to .exe caught at upload
Downloads served with Content-Disposition: attachment — forces save dialog
X-Content-Type-Options: nosniff on all file download responses
Owner Security Dashboard

Platform-wide security visibility

A dedicated owner console provides real-time security visibility across all tenants — severity trends, scorecard grades, active findings, and configurable alerts. Built for security teams managing multiple bank deployments.

Real-Time Severity Dashboard

The owner portal surfaces live counts of Critical, High, Medium, and Low findings across all tenants, with 30-day and 90-day trend charts. Security posture changes are visible immediately after each daily audit run.

Severity counts by level — Critical, High, Medium, Low
30-day and 90-day trend visualization
Per-tenant scorecard with letter grade (A–F) at a glance

Findings Explorer

A full-featured findings explorer lets operators browse, filter by severity and category, and action individual findings with a structured dismissal workflow. Every dismissal is captured in the audit trail with actor, timestamp, and reason.

Filter by severity, category, tenant, and status
Structured dismissal workflow — reason required, logged to audit trail
6-tab owner portal UI: Overview, Findings, Scores, Trends, Alerts, Exports

Alert Configuration

Operators configure alerts for specific security events — new Critical findings, score drops below a threshold, and tenant-level security regressions. Alerts are delivered via email and logged as notification events. Per-event muting is available for expected/accepted findings.

Alert triggers: new Critical findings, score drops, tenant regressions
Email delivery with per-event mute capability
13 security event types tracked (MFA disabled, new IP login, role changed, etc.)
Social Media Compliance & Archival

Examiner-ready social media governance

Social posts, inbound messages, and engagement data are governed by the same compliance controls as your CRA program. Every interaction is archived, timestamped, and exportable for bank examiner review — no competitor in the community bank space offers this level of social media compliance.

Immutable Social Archive

All published posts, comments, and direct messages are captured in an append-only archive the moment they go live. Every record carries a tamper-proof timestamp, SHA-256 integrity hash, and actor identity — the archive cannot be retroactively edited or deleted by any user, including administrators.

Append-only archive — no updates or deletes at any privilege level
SHA-256 integrity hash per record — tampering is detectable
7-year retention policy — meets FFIEC, SEC, and state banking examiner requirements
Captures: post content, media attachments, hashtags, mentions, timestamps, author identity

Examiner-Ready Exports

Compliance officers and examiners need to pull records without a developer. Four report types are available in PDF and CSV — content review, response audit, archival certificate, and activity summary — each formatted for direct submission to bank examiners during CRA and compliance audits.

Content Review report — all outbound posts with compliance status per record
Response Audit report — inbound message thread with SLA, assignment, and resolution status
Archival Certificate — signed attestation of record integrity and completeness
Activity Summary — engagement metrics, follower changes, post performance for board reporting

Social Content Review Workflow

Every outbound post must pass through a compliance review gate before publishing. Drafts, edits, approvals, and rejections are all tracked in the audit trail. No post reaches a social account without an approver's record — and no rejection is unlogged.

All posts require compliance approval before publishing — no exceptions
Full audit trail: draft created, submitted, approved, published, edited post-publish
Rejection requires written reason — approver identity and timestamp captured
Post-publish edits require re-approval before re-publishing

Social Inbox Compliance

Every inbound social message is logged at receipt — customer inquiries, mentions, and DMs. Messages carry SLA timers from arrival, assignment history, and canned response governance. No customer interaction goes unlogged, and no response is sent outside an approved template library.

SLA timers start at message receipt — 4-hour and 24-hour thresholds with escalation alerts
Full assignment history — who claimed a thread, when, and what resolution was reached
Canned response governance — only approved templates can be sent in replies
Inbound DMs, mentions, and comment replies all logged — no gap in customer interaction record

Social Analytics Audit Trail

Engagement metrics, follower changes, reach, and post performance are captured historically — not as point-in-time snapshots. Every metric record carries a timestamp and source attribution, enabling board reports and examiner reviews that show trend, not just current state.

Engagement metrics stored as time-series records — not overwritten snapshots
Follower gain/loss tracked with net change, source attribution, and account health indicators
Post-level performance data retained for CRA board reporting cycles
Full metric history exportable for examiner presentation
Session Security

Session idle timeout and enforcement

Inactive sessions are terminated automatically. The idle timeout is configurable per-organization, enforced server-side regardless of SSO or device trust settings, and includes client-side countdown warnings across all open tabs.

Configurable Per-Org Idle Timeout

Organization administrators select their idle timeout threshold from six options: 5, 10, 15, 30, 60 minutes, or completely disabled. The setting applies to every session in that organization and is enforced on the server — it cannot be bypassed from the client.

Six threshold options: 5, 10, 15, 30, 60 min, or disabled
Per-organization setting — applies to all users in the org
Applies regardless of SSO provider or device trust status

Dual-Layer Enforcement + Multi-Tab Awareness

Activity detection runs client-side across all open tabs — activity in any tab resets the timer for all tabs. Background polling requests are explicitly excluded from activity detection, so API health checks won't artificially extend sessions. Server-side enforcement provides the authoritative session termination layer.

Multi-tab awareness — activity in any tab resets all tab timers
Background polling excluded from activity detection
Server-side enforcement layer — authoritative termination

Warning Modal with Countdown

Before a session expires due to inactivity, users see a countdown warning modal. The modal provides a live countdown and a one-click "Stay Signed In" button, giving users a clear window to extend their session without losing work. All idle timeout events are logged to the audit trail.

Live countdown modal appears before automatic logout
"Stay Signed In" button resets the session timer
All idle timeout events logged to audit trail with actor + timestamp
Integration Security

Outbound webhook integrity controls

Every outbound webhook is cryptographically signed, rate-limited, and timeout-protected. Delivery attempts are retried with exponential backoff and all configuration changes are captured in the audit trail.

HMAC-SHA256 Signature Verification

All outbound webhook payloads are signed with HMAC-SHA256 using a per-webhook secret. Receivers verify the signature on every request — any payload that fails verification is rejected. Secrets are auto-generated at 256 bits, shown once on creation, then stored as a hash.

HMAC-SHA256 per-webhook signing — signature in X-Signature header
256-bit auto-generated secrets — shown once on creation, then hashed
Rejection of unsigned or malformed payloads

SSRF Protection + Rate Limits

Webhook destination URLs are validated before delivery to block Server-Side Request Forgery attacks — internal and private IP ranges (10.x, 172.16.x, 192.168.x, localhost) are rejected. Organizations are capped at 10 webhooks each and 1,000 deliveries per hour across all webhooks.

SSRF blocklist: 10.x, 172.16–31.x, 192.168.x, 127.x, localhost
10 webhooks per organization hard limit
1,000 deliveries per hour per org across all webhooks

Delivery Guarantees + Audit Logging

Webhook delivery attempts timeout after 10 seconds per attempt. Failed deliveries retry with exponential backoff up to a fixed maximum — no infinite retry loops. All webhook CRUD operations and delivery outcomes are recorded in the audit trail.

10-second delivery timeout per attempt
Exponential backoff retry — capped maximum, no infinite loops
All webhook CRUD operations and delivery outcomes audit-logged
Data Export Security

Controlled, logged, and tenant-scoped exports

Data exports are restricted to administrators, rate-limited per organization, and contain only the requesting organization's data. No cross-tenant data can appear in any export.

Admin-Only Export Access

Data export endpoints are gated behind role-based access control — only users with the Admin role can trigger exports. All export operations are written to the audit trail with the actor's identity, timestamp, and the scope of data exported.

Admin role required — no other roles can initiate exports
All exports audit-logged: actor, timestamp, data scope
Rate limited: 5 exports per hour per organization

Organization-Scoped Data Isolation

Export queries are always scoped to the requesting user's organization ID — enforced at the application layer with org_id filtering on every export query. No endpoint can return data belonging to a different organization. Export files contain only the requesting org's records.

org_id enforced on every export query at the application layer
No cross-tenant leakage — export files contain only own org's data
Pentest confirmed: no cross-tenant data leakage in export endpoints
Control Summary

What's implemented, at a glance

Every control below is confirmed in production code — not roadmap items.

SAML 2.0 SSO
Azure AD, Okta, OneLogin, PingFederate, ADFS
OIDC SSO
Authorization Code flow, discovery caching
Enforced SSO
Blocks email/password login when enabled
TOTP MFA
RFC 6238, authenticator app compatible
Backup Codes
10 one-time codes, HMAC-SHA256 hashed
Device Trust
30-day HMAC-signed token, revocable
Account Lockout
5 failed login or MFA attempts → 15-min lockout
JWT Sessions
HMAC-SHA256, httpOnly cookie, 24hr expiry
CSRF Protection
Double-submit cookie, X-CSRF-Token enforced
AES-256-GCM
TOTP secrets, EINs, OAuth tokens encrypted at rest
HSTS
1 year, includeSubDomains, preload
Database SSL
TLS enforced, rejectUnauthorized: true
scrypt Password Hashing
N=16384, unique salt, timing-safe compare
Immutable Audit Log
Insert-only, org-scoped event records
CRA Reporting
Category tagging, exportable, examiner-ready
Census Data Sourcing
Census Bureau + FFIEC API, HTTPS, org-scoped
CRA Classification Audit
Immutable log of all CRA classification changes
Volunteer Data Integrity
Timestamped, audit-logged, exportable
Fair Lending Distribution
Tract demographics mapped to spend, org-scoped
Budget Alerts
75% and 90% threshold notifications
Role-Based Access
Admin, Approver, Manager, User
Multi-Tenant Isolation
org_id enforced at the query layer
Content Security Policy
Strict, no unsafe-inline, frame-ancestors 'none'
Anti-Clickjacking
X-Frame-Options: DENY
Parameterized Queries
SQL injection eliminated at query layer
User Deactivation
Immediate session termination
Google & Microsoft SSO
OAuth 2.0, email-matched account linking
Password Reset
SHA-256 hashed, single-use, 1-hour expiry
JWT Alg Verification
HS256 enforced, rejects alg:none attacks
Rate Limiting
Login, MFA, registration, public forms, all APIs
File Upload Validation
Magic byte verification, not just extension
Secure Download Proxy
Content-Disposition: attachment + nosniff
X-Powered-By Removed
Server stack not exposed in response headers
Security Audit Engine
20+ checks, 5 categories, daily 2am UTC
Security Scorecards
A–F letter grades per tenant
Compliance PDF Export
Examiner-ready per-tenant security report
DLP Findings Tracking
Severity, status, audit-logged dismissal workflow
Access Review Certifications
Admin attestation of user access, exportable
Owner Console Isolation
requireOwner middleware on all owner endpoints
org_id NOT NULL
Schema-level tenant isolation enforcement
Pentest Verified
No cross-tenant data leakage confirmed
Immutable Social Archive
Append-only, SHA-256 integrity, 7-year retention
Examiner-Ready Exports
4 PDF report types for bank examiner review
Social Content Review
Approval gate before publishing, full audit trail
Social Inbox Compliance
SLA timers, assignment history, canned response governance
Social Analytics Audit Trail
Time-series engagement metrics, board reporting ready
Session Idle Timeout
Configurable 5–60 min, dual-layer, multi-tab, audit-logged
Webhook HMAC-SHA256
Signed payloads, 256-bit secrets, hash-stored after display
Webhook SSRF Protection
Internal IP blocklist, 10 webhooks/org, 1000/hr rate limit
Webhook Delivery Guarantees
10s timeout, exponential backoff, no infinite retry loops
Data Export Admin-Only
Admin role gate, 5 exports/hr/org, audit-logged
Export Org-Scoped Isolation
org_id enforced, no cross-tenant data in exports
Subresource Integrity (SRI)
sha384 hashes on all CDN resources (Leaflet, Chart.js)
__Secure- Cookie Prefix
Session and CSRF cookies use __Secure- name prefix in production
Clear-Site-Data on Logout
Cookies and storage cleared on all logout endpoints
Cache-Control: no-store
All /api/* responses marked no-store, private
CSP Violation Reporting
report-to directive + /csp-report endpoint, logged to stdout

Questions for your IT or compliance team?

We're happy to complete your vendor security questionnaire, walk through the architecture with your IT team, or provide documentation for your examiner. Contact us for SOC 2 details or a dedicated security review call.