Legacy payroll modernization in the cloud | Intway
Home / Case studies / HR technology · Multi-country platform
Case study

From Internet Explorer to a Latin American cloud payroll platform

We replaced a Visual Basic payroll core and ASP Classic screens with a secure, auditable cloud platform for multi-country payroll operations.

Model Multi-tenant SaaS · Coverage Latin America · Processes Monthly, biweekly and weekly payroll · Channels Web application · APIs · files · Infrastructure Amazon Web Services · Previous system Visual Basic · ASP Classic · Internet Explorer client withheld
HR TECHNOLOGY · MULTI-COUNTRY PLATFORM

FROM INTERNET EXPLORERTO A CLOUD PAYROLLPLATFORM FOR LATIN AMERICA

We modernized a core built in Visual Basic and ASP Classic screens to operate regional payrolls from a secure, auditable and scalable cloud platform.

LEGACY SYSTEM
Microsoft Visual Basic
ASP Classic
e Internet Explorer
CLOUD PAYROLL PLATFORM
Payroll Engine
Rules per
Country
Multi-company
& Validity
Audit &
Traceability
Security
Scalability
GO Go
NestJS
N Next.js
PostgreSQL
aws AWS
Amazon SQS
Multi-country Regional payroll processing
(rules per country, company
and validity)
0% Full traceability by concept
(input, formula, version
and result)
No IE Modern web operation
(Chrome, Edge, Firefox
and Safari)
Is your payroll system still
dependent on legacy technology?
We can modernize it progressively, preserving
your accumulated rules and without
putting future payroll closings at risk.
LET’S TALK

The challenge: a critical system constrained by legacy technology

The platform managed payroll operations distributed across Latin America. Its calculation core had been developed in Visual Basic, while its interfaces relied on ASP Classic. Users needed old Internet Explorer versions or modern browsers running in compatibility mode.

Over the years, the system had accumulated formulas, taxes, labor agreements and country-specific exceptions. That knowledge was essential, but it lived inside a monolithic architecture in which screens, batch jobs and business rules evolved together. A regulatory change could affect multiple components and require extensive manual verification.

Replacing the interface alone would not solve the problem. The program needed to preserve existing payroll behavior, separate calculation from the web experience and migrate without disrupting payroll closing dates that could not be postponed.

The solution: a complete, traceable payroll flow built for regional operations

The flow begins when a payroll analyst signs in from a modern browser and selects the company, country, period and payroll type. The Next.js application adapts available actions to the analyst's role. NestJS receives payroll inputs through files or APIs and validates employees, concepts, formats, periods and duplicates before calculation can begin.

Payroll configuration and input validation screens
Payroll preparationThe analyst uploads payroll inputs and corrects only the records that require attention.

Errors are reported per record, so the user does not need to repeat an entire import. After validation, the platform creates an immutable snapshot of all inputs. A payroll run can therefore be reconstructed even if master data, formulas or regulatory rules change later.

NestJS sends the job to a queue, and the Go engine loads the rule version associated with the country, company and effective date. Calculation is divided into independent units so employees can be processed in parallel. Every run has an idempotency key: retries cannot duplicate movements or generate the same result twice.

When processing finishes, the analyst receives a preview covering earnings, deductions, taxes, employer contributions and net pay. The platform compares results with the previous period and highlights unusual changes or concepts outside expected ranges. From any row, the analyst can inspect the input, formula, rule version and calculated value.

Preliminary payroll results with a traceable salary concept breakdown
Explainable calculationEvery amount retains the rule, input data and sequence that produced the result.

A manual adjustment requires a reason and is linked to the user, date and previous value. A reviewer then resolves exceptions and approves or rejects each change. Once all controls have passed, an authorized user closes the period and the results become locked.

Payroll exception review and closing approval workflow
Controlled review and closingExceptions, approvals and reopenings remain available within one audit trail.

After closing, the platform generates payslips and output files. The operator distributes results to employee portals, accounting systems, banks and regulatory repositories. Each delivery reports its status; if a destination is unavailable, the platform retries without recalculating payroll.

Distribution center for payslips, banking files and integrations
Monitored distributionPayslips, files and webhooks are tracked from closing through delivery.

Platform architecture

Next.js is distributed through CloudFront and protected by AWS WAF. NestJS handles APIs, authorization, validation and process coordination. Go workers execute calculations independently and can scale during payroll closing peaks.

Amazon SQS separates long-running jobs from web interactions. If a user loses connectivity or closes the browser, processing continues in AWS and the application retrieves its state when the user returns. Validations required for the next step run synchronously, while calculations, documents and exports run in the background.

PostgreSQL stores transactional data, while S3 stores versioned files and documents. Tenant context is enforced at both the API and data layers. Encryption, managed secrets, backups and audit records protect sensitive payroll information.

AWS architecture diagram for the payroll platform
Decoupled services on AWSThe web experience, APIs and calculation engine scale independently.

Observability assigns a correlation identifier to every request. A payroll run can be followed across the interface, API, queue, engine and integrations, while alerts report errors, retries and processing-time anomalies.

The implementation: progressive modernization without a disruptive replacement

Migration was organized by capability and country. The team first documented concepts, formulas, dependencies and exceptions in the existing system. Anonymized historical payroll runs became a test library that processed the same data through both the old and new engines.

Results were compared concept by concept before each stage was enabled. New screens initially coexisted with legacy functions through a compatibility layer. Each flow was then transferred to the modern services while a tested fallback remained available during the first closing cycles.

Infrastructure was defined as code, and services gained automated testing and deployment pipelines. The resulting platform preserves accumulated payroll knowledge, removes the Internet Explorer dependency and allows rules, screens and integrations to evolve independently.

GoNestJSNext.jsPostgreSQLAWSAmazon SQS

Frequently asked questions

How can a payroll system be modernized without disrupting closing cycles?

The safest approach is a phased migration with both systems running in parallel. Each country or company group is enabled after comparing results and preserving a tested fallback route.

Can a Visual Basic payroll core be migrated to Go?

Yes. The first step is to identify accumulated rules and exceptions. They are then implemented in a decoupled engine and validated against historical cases before the previous processing system is retired.

How can ASP Classic screens be replaced?

Functions can move progressively to Next.js. An API layer allows modern screens to coexist temporarily with legacy components, avoiding a disruptive all-at-once replacement.

Why separate the payroll engine from the web application?

Separation allows calculation capacity to scale during closing peaks, lets teams improve the interface without changing formulas and makes the same capabilities available to other channels through APIs.

How does the platform manage rules for different countries?

Rules are versioned by country, company and effective date. Every payroll run retains the version it used, allowing previous periods to be reconstructed while new regulatory changes are introduced safely.

How do you verify that the new engine calculates payroll correctly?

The legacy and modern engines process the same anonymized historical cases. Earnings, deductions, taxes and rounding results are compared concept by concept before the new version is enabled.

Why you will not see the client name

We work under non-disclosure agreements: we do not publish company names, commercial data, or technical details that could compromise our clients' operations. The metrics in this case study are real and validated with them. Need more detail to evaluate us? We can expand on it under NDA.

Request more information