Portal Development

The Spreadsheet Became Load-Bearing

There is a moment when a process outgrows the tools it started in. The shared sheet nobody dares reorder. The inbox that is really a work queue. The report somebody rebuilds by hand every Monday morning. A portal is what you build at that moment: a real system, with accounts, permissions, a history and an API. We build those.

Built in your accounts. Handed over with the keys and the runbook.

Portals we built and run
  • A multi-tenant cloud fax platform: web portal and REST API, organisation-scoped data isolation, signed webhooks, and per-page billing with downloadable invoices. Its admin view can trace a single fax end to end.
  • An uptime and health monitoring portal: SSO only via SAML 2.0 / OIDC with local login disabled, PostgreSQL-backed history, and Grafana dashboards. Its outage alerts fire on state transitions, not on every failed poll.
  • A document signing platform: multi-tenant and API-first, with a shared component library so the web app and the marketing surface cannot drift apart.
  • A claim-and-redeem gateway that provisions codes against a third-party API at the moment they are claimed, rather than holding stock nobody uses.
Every one of these is a system somebody could take from us tomorrow. That is the design goal, not a concession.
The shape of the thing

Four Jobs A Portal Actually Does

Almost every internal system we are asked for is some combination of these four. Naming them early is what stops a build from turning into a wishlist.

01

A Queue With A State Machine

Work arrives, someone owns it, it moves through defined states, and it cannot skip one by accident. Most "we need a portal" conversations are this, described in other words.

02

A Record With A History

Who changed what, when, and what it was before. Retrofitting an audit trail after an incident is one of the more expensive things a business can be asked to do.

03

A View Someone Opens On Monday

A dashboard that answers a question a person actually has. If nobody would open it unprompted, it is a report, and a report is cheaper than a portal.

04

An API So The Next System Doesn't Need A Person

The portal that only has a UI becomes the bottleneck the spreadsheet used to be. Every portal we build is usable by software from day one.

The unglamorous half

What Gets Left Out Of The Quote

These are the items that decide whether a portal is still trusted in year three. They are also the items most commonly discovered after go-live, when they are far more expensive.

Authentication that survives an audit
SSO through your existing identity provider, either SAML 2.0 or OIDC, with local password login disabled, not merely discouraged. Offboarding a person should end their access everywhere, including here.
Tenancy enforced in the query
Multi-tenant isolation belongs in the data layer, not in whether the UI renders a menu item. A filter applied in the template is not isolation; it is a rendering decision that happens to look like one.
Webhooks that are signed and replayable
We sign payloads with HMAC, so the receiver can verify the sender. A delivery log with replay makes a consumer outage a recoverable event, not silent data loss.
Money, if money is involved
Per-unit pricing, invoices someone can download, and totals that reconcile. Billing bolted on afterwards is where portals acquire their worst bugs, because the numbers were never designed to be re-derived.
An admin view that can trace one record
When a customer says "where did my thing go", somebody needs to answer in minutes from a screen. Not in hours from a log file. We build that screen as part of the system, not as a later favour.
The scheduled work, and its alerting
Every background job inventoried, with staleness alerting stated per job. The characteristic failure of scheduled work is silence, not error. A job that stops running looks exactly like a job with nothing to do.
What we build in

Boring Technology, Chosen On Purpose

We are not attached to a stack, and we will not sell you a rewrite into whatever we most recently enjoyed. This is what we have shipped and currently support. If your team already runs something else well, that is usually the right answer.

LayerWhat we run in production
ApplicationLaravel / PHP, Django / Python, NestJS / TypeScript
InterfaceServer-rendered templates where that is enough; React and React Native Web where a shared component library earns its keep
DataMySQL and PostgreSQL, with migrations that are reviewed like code
IdentitySAML 2.0 and OIDC against your provider; token auth for machine callers
InfrastructureAWS, in your accounts: object storage, queues with a failover path, and provisioning scripts committed alongside the application
ObservabilityGrafana dashboards, Prometheus metrics endpoints, alerting on state transitions
Handover

Built To Be Taken From Us

The question behind most portal procurement is never asked out loud: what happens when these people are gone? It is a fair question and it deserves an artefact rather than a promise.

Every route we had into your estate, listed

Deleting our local configuration is not the same as closing a route. Only removing the authorised key on your side does that. We tell you what to remove, and you confirm it is gone.

Documentation written for someone who wasn't there

Deploy paths, environments, which routes reach which environment, and what a given document is deliberately not about. Written for a reader who had no part in how the engagement ended.

The infrastructure as re-runnable scripts

Not a description of how it was set up. You get the numbered scripts that set it up, committed with the code. The estate can be rebuilt rather than archaeologically reconstructed.

A close-out you can buy on its own

If a previous supplier left badly, this is a fixed-price engagement in its own right. It is also the cheapest way to see how we work before you commit to anything larger.

What we don't sell

The Boundaries, Up Front

No 24/7 operation of your portal
We have never run a paging rota. So we have no response history to show you, and no availability target we have met. Support is working hours, next working day outside them, and that goes in the contract rather than being implied away.
No long-lived production credentials
We do not keep access beyond an engagement. We tell you exactly what to revoke, rather than assuring you it has been handled.
No hosting lock-in
It runs in your cloud accounts under your billing. If you replace us, you replace the people, not the platform.
No delivery-speed percentage
We have not run a controlled before-and-after, so we will not quote one. We would rather show you the system and let you judge the work.
Also from TechJoy

The Rest Of The Stack

Talk to us

Describe The Process, Not The Screens

Tell us what the work is and where it currently lives. The screens fall out of that conversation. Sometimes the honest answer is that you need a report, not a portal.

  • Your cloud accounts, your billing
  • SSO and tenancy designed in, not added
  • Handover packet at the end
  • Infrastructure ships as scripts
  • Wisconsin-based team

Ask About A Portal

We reply within one business day.

No spam. TechJoy will never share your information. We use your phone number only to reply.

The portals described on this page are systems TechJoy built and operates. No client is named. We do not publish improvement percentages we have not measured, and every capability listed here is one you can ask us to show you.