Scenario · Website + client area · Photography studio

Photos at the centre,
delivery without the hassle.

A photographer with great work and a website that does not show it off, while client galleries travel through transfer links that expire. A fast portfolio and a private area where every client finds their own photos.

Project typeWebsite + client area
SectorPhotography studio
Typical timing5–7 weeks
●Scenario
website · photography studio
Client area
Wedding gallery
Weddings
Portraits
Corporate
847 shots

Website scenario — professional photographer

Hundreds of shots
delivered via WeTransfer.

The scenario: a professional photographer with several years of experience — weddings in Tuscany, editorial portraits, corporate shoots. The work is recognised: a good Instagram following, returning clients, weekends booked in spring and autumn. The problem lies entirely in delivery and in the website.

Each wedding produces 400–600 final shots delivered via WeTransfer. The links expire after seven days. Clients download everything once, then lose the photos when they change phones; months later emails arrive asking to "send everything again". And the website — a photography template from a few years ago — has a gallery of compressed photos and no way to book a session except through Instagram messages.

What's needed is a professional system, not a better social profile.

"I lost an important client because the link to her photos had expired and she thought I'd deleted them. I don't want that to happen again."

— The story I hear most often from photographers
Scenario
Professional photographer (example)
Area
Tuscany (available everywhere)
Industry
Wedding photography · Portraits · Corporate
Typical duration
5–6 weeks
Typical starting point
Dated template, delivery via WeTransfer, bookings via Instagram messages
Services
Custom design Frontend PHP backend Client area Session booking Protected galleries SEO

Photographer website requirements

What was
really needed.

Five areas that come out of the brief, a map of the real workflow and a review of the existing site — including the point where visitors leave the page.

Protected client area with private galleries

Every client must have personal access with a PIN or protected link to view and download their shots in high resolution. Galleries must stay accessible forever — not seven days like WeTransfer.

Photo session booking

A system to book a session directly from the website: type (wedding, portrait, corporate), preferred date, a short description of the project. No Instagram DMs, no emails lost in spam.

High-quality visual portfolio

A portfolio that shows the photographs as they deserve: full screen, with smooth transitions, fast loading despite the resolution. Three filterable categories (Weddings, Portraits, Corporate) with intuitive navigation.

Testimonials and social proof

Collecting and showing reviews from happy clients automatically. There are often dozens of lovely messages on Instagram and WhatsApp that nobody knows how to show on the site credibly.

SEO for a wedding photographer

Most clients come from Instagram or word of mouth — but every month many couples search for "wedding photographer Florence", "Chianti photographer", "Tuscany wedding photos". An old site usually ranks for none of these searches.

Technical challenges of an online photography portfolio

Where the real
problems hide.

A photography site with a private client area and high-resolution galleries brings together challenges ranging from file security to mobile UX, from image optimisation to storage. These are the five most critical.

01

File protection without expensive CDNs

High-resolution photos must be accessible only to authorized clients — not indexable by Google, not downloadable without authentication. Protecting them without an expensive CDN or an external service requires server-side signed URLs with temporary tokens.

02

High-resolution galleries on mobile

Wedding photos of 8–15 MB originals: showing the quality without making people wait three seconds at every swipe. Aggressive lazy loading with LQIP (Low Quality Image Placeholder) and multi-resolution srcset is the only solution that doesn't compromise the perception of quality.

03

Client area UX for non-technical users

Clients are wedding couples, not developers. The client area has to work for anyone on first visit, with no instructions. The path sign in → view → download should take under 30 seconds from the link received by email.

04

Scalable storage without exploding costs

One year of work = dozens of weddings × 400 photos = hundreds of GB. Storage costs must stay under control over time. The solution must separate the original photos (long-term archive, low access frequency) from the web-optimized versions (frequent access).

05

Visual portfolio and SEO: conflicting goals

