Custom .NET applications and Node.js backends
We build the backend of your application, where the business rules, permissions and data live, in .NET or Node.js with a PostgreSQL database. Offer Exchange and Service Quotes, two platforms we built, run on .NET. We choose Node.js with TypeScript when the whole application should share one language or run in cloud functions.
When the backend matters most
-
Many roles and permissions in one system
Clients, staff, managers and administrators see different data and perform different operations. The backend checks permissions on every request, whatever the interface shows.
-
Rules that affect billing
Quotes, discounts, subscription limits and licence validity must always be calculated the same way. We keep such rules in the backend and cover them with automated tests.
-
Data that has to feed reports
A relational PostgreSQL database keeps orders, clients and payments consistent. Management reports come from the same data, with no exports needed.
-
Other software uses your data
Our REST APIs come with documentation, versioning and access control. External applications use the data without knowing how the system is built inside.
.NET or Node.js
We recommend .NET for systems where most of the work lies in the logic: quotes, orders, permissions for many roles, billing. It is also a good choice when your company already runs other .NET applications or plans to host the system on Microsoft Azure. We recommend Node.js when one team will develop both the Next.js interface and the backend, and for backends running in cloud functions.
Sometimes no separate backend is needed at all. For a simple application with a few forms, Next.js can handle the server-side logic on its own. When your team works in another language, such as Java or PHP, we tell you whether we should take over that code or whether it is better left with the team that knows it.
How we build backends
The backend exposes a REST API to the interface, described in OpenAPI. Every request goes through identity and permission checks before it reaches the business rules. Data is stored in PostgreSQL through a data access layer, and every change to the database structure is saved as a migration in the repository. Longer tasks, such as sending notifications or generating documents, go to a queue, so users do not have to wait for them to finish.
Other software can use an API built this way too. How we connect applications with invoicing, CRM and payment systems is explained on our system integration page. What a business gains from a system built around its own process is covered on our custom web applications page.
What we do
- Data model and relations in a PostgreSQL database
- Backends in ASP.NET Core with Entity Framework Core
- Backends and cloud functions in Node.js and TypeScript
- REST APIs (application programming interfaces) with OpenAPI documentation and access control
- Sign-in, roles and permissions checked on the server side
- Automated tests for business rules and APIs
- Database migrations planned so the application keeps running
Who it is for
- You are planning a system with many user roles and business rules
- Your application needs to share data with other software through an API
- You have a .NET application and need a team to take over its development
- You want the interface and the backend written in one language, TypeScript
.NET for systems with complex logic
We choose ASP.NET Core for systems with many rules and roles. The Offer Exchange platform handles requests for quotation, offer comparisons, orders and subscriptions. Service Quotes takes an order through staff assignment, the itemised bill and online payment. In both systems the .NET backend enforces permissions and rules, while the Next.js interface presents the results. Strong typing in C# and automated tests catch cases where a change in one module breaks another.
- .NET backend in Offer Exchange and Service Quotes
- Entity Framework Core with database migrations in the repository
- .NET performance under a high volume of requests
Node.js and TypeScript across the whole application
When the interface is built in Next.js, a Node.js backend lets you write the whole application in TypeScript and share data types between both parts. Node.js also suits cloud functions, which start quickly and handle single tasks. We built one such AWS Lambda function in Node.js and TypeScript to handle the forms on the new Conetso websites.
- Shared data types for interface and backend
- Cloud functions with short startup times
- One team developing the whole application
PostgreSQL as the data foundation
All our projects store data in PostgreSQL. The database enforces relations and transactions, so an order cannot be saved without a client, nor a payment without an order. It also handles JSON data and full-text search, so many projects need no separate database. PostgreSQL is available as a managed service in every major cloud, so it does not tie your application to a single provider.
- Transactions and relations that protect data consistency
- JSON data and full-text search in one database
- Managed service on AWS, Azure and Google Cloud
How we work
-
Data model
We map out the data, relations and user roles, and agree which business rules the backend should enforce.
-
API design
API endpoints are described in OpenAPI before any code is written, so the interface and the backend can be built in parallel.
-
Development and testing
We build the backend and cover the billing and permission rules with automated tests.
-
Deployment and migrations
The backend is deployed in a container, and every database change goes through a migration stored in the repository.
Experience
- We built the backends of the Offer Exchange and Service Quotes platforms in .NET Core with a PostgreSQL database.
- We built the INVENTA Licenses system, with a REST API for VR applications, in TypeScript with a PostgreSQL database.
- The forms on the new Conetso websites are handled by an AWS Lambda function in Node.js and TypeScript.
Case studies
-
Offer Exchange
A SaaS platform for business purchasing: requests for quotation, quote comparison and orders, with a free plan and paid subscription plans.
-
Service Quotes
An application for a service company with business clients. It handles orders, staff assignment, itemised billing for completed jobs and online payment.
-
INVENTA Licenses
A system for managing users and licences for VR applications used in staff training, with portals for clients, distributors and administrators.
Frequently asked questions
.NET or Node.js?
We choose .NET for systems with complex business logic and many roles that will be developed for years, and for applications running on Microsoft Azure. We choose Node.js when the whole application should be written in TypeScript or the backend should run in cloud functions. For many projects either would work, and we make the decision together during the consultation.
Will you take over an application written in an older version of .NET?
Yes. After a code review, we estimate how much work it takes to move the application from .NET Framework to the current version of .NET. We usually suggest migrating in stages, module by module, so the application keeps running throughout.
Why PostgreSQL and not another database?
PostgreSQL is free, needs no licence and is available as a managed service in every major cloud. It supports relations, transactions, JSON data and full-text search. We suggest a different database when an existing system or the way the data is used calls for it, for example DynamoDB in serverless applications.
See also
-
Custom web applications for businesses
We build systems for handling orders, quotes and purchases, with separate portals for clients, staff and managers.
-
System integration and process automation
We connect CRMs, invoicing, online payments and industry systems, so nobody has to retype data by hand.