Engineering hubs in Dehradun & Bengaluru · Delivering across 10 countries

nitesh@redcubical.com +91 90687 14658

REDCUBICALSYSTEMS

Services / Build

Enterprise web applications that pass procurement

We build multi-tenant web platforms with the controls enterprise buyers actually verify: SAML 2.0 and OIDC single sign-on, SCIM provisioning, RBAC and ABAC authorisation, immutable audit logging, WCAG 2.2 AA accessibility and measured Core Web Vitals budgets. These are engineered from the first increment, because retrofitting tenancy or an audit trail costs several times what building it in does.

  • Tenancy model chosen deliberately and documented, not defaulted into
  • Append-only audit log with hash chaining for tamper evidence
  • Accessibility gate in the pipeline, plus manual screen reader testing
  • Performance budgets measured on real user traffic, not lab runs

At a glance

Tenancy models
Silo, pool and bridge, chosen per platform
Identity standards
SAML 2.0, OIDC, SCIM 2.0, OAuth 2.1
Accessibility target
WCAG 2.2 level AA
Core Web Vitals
LCP < 2.5s, INP < 200ms, CLS < 0.1 at p75
Availability target
99.95% on supported architectures
Browser policy
Latest two versions plus 0.5 percent usage floor

Architecture

Which multi-tenancy model should you choose?

This is the decision that is hardest to reverse. Everything else on this page can be added later at reasonable cost. Tenancy cannot.

Silo vs pool vs bridge

Default to pool tenancy: one database, every table scoped by tenant identifier, isolation enforced in the data layer. Choose silo — a database or cloud account per tenant — when a contract requires physical separation or one tenant would distort capacity for the rest. Bridge, shared infrastructure with a schema per tenant, sits between them and carries the migration overhead of silo with less of the isolation benefit.

Multi-tenancy trade-offs
DimensionSilo (database or account per tenant)Pool (shared, tenant-scoped rows)Bridge (shared database, schema per tenant)
Isolation strengthStrongest. Separate credentials and blast radius per tenantLogical only. Depends entirely on correct query scopingStrong logical separation, shared engine and shared failure domain
Infrastructure cost per tenantHighest. Each tenant carries its own baselineLowest. Idle tenants cost close to nothingModerate. One engine, many schemas
Schema migration effortRuns N times. Needs orchestration and partial-failure handlingSingle pass across the whole platformRuns N times but within one engine and one connection pool
Noisy neighbour riskNone between tenantsReal. Needs per-tenant rate limits and query governanceReduced but not eliminated. Shared CPU, memory and I/O
Per-tenant restoreTrivial. Restore one databaseHard. Requires logical extract and selective replayModerate. Schema-level restore is workable
Per-tenant data residencyNatural fit. Place the tenant in its own regionNot possible without a second deploymentOnly at the deployment level, not per schema
Scale ceilingOperationally painful beyond roughly 200 tenantsThousands of tenants; sharded further when neededConnection and catalogue limits bite around 500 schemas
Best fitRegulated sectors, large enterprise accounts, government contractsSelf-serve and mid-market B2B SaaS, internal platformsMid-market where tenants demand separation without silo economics

Most platforms end up hybrid: pool for the long tail, silo for the two or three accounts whose contracts demand it. Design the abstraction on day one so a tenant can be promoted from pool to silo without an application rewrite. Retrofitting that promotion path is a multi-month project.

Identity

Single sign-on, provisioning and authorisation

Three separate problems that get conflated. Authentication proves who the user is. Provisioning keeps the account list correct. Authorisation decides what they may do.

How enterprise identity fits together

We implement SAML 2.0 and OIDC for authentication, SCIM 2.0 for automated provisioning and deprovisioning, and a layered authorisation model: RBAC for coarse capability and ABAC for contextual limits such as region, business unit, record ownership or data classification. Roles alone cannot express "only claims under 50,000 in their own branch", which is why almost every enterprise platform needs both.

Authentication

SAML 2.0

Still the most requested standard in enterprise procurement, particularly with Entra ID, Okta and Ping deployments that predate OIDC rollout.

  • Service-provider and identity-provider initiated flows
  • Signed assertions, optional encrypted assertions
  • Per-tenant metadata and certificate rotation with overlap windows
  • Just-in-time account creation with attribute mapping
  • Single logout where the identity provider supports it

Authentication

OIDC and OAuth 2.1

Preferred for new integrations, mobile clients and machine-to-machine access. Cleaner token handling and far easier to debug than SAML.

  • Authorisation code flow with PKCE for all interactive clients
  • Refresh token rotation with reuse detection
  • Client credentials flow for service accounts
  • Per-tenant issuer discovery and JWKS key caching
  • Short-lived access tokens, typically 15 minutes

Provisioning

SCIM 2.0

