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.

Capture & integration

Save the enquiry before handing it on.

It started with…

A visitor submits an enquiry. An unavailable downstream service should not erase it or force the visitor to start again.

So we built…

An enquiry saved in Supabase, followed by an HTTP notification with a stable shape for a CRM or orchestrator. The submission and its delivery are separate responsibilities.

Technologies & official documentation

Capture, deliver, act
  1. Vercel

    Form

    Server-side validation

  2. Supabase

    Saved enquiry

    The enquiry survives downstream failure

  3. Zapier

    Possible hand-off

    Qualification and routing to CRM

Capture and the webhook are documented; the Zapier hand-off is an integration option to validate against the actual Zap.

What we set out to change

Retain a reliable record of the enquiry and let the business follow its handling.

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

The user journey

  1. 01

    Validate fields and save the submission.

  2. 02

    Notify the configured destination with the form context.

  3. 03

    Track delivery and business handling separately.

Data and hand-off structure

Entity / tableKey fieldsRelationships
Form configurationsType · validation · destinationDefine the submitted payload
SubmissionsForm · fields · received timeRetain the original enquiry
CRM / delivery referenceSubmission key · destination · outcomeProposed operational follow-up

Technical implementation

  • The reviewed code saves the enquiry before the HTTP notification.
  • The webhook uses a common shape across forms and a timeout.
  • A durable outbox and retry mechanism are a recommended evolution for critical flows, not a guarantee of the current notifier.

Engineering decision

Bound notification time without losing the saved enquiry

Adapted from the reviewed webhook helper, called after the form submission has been saved. The request is aborted after five seconds, HTTP and transport failures return diagnostics, and the timer is always cleaned up. This does not provide a durable retry queue or prove downstream processing. A timeout can mean that the destination received the request but its response was lost.

TypeScriptenquiry-notification.ts31 lines
type Delivery =  | { ok: true }  | { ok: false; reason: "disabled" | "timeout" | "http-error" | "network" };export async function notifySavedEnquiry(  configuredUrl: string | null,  payload: { form_type: string; data: Record<string, unknown> },): Promise<Delivery> {  if (!configuredUrl) return { ok: false, reason: "disabled" };  const controller = new AbortController();  const timer = setTimeout(() => controller.abort(), 5_000);  try {    const response = await fetch(configuredUrl, {      method: "POST",      headers: { "content-type": "application/json" },      body: JSON.stringify(payload),      signal: controller.signal,    });    return response.ok ? { ok: true } : { ok: false, reason: "http-error" };  } catch (error) {    return {      ok: false,      reason: error instanceof Error && error.name === "AbortError"        ? "timeout" : "network",    };  } finally {    clearTimeout(timer);  }}// URL comes from trusted server configuration, not the visitor's form.// The persisted submission remains the source of truth for follow-up.

Adapted implementation excerpt

Bound notification time without losing the saved enquiry

Controls and boundaries

  • Send only the fields required by the recipient.
  • A delivered webhook does not prove the enquiry has been handled.
  • Validate the destination connector and its recovery behaviour before release.

Who can contribute

  • Operations: qualification and assignment rules.
  • Builders: approved forms and mappings.
  • Developers: validation, access, delivery and recovery.

What supports this case

Capture and notification code reviewed. The payload supports a Zapier, n8n or CRM destination; no downstream Zap has yet been verified.

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