The photographer tech stack I actually run.

A static site, Google's own APIs as the backend, and a handful of small functions holding it together. The entire web infrastructure costs about nothing per month — the only things I pay for are the photography tools. Here's the whole thing, and how to set it up yourself.

Most photographers I talk to are paying for eight things and using four. A website builder, a scheduler, a form tool, an email sender, a landing-page product, some analytics thing, a "business hub" bought during a launch two Novembers ago. Individually they're all thirty or fifty a month, which is nothing. Together they're a mortgage payment a year, and — this is the part that bothers me more — they're eight companies with a piece of your business, eight logins, and eight places your data can be held hostage when you want to leave.

What I run instead is boring, and boring is the point. Nothing here is clever. It's a static website, Google's APIs doing the work a backend would normally do, and small pieces of code that only run when something needs to happen.

A static site on Netlify, Google's APIs as the backend, serverless functions as the glue. The web layer costs roughly nothing — what I pay for is photography.

The web layer

Astro, for the site itself.

A static site generator: every page is built ahead of time and ships as plain HTML and CSS with almost no JavaScript. There's no React, no client-side framework, nothing for a phone to download and execute before your first photograph appears. That's the entire reason the site is fast — not clever optimisation, just an absence of weight. And fast is not a vanity metric here: it's what a couple experiences on venue wifi, and it's what Google measures.

Netlify, for hosting and deploys.

It serves the site from a global CDN, and I publish with a single command from my laptop. It also handles my DNS, which is how the subdomains route — one for the client gallery service, one for the CRM's client portal, one for this education site. Those all look like part of my domain to a client, and none of them live on my server.

Netlify Forms, for everything people submit.

Guide signups, the feedback page, team onboarding, the package builder, call bookings — all of it goes through the form handling built into the hosting, with email notifications to me. No form-builder subscription and no monthly fee, and because the submissions are reachable through an API, they double as the data behind my admin dashboard.

Serverless functions, as the backend.

Small Node programs that run only when called, and cost nothing when they aren't. Mine handle the booking scheduler, the admin data API, the invoice ledger, and the automatic email that sends a new team member a copy of what they acknowledged. This is the piece photographers assume they can't have without a "real" website. You can. It's four files.

One honest exception to the "every form" claim: my main inquiry form is a lead-form embed from my CRM rather than a Netlify form. That's deliberate — a website inquiry needs to land inside the CRM to trigger the auto-responder and start the pipeline, and routing it through my site first would just be a step that can break.

Google as the backend

This is the part that surprises people, and it's the reason the bill is what it is. I don't run a database or pay a service for scheduling or email delivery. I use the Google account I already have.

The Calendar API runs the booking page.

It checks my genuine free/busy across my calendars, so the times a couple sees are times I'm actually free. It creates the event with a video-call link attached, and it drives the reminder an hour before. No scheduling subscription, and no second calendar to keep in sync with the real one.

The Gmail API sends every branded email.

Booking confirmations, onboarding acknowledgment copies — all of it goes out through my own Workspace account, from my own address. There is no third-party mail provider anywhere in this, and no separate tool for designing the templates either: the email design is just HTML living in the function that sends it, which means changing it is an edit rather than a login. Which means replies come back to my inbox, the sent copy is in my Sent folder like any other email, and my domain's sending reputation stays mine.

Analytics and Search Console, for knowing anything.

GA4 for traffic, Search Console for what people searched to find me and which pages Google actually indexed. Both free, and the second one is the more useful of the two by a wide margin.

And an AI notepad on every call.

Granola sits quietly on my discovery calls and writes the summary afterwards, which then becomes the quote draft and the note in my CRM. Free tier, no bot joining the meeting — and you tell the couple at the start, every time. That one has its own post.

Where this stopsThe Gmail API is for transactional email — one message triggered by one action. Broadcasting a newsletter is a different job with different rules: it needs real list management and a working unsubscribe in every message, and getting that wrong damages the sending reputation of your own domain. We have since moved our list off a paid platform as well, but treat that as its own build with its own requirements — not something to bolt onto your booking confirmations.

The SEO layer

Not a tool — a set of decisions baked into how the pages are built. JSON-LD structured data so machines know what the business is, what an article is, and what an album product is. An XML sitemap that lists the real pages and deliberately excludes the private ones. Noindex on anything internal. And venue-specific landing pages, because "wedding photographer" is a war and the name of a specific venue is a conversation.

On this education site I take it a step further, because search is no longer only Google: an llms.txt file describing the site in plain language for AI assistants, clean readable slugs on every journal post, and a robots file that deliberately allows AI crawlers on public pages. If you want to see where your own site currently stands on all of this, I built a free grader that checks 21 of these things and tells you what to fix.

