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 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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
Here's the whole stack with the honest bill attached.
| Tool | What it does | Cost |
|---|---|---|
| Astro | Builds the site as static HTML | Free |
| Netlify | Hosting, CDN, DNS, deploys | Free tier |
| Netlify Forms | Every form submission on the site | Included |
| Netlify Functions | Scheduler, admin API, ledger, auto-emails | Included |
| Google Calendar API | Real availability, events, Meet links | Included |
| Gmail API | Branded transactional email from my address | Included |
| GA4 + Search Console | Traffic and search performance | Free |
| Granola | AI notes on every client call | Free tier |
| Domain name | The one unavoidable web cost | ~$15/yr |
| Google Workspace | Email — and what the Calendar and Gmail APIs run on | from $7/user/mo |
| VSCO Workspace | CRM: leads, quotes, contracts, invoicing, automations | from $24.99/mo |
| Pic-Time | Client galleries and print sales | free, then $8/mo |
| Adobe | Lightroom for editing, Photoshop for retouching | from $11.99/mo |
| Gusto | Contractor payroll, W-9s, direct deposit | $35/mo + $6 each |
| 1Password | Password manager, shared with the team | from $2.99/mo |
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.
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.
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.
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.
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.
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.
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.
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