← All work

LinkZae · Digital business card platform

One codebase, a separate site for every tenant

Digital business cards and link pages, each customer served from their own subdomain resolved before the page renders, with one QR code per card.

Still from the animation built from LinkZae's own interface, as shown on its site: a digital business card designed, its QR code printed and the contact saved
0deployments to add a customer
1QR code per card, unchanged by edits
5interface languages

Problem

A business card or link page is a commodity until it has to carry a brand: a customer's own subdomain, their own design, and a printed QR code that has to keep working after every edit. Doing that naively means one deployment per customer, which does not scale past a handful.

Constraint

Subdomain resolution happens on every single request, before anything renders. It has to be fast, and it cannot leak: one tenant must never be able to read another's pages, even by guessing an ID.

Approach

Tenant lookup runs at the edge in middleware, backed by a small in-memory cache so most requests never touch the database. Isolation is enforced in Postgres with row-level security on every table rather than in application code, and the privileged service key stays inside a narrow server-side boundary. QR codes are rendered server-side, one per card, and point to an address that does not change when the card is edited.

Result

A live multi-tenant platform where onboarding a customer means creating a row, not a deployment. It has grown well past its first version and I have been carrying it forward since.

With thanks to the friend who started this with me and helped get the first version off the ground.

Request to tenant subdomain → Edge middleware · cached lookup → Row-level security in Postgres → Branded card + QR → New customer = one row, not one deployment

How it works

Screens from LinkZae's own site, following one card from design to scan and on to its analytics and team. Scroll, and each one zooms in on the part the text describes.

  1. linkzae.com01 / 07
    The LinkZae home page: the headline Don't lose the people you meet, and a sample business card with a QR code.

    The LinkZae home page: the headline Don't lose the people you meet, and a sample business card with a QR code.

    01 / 07

    One card, one link, one QR

    Digital business cards and link pages. Each customer is served from their own subdomain, resolved at the edge before the page renders.

  2. linkzae.com02 / 07
    A Design Studio panel with template, color and typography options beside a phone showing a green sample card.

    A Design Studio panel with template, color and typography options beside a phone showing a green sample card.

    02 / 07

    Design it in the studio

    Choose a template, an accent color and a typeface, and the phone preview follows.

  3. linkzae.com03 / 07
    A printed business card with a QR code and a short linkzae.com address, stamped Ready to print.

    A printed business card with a QR code and a short linkzae.com address, stamped Ready to print.

    03 / 07

    One QR code per card

    The QR code is rendered on the server, one per card, ready to print. It points to an address that does not change when the card is edited.

  4. linkzae.com04 / 07
    A printed card beside a phone showing the card's page and an Added to contacts confirmation.

    A printed card beside a phone showing the card's page and an Added to contacts confirmation.

    04 / 07

    Scan, then save the contact

    Scanning the card opens its page in the phone's browser, and one tap saves the person to the phone's contacts, with no app or account. A LinkZae user can also keep the card in their own contact book with a note.

  5. linkzae.com05 / 07
    A printed card marked Same QR next to a phone whose phone number is struck through and replaced, tagged Updated.

    A printed card marked Same QR next to a phone whose phone number is struck through and replaced, tagged Updated.

    05 / 07

    Edit the card, keep the QR

    Change a number and the page updates. The printed QR still works, because its address never changes.

  6. linkzae.com06 / 07
    A Scan analytics panel labelled Sample with total scans, today and this week, a bar chart of the last thirty days and scans by country.

    A Scan analytics panel labelled Sample with total scans, today and this week, a bar chart of the last thirty days and scans by country.

    06 / 07

    Scan analytics at a glance

    Total scans, scans today and this week, a thirty-day chart and a breakdown by country. The numbers in this frame are sample data.

  7. linkzae.com07 / 07
    A Team panel with an invite field, a pending invite with a Copy invite link action, and a members list with an owner and two members.

    A Team panel with an invite field, a pending invite with a Copy invite link action, and a members list with an owner and two members.

    07 / 07

    A team on one account

    On the Team plan, invite teammates by email, track pending invites and see the owner and members in one list. Row-level security in Postgres keeps one customer's data away from another's.

Edge middlewareMulti-tenant architectureRow-level securityNext.js monorepo

Need something like this?

Send two or three lines: what you have, what is broken or missing, and when you need it. I reply within 12 hours, Monday to Saturday.