Expertise Vercel / Supabase

Your website can be part of the way your business works.

A catalogue fed by your shared data. An enquiry that reaches the right workflow. A back office your team can run. We help you put those pieces together.

Four years building and evolving tools inside an employment and education group. That experience belongs to Julien Cyr, Ownward’s founder, and informs these anonymised cases: one business environment, several connected products.

Give each tool a clear job

One foundation. More possibilities. Shared data · Team workspace · Connected site

Airtable remains useful for the people maintaining the offer. Supabase provides PostgreSQL, authentication and storage. Next.js on Vercel builds the public or signed-in experience around that data.

We define which system owns each field, what is published and who maintains it. A web-facing copy has a clear purpose; it is not another reference for people to maintain by hand.

How we organise the code · monorepo

Several applications. One shared foundation.

A monorepo keeps the code for related applications in one versioned repository. The website, back office and client portal can share their design system and business contracts while remaining separately deployed applications.

  • Public website
  • Back office
  • Client portal
  • App hub

Shared packages: brand · components · types · data-access helpers

Consistency you can see

At Ownward, the same palette, Source Sans 3 fonts and logo components now serve all four spaces. A brand change has one source, then each application is rebuilt and checked.

Changes you can follow

pnpm workspaces connect the packages; Turborepo coordinates dependent tasks and caches eligible build work. Related changes, documentation and agent instructions stay reviewable together.

Each application keeps its boundaries

Each app has its own Vercel project and release. Shared code does not grant shared access: sessions, permissions, secrets and tenant isolation still require explicit controls.

Useful when several products evolve together. We define package ownership and compatibility before sharing code. A code rollback does not restore database state.

Monorepos on Vercel

From data to product

A website that works with the rest of your tools.

Explore the connected catalogue, enquiry capture and publishing across websites.

Shared data & publishing

From Airtable reference to a living website catalogue.

It started with…

Communications needs to publish a searchable catalogue and programme pages from the business reference, while retaining control over what visitors can see.

So we built…

A Supabase publishing copy and a Next.js website on Vercel. Selected source fields feed the catalogue; editorial statuses, persisted media and public queries shape the visitor experience.

Technologies & official documentation

One reference, several uses
  1. Airtable

    Maintain

    Business model and relationships

  2. Supabase

    Prepare for publishing

    Selected fields, statuses and media

  3. Vercel

    Serve the website

    Next.js reads the publishable catalogue

This documented flow uses a dedicated synchronisation engine. Zapier can coordinate other events; it does not replace that engine in this case.

Take a look inside

Screen 1 of 2

2. Explore the public catalogue

2. Explore the public catalogue

The website offers search and filters over the synchronised reference.

What we set out to change

Keep the public offer current while giving communications an explicit publication decision.

How it is builtData model, code, controls and team ownership

The user journey

  1. 01

    Synchronise selected source fields into the publishing copy.

  2. 02

    Review editorial content and approve publication.

  3. 03

    Serve the searchable catalogue and linked programme pages.

Data and hand-off structure

Entity / tableKey fieldsRelationships
Web catalogueairtable_id · status · slugSupabase publishing copy
Versions & sync runsState · log · versionPublishing history

Technical implementation

  • Fields are mapped explicitly; records are upserted by stable airtable_id.
  • Required website assets are persisted to Storage instead of relying on temporary attachment URLs.
  • New content starts as draft. Disappearing records are marked, with a check on large catalogue changes.

Engineering decision

Keep repeatable writes bounded and publication decisions separate

Adapted from the catalogue’s chunked upsert and source-owned field mapping. Stable Airtable IDs match existing rows; editorial publication fields are omitted. Errors stop later chunks and propagate to the run report. Already committed chunks remain committed; repeating the same mapping can converge again, but this is not an all-or-nothing catalogue transaction.

TypeScriptcatalogue-upsert.ts29 lines
import type { SupabaseClient } from "@supabase/supabase-js";type Programme = {  sourceId: string; name: string; slug: string;};export async function syncProgrammes(db: SupabaseClient, source: Programme[]) {  // Only source-owned fields belong in this mapping.  // is_published, editorial content and SEO overrides stay out.  const rows = source.map(row => ({    airtable_id: row.sourceId,    name: row.name,    slug: row.slug,  }));  let written = 0;  for (let offset = 0; offset < rows.length; offset += 500) {    const chunk = rows.slice(offset, offset + 500);    const { error, count } = await db.from("programmes").upsert(chunk, {      onConflict: "airtable_id", count: "exact",    });    if (error) {      throw new Error(`Catalogue sync stopped after ${written} rows`);    }    written += count ?? chunk.length;  }  return { written };}// Database prerequisites: unique airtable_id, new rows default to draft.// Validate slugs and resolve collisions before this writer runs.

Adapted implementation excerpt

Keep repeatable writes bounded and publication decisions separate

Controls and boundaries

  • The browser receives no Airtable token or privileged Supabase key.
  • Internal fields and staff data are outside the public catalogue.
  • Synchronisation is not publication: permissions, statuses and publishing filters have distinct roles.

Who can contribute

  • Operations: maintain programmes, campuses and Airtable links.
  • Communications: enrich and approve publication in the web back office.
  • Developers: evolve mappings, checks and versioned components.

What supports this case

Synchronisation source and publishing model reviewed; the public catalogue and programme page were opened. Screenshots show the actual journey with brands masked.

Working with Ownward

Built together. Then yours to grow.

Your team should be able to handle everyday changes. And know who to call when a problem needs deeper technical expertise.

  1. 01

    Start with the work

    We define the need, each tool’s responsibility and a first version that can be verified, then build the workflow with the team.

  2. 02

    Learn on your own tools

    Your team learns on the delivered product: configuration, monitoring, diagnosis and everyday changes, with the documentation and repository at hand.

  3. 03

    Go further, with support

    Citizen developers, developers and colleagues coding with Claude can contribute to the same documented model. We support complex integrations, code reviews and technical escalation as your needs evolve.

The details that make a delivery useful

The tool, and what your team needs to own it.

Our Ownward delivery standard: guidance stays inside the product, knowledge stays with the code, and coding agents have the context to contribute.

  • An onboarding wizard you can always reopen

    A guided path through roles, essential setup and the first useful action. It remains available from Help, including when a new colleague joins.

  • Documentation in the delivery repository

    Getting started, data model, configuration, integrations, tests, release and rollback: the explanations evolve with the product version. Secrets stay outside the repository.

  • Instructions for coding agents

    AGENTS.md and, where useful, CLAUDE.md describe the architecture, conventions, checks and change rules. An agent extends the shared model; the team retains review and release decisions.

See guided onboarding in a real interface
Deployment, access and product evolution

Previews let teams review a change before release. PostgreSQL policies and application permissions enforce access, with privileged keys kept on the server. Checks need to cover denied access as well as allowed access.

Returning to a previous Vercel deployment does not restore the database. Migration compatibility, backups and recovery need their own plan.

Which part of your work could be easier?

Bring the process, the friction or the idea. We can start there.

Talk about your project