Skip to content
Travel and immigration · Platform

UAE visa application platform

Four UAE visa brands run on one codebase. Each has its own domain, branding, pricing and content, but shares the application funnel, the customer account area and the admin back office. A traveller selects their nationality and permit type, uploads documents for every applicant, pays by card and tracks the application by reference. Staff work the queue from an admin console that also owns pricing, country content and the blog.
DeliveredNext.js 16React 19TypeScript
4
brands on one codebase
3
admin role types
10
content collections per brand

Launch state varies by brand. Figures were counted from the codebase.

The problem

Running four visa brands as four separate websites means fixing every bug four times. Running them as one product with four skins means a pricing rule or a funnel fix ships everywhere at once.

What was built

The working parts

Each of these exists in the delivered system, not on a roadmap.

01

Multi-step application funnel

Plan selection, then applicant details with per-person document upload, then review and pay. The document step carries the weight, because a visa application is only as good as the files attached to it.

02

Card payment confirmed by webhook

An application is marked paid by the payment provider's webhook rather than by the browser returning to a success page, so a closed tab cannot lose a paid order.

03

Public tracking by reference

Applicants check progress with a tracking ID and no account, which removes most of the status emails.

04

Customer account area

Application history, saved family members for repeat applications, and profile and password management.

05

Role-scoped admin console

Super admin, editor and operations roles see different sections, so a content editor cannot touch applications.

06

Country pricing and content as data

Per-country pricing, packages and guide content live in the database with an import path, so a price change is an admin edit rather than a deploy.

07

Content and SEO back office

A rich-text blog editor, per-page metadata overrides and structured data, run by the client without developer involvement.

08

Transactional email

A templated email library covering application status changes and automated follow-ups.

09

Messy real-world pricing, normalised

Package titles arrive as free text such as a 96-hour transit permit or a two-year freelance permit. A normalisation layer buckets them so the site can show a reliable starting price.

Screens

Where people actually work.

  • 01Home with nationality and permit search
  • 02Country and permit detail
  • 03Application funnel across three steps
  • 04Payment and confirmation
  • 05Tracking by reference
  • 06Customer account and family members
  • 07Admin applications queue
  • 08Country pricing and content editor
  • 09Blog editor and SEO settings
Stack
Next.js 16React 19TypeScriptTailwind CSS 4Firebase AuthFirestoreFirebase StorageStripeNodemailer
Integrations
  • Stripe payments with webhook confirmation
  • Firebase Auth, Firestore and Storage
  • SMTP transactional email
  • Google reCAPTCHA
  • GA4 purchase tracking
Design decisions

The calls that matter later.

The choices that separate software people tolerate from software they rely on.

01

One product, four skins

The brands are forks of a shared application rather than separate builds. A funnel improvement or a payment fix reaches every brand, and the differences stay in configuration, branding and content.

02

Payment state owned by the webhook

The browser is never the source of truth for whether money arrived. The provider's webhook marks the application paid, so a dropped connection after payment does not strand an order.

Want one built around your operation?

Discovery takes one to two weeks and produces a process map, wireframes and a fixed quote. Useful documents even if you take them somewhere else.

We reply to every enquiry within one business day.