The difference between a leaver losing access in seconds and a dormant active account discovered at the next audit.

  • Users and Groups endpoints with PATCH semantics
  • Group-to-role mapping maintained per tenant
  • Soft deactivation preserving audit history
  • Bulk import for onboarding, with rate limiting
  • Reconciliation report highlighting drift against the identity provider

Authorisation

RBAC plus ABAC

Policy evaluated centrally and consistently, never scattered through controllers as ad-hoc conditionals.

  • Role hierarchies with explicit permission grants
  • Attribute policies on region, unit, ownership and classification
  • Deny-by-default with allow rules only
  • Policy decisions logged with the inputs that produced them
  • Tests that assert both the allow and the deny path for every role

Auditability

Immutable audit logging that satisfies an auditor

What makes an audit log defensible

An audit log is not application logging. It is an append-only record of who did what to which entity, when, from where, and what the values were before and after. We write it in the same database transaction as the change so it cannot silently diverge, hash-chain each entry to the previous one so tampering is detectable, and ship it to write-once storage with an object-lock retention period.

What every entry records

  • Actor. User or service identity, tenant, authentication method, whether the session was an administrative impersonation.
  • Action and target. Verb, entity type, entity identifier, and a stable correlation identifier linking every entry in one request.
  • Before and after. Field-level values with sensitive fields redacted or tokenised. "Record updated" with no values is not an audit trail.
  • Context. Timestamp in UTC to millisecond precision, source IP, user agent, and the API or interface path used.
  • Integrity. Hash of the previous entry, making gaps and edits detectable on verification.

Design rules we hold to

  • No UPDATE and no DELETE. Application credentials hold INSERT and SELECT only on audit tables. Corrections are new entries.
  • Same transaction as the change. Asynchronous audit writes drop entries under load, exactly when you most need them.
  • Retention as a policy, not a habit. Typically seven years for financial and healthcare workloads, held on object storage with a lock so nobody can shorten it quietly.
  • Readable by non-engineers. A filterable interface for compliance staff, plus CSV and JSON export. An audit trail only reachable by SQL will not be used.
  • Personal data handled properly. Erasure requests are met by crypto-shredding tokenised fields, which preserves the integrity chain while removing the personal data.

Performance

Performance budgets, measured on real traffic

A budget only works if it fails a build. Ours are enforced in the pipeline against synthetic runs and monitored continuously against real user data.

Performance budgets for enterprise web applications
MetricTargetPipeline fails aboveMeasured how
Largest Contentful Paint (LCP)Under 2.5 s at p752.9 sReal user monitoring plus Lighthouse CI on key routes
Interaction to Next Paint (INP)Under 200 ms at p75260 msReal user monitoring, field data only
Cumulative Layout Shift (CLS)Under 0.1 at p750.15Real user monitoring plus synthetic checks
Time to First ByteUnder 600 ms at p75800 msCDN and origin logs
JavaScript transferred, initial routeUnder 200 kB compressed260 kBBundle analysis as a pipeline step
Server response, p95 read APIUnder 300 ms450 msApplication performance monitoring traces
Server response, p95 write APIUnder 700 ms1,000 msApplication performance monitoring traces
Search or list query, p95Under 1.2 s at 1 million rows2 sLoad test against production-shaped dataset
Report generation, synchronousUnder 8 s or made asynchronousAnything over 10 sLoad test plus production timing histogram

p75 and p95 rather than averages, because averages hide the experience of the users who complain. Budgets are set per route: a dense operational grid is not held to the same payload budget as a marketing page.

Scale

Reporting and export at scale

How we keep reporting off the critical path

Operational and analytical reads are separated. Interactive reports hit a read replica or pre-aggregated summary tables. Exports above roughly ten thousand rows become asynchronous jobs that stream to object storage and hand the user a signed, expiring download link. Nothing that can grow unboundedly runs inside a request-response cycle.

  • Read replicas for interactive reporting so a heavy query cannot slow the transactional write path
  • Pre-aggregated summary tables refreshed on a schedule for dashboard tiles that would otherwise scan millions of rows
  • Cursor pagination rather than OFFSET, which degrades badly past a few thousand pages
  • Asynchronous export jobs writing directly to object storage, with progress visible to the user
  • Signed download URLs with short expiry and per-tenant access checks re-evaluated at download time
  • Streaming generation for CSV and XLSX so memory use stays flat regardless of row count
  • Per-tenant concurrency and row-count limits so one tenant cannot exhaust the export workers
  • Scheduled report delivery by email or SFTP, which is still what finance teams ask for
  • Every export written to the audit log, because bulk personal-data extraction is exactly what auditors look for

Reach

Accessibility, internationalisation and browser support

WCAG 2.2 AA