The education site is deliberately different

learn.alexknightstudio.com isn't Astro. It's hand-authored static HTML with no framework at all, deployed to its own Netlify site. That's not inconsistency for its own sake — it's a smaller site that changes constantly, and the fastest thing to edit is a file with nothing between me and it. Guide content sits behind a password gate, and the newsletter list runs on our own system now too. Same philosophy, different weight class.

What I actually pay for

Here's the whole stack with the honest bill attached.

ToolWhat it doesCost
AstroBuilds the site as static HTMLFree
NetlifyHosting, CDN, DNS, deploysFree tier
Netlify FormsEvery form submission on the siteIncluded
Netlify FunctionsScheduler, admin API, ledger, auto-emailsIncluded
Google Calendar APIReal availability, events, Meet linksIncluded
Gmail APIBranded transactional email from my addressIncluded
GA4 + Search ConsoleTraffic and search performanceFree
GranolaAI notes on every client callFree tier
Domain nameThe one unavoidable web cost
Google WorkspaceEmail — and what the Calendar and Gmail APIs run on
VSCO WorkspaceCRM: leads, quotes, contracts, invoicing, automations
Pic-TimeClient galleries and print sales
AdobeLightroom for editing, Photoshop for retouching
GustoContractor payroll, W-9s, direct deposit
1PasswordPassword manager, shared with the team

On those numbersEntry tiers as of August 2026, in US dollars — the cheapest way in, not necessarily what I pay at my size. Two to watch: 1Password's $2.99 is the individual plan, and giving a whole team their own logins costs more; Gusto bills per contractor on top of the base. Prices move — Adobe's and Google's both have in the last two years — so check before you budget.

I want to be straight about the "$0" claim, because it gets oversold and I'd rather you trust the rest of this. The web infrastructure is effectively free at a photography studio's volume — nobody is going to blow through Netlify's free tier with a portfolio site and a few hundred form submissions a year. But a domain costs something, and Google Workspace costs something, and I'd be paying for Workspace anyway because that's where my email lives. What's genuinely gone is the stack of subscriptions in between: no website builder fee, no scheduler fee, no forms fee, no transactional email provider.

And notice what's left in the paid column. A CRM, galleries, Adobe, payroll, a password manager, an email list. Those are all doing things I cannot sensibly build and shouldn't try to — they hold client money, tax identities, and irreplaceable files. That's the line I'd encourage you to draw too: build the things that are just your business logic, and buy the things where being wrong is expensive.

Setting it up yourself

In order. The first four steps are clicking around in your own accounts — no assistant can do them for you, and they take an afternoon. Steps five onward are where the prompts come in.

  1. Buy your domain wherever you like, and don't overthink the registrar. This is the one thing you genuinely own, so keep the login safe.
  2. Create a Netlify account and a Google Workspace account on your domain, so your email is you@yourbusiness.com. Workspace is what the Calendar and Gmail APIs will run on later — you're setting up the backend without realising it.
  3. Point your domain's DNS at Netlify. Then, as you add services, give each one a subdomain — galleries on one, your CRM's client portal on another. Clients stay inside your brand the whole way through, which costs nothing and looks like far more effort than it is.
  4. Verify the site in Google Search Console and set up GA4. Do this on day one even though there's nothing to look at yet — Search Console only shows data from the point you verify, so every week you delay is a week of history you'll never get back.
  5. Build the site. Prompt one, below.
  6. Wire up the forms. Prompt two.
  7. Connect Google as the backend. Prompt three — do this only once the site is live, because the login flow needs a real address to return to.
  8. Add the SEO and AI-discoverability layer. Prompt four.
  9. Then add the pieces one at a time — booking page, feedback page, package builder, admin dashboard, team onboarding. Each has its own post in this series with its own prompt. Build one, use it for a week, then build the next. Everything at once is how you end up with five half-finished things.

Prompt 1 · The site

Paste into Claude Code, in an empty folder
Set up a new website for my [wedding photography] business as a static Astro
site, deployed to Netlify. I am not a developer — explain what you're doing as
you go, and stop and ask when you need a decision from me.

1. Scaffold a minimal Astro project. No React and no client-side framework —
every page should ship as static HTML and CSS with as little JavaScript as
possible. Speed on a phone is the priority.
2. Set up a shared layout with my navigation and footer, so I only edit those
in one place.
3. Build these pages as a starting point: home, portfolio, about, investment,
contact. Ask me what my sections and copy should say rather than filling them
with placeholder text.
4. Handle images properly — the site is mostly photographs. Use Astro's image
handling for responsive sizes and modern formats, and lazy-load anything
below the fold.
5. Set up deployment to Netlify via the Netlify CLI, and walk me through
connecting my domain and turning on HTTPS.
6. Show me exactly how to add a new page and how to publish a change, in
plain steps I can follow again next month without you.