A portfolio that puts photos at the center tends to sacrifice text — and text is what Google indexes. Finding the balance between an immersive visual experience and structured text content requires architectural choices that can't be fixed after launch.

Photographer portfolio development process

How I
organise the work.

Five to six weeks in four phases. One clear priority: the client area ships before the public portfolio, because there are already archived sessions waiting for a permanent home. The public site comes after.

Week 1
Discovery & Architecture

Review of the existing site, a map of the current delivery flow (WeTransfer, emails, messages), heatmaps and available Analytics data. Architecture: public site and private client area as one system with separate routes.

Delivered: system architecture · sitemap · client-area flow
Weeks 2–3
Design system + client area prototype

Complete design system: a dark, warm palette, editorial typography (serif for headings, a clean sans for the interface), rules for the photo grid. An interactive client-area prototype in Figma, tested with two real clients before writing code.

Delivered: design system · validated Figma prototype · usability tests
Weeks 4–5
Development: client area + public portfolio

Full build: PHP backend for authentication and signed URLs, HTML/CSS/JS front end for portfolio and client area, bulk upload to archive existing sessions, automatic WebP previews, booking form with email notifications, Google reviews for testimonials.

Delivered: working site · client area · existing sessions migrated
Week 6
Testing, SEO & Go-live

Full testing (sign-in, download, booking) on real iOS and Android phones, on-page SEO (meta, ImageGallery and LocalBusiness schema, image sitemap), Google Search Console, DNS switch and go-live. Training on the gallery management panel.

Delivered: live site · SEO set up · galleries managed in-house

Optimized web photo gallery solution

How I solve
each problem.

// 01 · Protected client area

Signed URLs with temporary tokens: private galleries without a CDN

Every client receives a unique link by email. The link contains an encrypted token that is validated server-side by a small PHP script. The high-resolution originals live in a directory outside the server's document root — not directly accessible via URL, even if you know the path.

Once the token is valid, PHP generates signed URLs that expire after a few hours for each file. Downloads go through readfile() with the right headers, never exposing the real path. Galleries stay available forever, and access can be revoked at any time from the panel.

The system uses no external services. Extra cost for the client area: €0/month. Storage comes from the existing hosting, enough for hundreds of GB without changing infrastructure.

photographer website /clients/couple
CLIENT AREA · PRIVATE GALLERY
Couple · Wedding
September · Tuscany
↓ Download all
487 photos
·
2.4 GB originals
·
Permanent access
+479
✓  Valid token · Authenticated access · Protected files
// 02 · High-performance public portfolio

LQIP + srcset: visual quality and speed, together

For every photo uploaded to the portfolio, a PHP script automatically generates three WebP versions (400px, 900px, 1800px) and an LQIP placeholder (a blurred 20×20px version in base64, ~300 bytes). The img srcset tag serves the right format to the right device.

The blurred placeholder shows up straight away: you see the photo's composition while the real one loads. On a phone over 4G, perceived load time drops from about 3 seconds to under half a second. The grid uses CSS Grid with a fixed aspect-ratio to avoid layout shifts while loading.

// generate-thumbs.php — automatic pipeline function generateWebP($sourcePath) { $sizes = [400, 900, 1800]; $img = imagecreatefromjpeg($sourcePath); foreach ($sizes as $w) { $h = intval($w * imagesy($img) / imagesx($img)); $resized = imagescale($img, $w, $h); imagewebp($resized, "thumbs/{$w}/" . basename($sourcePath, '.jpg') . '.webp', 82); } // LQIP: 20×20 blur in base64 $lqip = imagescale($img, 20, 20); ob_start(); imagewebp($lqip, null, 30); return 'data:image/webp;base64,' . base64_encode(ob_get_clean()); }
// 03 · SEO for a wedding photographer

Text content + Schema.org: visibility without sacrificing aesthetics

The classic problem with photography sites is that Google doesn't see the photos — it sees alt text, headings, structure. The answer is to separate the two experiences: the portfolio stays visual and immersive, while each category gets its own page with structured text, local keywords and structured data.

