Book a workshop
Account
Photography and e-commerce · 2025

From static portfolio to a selling platform

Alex photographs northern lights and extreme landscapes. He had a portfolio that needed a developer for every new gallery, and no way to sell his prints except through other people.

Next.js, Supabase, Stripe, Vercel

The alexwides.com home page with featured photographic collections

Home and featured collections

alexwides.com is a working photographer's platform: a portfolio with collections generated from the database, an e-commerce for limited-edition fine-art prints with Stripe checkout and international shipping, course landing pages connected to the client's existing teaching platform, photo tour pages by destination, and a custom back office that lets him run all of it himself. Stack: Next.js, TypeScript, Supabase, Stripe.

The problem

A beautiful portfolio that does not sell is a cost. Every update went through me, prints sold elsewhere, and contacts got lost between direct messages and email.

  • Every new gallery required development work
  • No direct sales channel for the fine-art prints
  • Courses and photo tours promoted only on other people's platforms
  • Interested contacts collected by hand, with nowhere for them to land
  • Heavy galleries of dozens of high-resolution shots, to be served fast
  • Image alt text to be managed without touching code, on an almost entirely visual site

The product

Four things in one site: portfolio, shop, school and trips.

Alex Wides' photographic collections

The collections index

Portfolio

Themed collections

Collections are generated from the database: a new one needs no line of code. Every gallery has its own readable address and loads images as you scroll.

The gallery of a single photographic collection

An open collection

Gallery

A single collection

High-resolution shots served in modern formats and loaded only when they enter the screen, because a gallery of dozens of images cannot weigh like one.

A fine-art print page with sizes and print run

A print page

Shop

Limited-edition print

Every work has its sizes with differentiated prices and its print run. Copies still available are shown plainly: that is the information that makes people decide.

The cart with the selected prints

The cart

Purchase

Cart and payment

The cart survives closing the browser. Payment happens on Stripe with card, Apple Pay and Google Pay, and on confirmation the order writes itself to the database.

The landing page of a photography course

A course page

Teaching

Course landing pages

Each course has a page built to convert: curriculum, modules, previews and student work. Delivery stays on the platform the client already used.

A photo tour page with the itinerary

A photo tour

Trips

Photo tours by destination

One page per destination, with a day-by-day itinerary, what is included and what you learn. Enquiries arrive already tied to the right tour.

What he runs without me

The panel replaces a traditional CMS and covers the five areas that actually change. That was the point of the work.

Portfolio

  • Collections

    Create a collection, upload photos in bulk, reorder them, pick the cover.

  • Images

    Title, description, alt text, hover image and display order.

Shop

  • Limited editions

    Mark a work as a limited edition and set its price, number of copies and remaining availability.

  • Print sizes

    Sizes and price list per individual work, not one price list for everything.

  • Orders

    Customer record, order and order lines written by the webhook once payment is confirmed.

Courses and trips

  • Courses

    All the visual assets of the landing pages: covers, modules, before and after comparisons, student work, video.

  • Photo tours

    Hero image and galleries for each destination.

  • Contacts

    Messages, course waiting lists and one-to-one lesson requests, with instant email notification.

Stack

Headless architecture: the front end talks straight to Postgres, sensitive writes go through server-side APIs. No CMS licence fee.

Next.jsReactTypeScriptTailwind CSSSupabasePostgreSQLRow Level SecurityStripeBrevoMailchimpGSAPVercel

Pages regenerated at different intervals by content type: fast like static, updated when the client publishes.

Got a portfolio that does not sell?

If updating your site takes a developer, and what you produce sells through other people, this is the work to do.

alexwides.com