Prompt 2 · Forms

Paste into Claude Code, from your site's folder
My site is on Netlify. Set up all my forms using Netlify Forms — no
third-party form service.

1. Ask me which forms I need and what fields each one has before building
anything.
2. Build each form with a honeypot field for spam, clear labels, proper input
types so phones show the right keyboard, and inline validation messages that
say what's actually wrong.
3. On submit, keep the person on the page — swap the form for a confirmation
message rather than sending them to a separate thank-you page.
4. Walk me through turning on email notifications for each form in Netlify,
and where in the dashboard the submissions live.
5. Make sure every submission also records which page it came from, so I can
tell later where someone signed up.
6. Test each form end to end with a real submission and show me the result
before we call it done.

Prompt 3 · Google as the backend

Paste into Claude Code, once your site is live
I want to use my own Google Workspace account as the backend for my Netlify
site, instead of paying for a scheduling tool and a transactional email
service. I have never used Google Cloud before.

1. Walk me through creating a Google Cloud project and enabling the Google
Calendar API and the Gmail API, step by step, telling me exactly what to
click.
2. Walk me through creating OAuth credentials and generating a refresh token
with the calendar and gmail.send scopes. Give me a script I run myself.
IMPORTANT: never print, echo, or ask me to paste any secret value into this
chat — client secrets and tokens go straight into my Netlify environment
variables, and nowhere else. When you give me a command, use a placeholder I
replace myself, and tell me clearly that's what it is.
3. Write a small shared helper that exchanges the refresh token for an access
token, so my functions don't each reimplement it.
4. Build one serverless function that sends an email through the Gmail API
from my own address, with an HTML template matching my brand, and one that
reads free/busy from my calendar. Keep credentials server-side only — they
must never reach the browser.
5. Confirm which scopes the token actually ended up with before we finish, so
I know it worked rather than assuming.
6. Explain, in plain English, what would break if I ever revoked this token,
and how I'd fix it.

Prompt 4 · SEO and AI discoverability

Paste into Claude Code, from your site's folder
Add a proper SEO and AI-discoverability layer to my photography site. I want
to be found by Google and readable by AI assistants.

1. Ask me my business name, the city and region I serve, my starting price
range, and the venues I work at most — then use my real answers, not
placeholders.
2. Give every page a unique title (under 60 characters) and meta description
(under 155), each naming the service and the location. Show me the list
before you write them.
3. Add JSON-LD structured data: LocalBusiness for the business itself,
Article for journal posts, Product for anything I sell. Use one shared
business entity that other pages reference, rather than repeating it.
4. Generate an XML sitemap that excludes private pages, and a robots.txt that
points to it. Add noindex to internal pages — admin, onboarding, anything I
send by link only.
5. Add an llms.txt at the site root: a plain-language summary of who I am,
what I offer, my pricing, and my key pages, written for AI assistants.
Explicitly allow AI crawlers on public pages in robots.txt.
6. Set up canonical URLs and Open Graph tags so links look right when shared.
7. Then audit what you built: list every page with its title length,
description length, and whether it has structured data, so I can see the
gaps.

A word on prompt three, since it's the one with real consequences. That token can read your calendar and send email as you. Treat it accordingly: it belongs in your host's environment variables and nowhere else — not in a file, not in a screenshot, not pasted into a chat window to ask why something's broken. I say that with feeling, having once broken my own booking page for twenty minutes by pasting an example line from instructions instead of my own value.

Where I'd start if I were you

Not with all of it. The stack above is four years of small decisions, and trying to stand it up in a fortnight is how you end up with a half-migrated business and no working website.

Start with the website itself, because everything else hangs off it and because a fast site earns its keep immediately. Then add the one piece that annoys you most — for me that was the scheduler, for you it might be the feedback form or getting your team's paperwork straight. Use each thing for a couple of weeks before building the next, and you'll find the second version of anything you build is much better than the first, because you'll have learned what you actually needed it to do.

From the journal

Every post in this series comes with the prompt.

These are the systems my studio actually runs on, and I publish the exact prompt for each one — not a summary of it, the thing I used. Take them, change the details to fit how you work, and stop paying for the parts you can own.

See the whole series

— Alex Knight
No. 1: booking page · No. 2: feedback form · No. 3: package builder
No. 4: admin dashboard · No. 5: team onboarding