The "Wedding photographer Florence" page has text optimised for local searches, testimonials with Review markup, LocalBusiness schema with the area served, and an image sitemap so the portfolio gets indexed. A realistic goal: page one for "wedding photographer + city" within the first months.

Search Console · example
EXAMPLE · TARGET QUERIES
wedding photographer florence
3.2
pos.
chianti wedding photographer
4.7
pos.
portrait photographer tuscany
6.1
pos.
tuscany wedding photos prices
9.3
pos.
1.24k
CLICKS
18.7k
IMPR.
6.6%
CTR

Photographer website tech stack

Technologies chosen, not imposed.

No CMS, no framework, no paid external services. The whole system — portfolio, client area, bookings, image handling — runs on PHP and JavaScript on ordinary hosting costing a few euros a month.

PHP 8.3 (backend + routing)
Semantic HTML5
CSS custom properties
Vanilla JavaScript ES6+
Signed URL (auth token)
WebP pipeline (GD Library)
LQIP base64 placeholder
Schema.org LocalBusiness
XML image sitemap
IntersectionObserver API
PHPMailer (booking notifications)
Figma (design system)

No subscription to Pixieset, ShootProof or similar platforms (usually €30–80/month). The custom system adds no monthly cost. Within a couple of years the savings cover the cost of building the client area.

Example goals — photographer website

What to expect
in the first months.

Example figures, not a client's results: realistic goals for a scenario like this, to be measured with Google Analytics 4, Google Search Console and booking data.

−60%
SHOT DELIVERY TIME
direct link instead of email + WeTransfer
+50%
NEW ORGANIC CLIENTS
goal from Google search
Top 10
GOOGLE POSITION
goal for "wedding photographer + city"
0€
CLIENT AREA COST
instead of a €30–80/month platform
90+
LIGHTHOUSE MOBILE
goal even with HD galleries
∞
GALLERY LIFETIME
instead of WeTransfer's 7 days

"A bride writes six months after the wedding to see the photos again from her new home. She finds everything and downloads what she needs." That's the result that matters: no client ever loses their photos again.

— The concrete goal of the client area

Lessons for a photography portfolio

What I bring
to every project like this.

These are the points I always keep in mind in projects for creatives and photographers.

→

The real problem often isn't the website, it's the workflow. Here you don't need a prettier site: you need to stop links from expiring. Understanding the real pain point before proposing technical solutions is the difference between a project that changes something and a simple redesign.

→

Testing the UX with real people before building always saves time. Letting a couple of wedding couples try the client-area prototype brings out the snags straight away (typically: a "download all" button that's hard to see). Fixing it in Figma takes minutes; after development, hours.

→

Subscription platforms for photographers cost more than they seem. Pixieset, ShootProof, Pic-Time: €30–80 a month, so €1,000–3,000 over three years. A custom system costs more upfront but pays for itself — and the photographer keeps full control of data and galleries.

→

Photo file security isn't obvious. Many photographers' websites put original photos in a public server folder, accessible to anyone who knows the path pattern. Protecting files outside the document root with PHP is a good practice that takes an hour of work and is worth a lot for client trust.

→

SEO and visual design aren't incompatible: they just need separate architecture. You don't have to choose between a beautiful portfolio and an indexed website. The solution is having SEO-optimized content pages that lead to the visual portfolio — not putting the text inside the portfolio itself.

// In short
Typical problem
Expired WeTransfer links, booking via DM, website not indexed
Approach
Custom PHP website + signed-URL client area + local SEO
Goals
Instant delivery · more clients from Google · local page one
Platform
PHP 8 · JavaScript · no CMS
Additional running cost
€0/month (instead of €30–80 for a platform)
Client area More clients Local SEO Zero SaaS

Have a similar project in mind?

Tell me about it: we start from goals and priorities, and the first call is free.