Conformance is engineered, not audited in at the end. Retrofitting accessibility into a component library after launch typically costs three to five times more than building it accessibly.

  • Accessible primitives for dialogs, menus, tabs, combo boxes and grids
  • Keyboard operability for every interaction, including drag alternatives
  • Visible focus indicators meeting the 2.2 focus appearance criterion
  • Target size, dragging movements and consistent help criteria new in 2.2
  • axe-core as a pipeline gate on every route
  • Manual NVDA and VoiceOver passes each release

Automated tooling detects roughly a third of WCAG failures. Full validation requires manual testing with assistive technologies and expert accessibility review, which we scope separately.

Internationalisation

Cheap if designed in, expensive if bolted on. We externalise strings from the first increment even when only English is required at launch.

  • ICU message format for plurals, gender and interpolation
  • No string concatenation anywhere in the interface
  • Locale-aware dates, numbers, currency and collation
  • UTC storage, per-user display time zone
  • Right-to-left layout support with logical CSS properties
  • Layouts tested at 35 percent text expansion for German
  • Translator workflow with context notes and screenshots

Currency is a business rule, not a formatting concern. Multi-currency needs a decision on rate source, rounding and the rate date before any code is written.

Browser support policy

Stated in the contract so it is never an argument later.

  • Chrome, Edge, Firefox and Safari: latest two stable versions
  • Any browser above 0.5 percent of your measured traffic
  • iOS Safari and Android Chrome: latest two versions
  • Progressive enhancement so core reads work without modern APIs
  • Internet Explorer is not supported

Where an internal user base is pinned to an older browser by policy we will support it, but we price it. Older engines mean transpilation, polyfills and a separate test matrix, typically adding eight to fifteen percent to front-end effort.

Answers

Enterprise web application questions

What makes a web application "enterprise" rather than just large?

Not user count. It is the set of things enterprise procurement verifies before signing: single sign-on against their identity provider, automated user provisioning and deprovisioning, role and attribute-based authorisation, an audit trail an auditor accepts, accessibility conformance, documented data residency, and a support agreement with response targets. An application can serve fifty users and be genuinely enterprise-grade, or fifty thousand and fail every one of those checks.

Which multi-tenancy model should we choose?

Pool tenancy — shared database with tenant-scoped rows — is the default because it keeps per-tenant cost lowest and schema migrations single-pass. Move to silo, one database or account per tenant, where a contract or regulator demands physical separation, or where one tenant is large enough to distort capacity for everyone else. Bridge, shared infrastructure with separate schemas, is the middle ground and the hardest to reverse later.

Do you support SAML 2.0 as well as OIDC?

Both, and enterprise buyers still ask for SAML 2.0 more often than OIDC. We implement service-provider-initiated and identity-provider-initiated SAML flows with signed assertions, per-tenant certificate rotation, and metadata exchange. OIDC is used for newer identity providers and for our own first-party clients. Applications are built so a tenant can be moved between the two without a data migration.

What is SCIM and do we need it?

SCIM 2.0 is the standard protocol identity providers use to create, update and deactivate accounts in your application automatically. You need it when tenants have more than roughly two hundred users or a compliance requirement that leavers lose access within a fixed window. Without SCIM, deprovisioning depends on somebody remembering, and dormant active accounts are one of the most common audit findings.

How do you meet WCAG 2.2 AA?

Accessible component primitives from the start, automated axe-core checks as a pipeline gate, and manual keyboard and screen reader testing with NVDA and VoiceOver each release. Automated tooling catches roughly a third of WCAG failures, so manual testing is not optional. Full conformance verification requires review by an accessibility specialist and testing with assistive technology users, which we scope as a separate audit.

What performance targets do you build to?

Largest Contentful Paint under 2.5 seconds, Interaction to Next Paint under 200 milliseconds, and Cumulative Layout Shift under 0.1, measured at the 75th percentile of real user traffic rather than in a lab. We also budget JavaScript payload and server response time, because those are the levers engineers can actually pull during a sprint.

Can the application run in a specific country or region?

Yes. We deploy into the AWS, Azure or Google Cloud region you require and keep primary data, backups and logs inside it. Where a tenant needs a dedicated region we use the silo model for that tenant only rather than fragmenting the whole platform. Be aware that region pinning limits which managed services and AI models are available, and we document those gaps before you commit.

How do you handle reporting on large datasets without slowing the application?

Operational reads and analytical reads are separated. Interactive reports run against a read replica or a pre-aggregated summary table refreshed on a schedule. Anything larger than a few thousand rows becomes an asynchronous job that streams to object storage and notifies the user with a signed download link. Synchronous export of large result sets is the single most common cause of production timeouts we are called in to fix.

Bring us the procurement checklist

Send the security questionnaire, the accessibility clause and the identity requirements from your largest prospect. We will tell you which items your current platform already satisfies and what the gaps cost to close.