โ† Back to Learn

Website Building: Lessons from 10+ Contractor Sites

July 06, 2026 ยท 14 min read

๐Ÿ—๏ธ Website Building Lessons

Lessons from building contractor websites, deployment, SEO, hosting, DNS.


Lesson 2026-04-14: Cloudflare Free Tier Limits

Category: website-building

What We Were Trying To Do

Serve website content and API endpoints through Cloudflare Workers for atlas-automation.co

What We Tried

Deployed multiple routes through a single Cloudflare Worker โ€” contact forms, image upload, site serving

What Went Wrong

Free tier hit daily rate limit. Multiple routes all consuming from the same limit pool. All routes returned 503 errors simultaneously with no graceful fallback.

How We Fixed It

What To Do Next Time Instead

Could Be A PDF Chapter?

Yes โ€” "Don't Let Free Tier Limits Kill Your Website: What I Learned From Cloudflare"


Lesson 2026-04-14: Image Upload CORS Headers

Category: website-building / automation

What We Were Trying To Do

Upload images from browser directly to Airtable

What We Tried

What Went Wrong

Browser fetch to Airtable returned 403. The Content-Type header wasn't being set explicitly โ€” browser assumed wrong content type for the PATCH request.

How We Fixed It

Added explicit Content-Type: application/json header to the browser fetch call. No proxy needed.

What To Do Next Time Instead

Could Be A PDF Chapter?

Yes โ€” "Browser to API: Why Your Fetch Requests Keep Failing (And How to Fix Them)"


Lesson 2026-04-14: Verify Before Declaring Fixed

Category: website-building

What We Were Trying To Do

Fix a quote button on a contractor website that wasn't submitting to the contact form

What We Tried

Made code changes to the button handler, told Scott it was fixed

What Went Wrong

Told Scott it was fixed before actually deploying the change. When Scott checked, it still didn't work because the fix wasn't live yet.

How We Fixed It

Deployed the changes, then verified the live URL actually worked before telling anyone.

What To Do Next Time Instead

Could Be A PDF Chapter?

No โ€” internal operations lesson


Lesson 2026-04-07: DNS Migration Confusion

Category: website-building

What We Were Trying To Do

Change DNS for a domain from Carrd.co to Cloudflare Pages

What We Tried

Told Scott to change a CNAME record in his DNS dashboard

What Went Wrong

Scott couldn't find the DNS settings described โ€” the UI was unfamiliar to him because it was a different registrar/DNS provider than expected.

How We Fixed It

Walked him through step by step with numbered instructions for his specific dashboard. He executed successfully once he had clear guidance.

What To Do Next Time Instead

Could Be A PDF Chapter?

Yes โ€” "DNS for Non-Techies: A Step-by-Step Guide to Changing Your Domain Settings"


Lesson 2026-04-15: Deployment Tools โ€” Check Before Promising

Category: website-building

What We Were Trying To Do

Generate PDF documents for client deliverables

What We Tried

Promised PDF generation capability without first checking if the tools were installed

What Went Wrong

No wkhtmltopdf installed on the server. Couldn't generate PDFs when needed.

How We Fixed It

Installed wkhtmltopdf on the server. But the damage was done โ€” the promise was made without capability.

What To Do Next Time Instead

Could Be A PDF Chapter?

Yes โ€” "The Pessimistic Review: How to Stop Overpromising and Start Delivering"


Lesson 2026-06-10: WordPress-to-Static-Site Pipeline Leaves Broken Pages

Category: website-building

What We Were Trying To Do

Generate a deployable static HTML site for landscape-greensboro.com from WordPress template + CSV data.

What We Tried

Used a Python build script to render 20 pages from a WordPress HTML template and CSV, outputting to landscape-greensboro-static/.

What Went Wrong

The build script had multiple issues that left the site unusable: