Processes

Table of Contents

Create AWS Hosted Entity ID Page

Here’s the clean setup for hosting one static HTML page on AWS, like an ID page / entity page.

Option A — fastest: public S3 static website

Use this when you just need a public HTML page live quickly.

1. Create the bucket

Go to AWS Console → S3 → Create bucket.

Use a simple bucket name, for example:

colony-insulation-id-page

If this will use a custom domain later, the bucket name often needs to match the domain/subdomain, like:

id.getcolonyinsulation.com

Leave most defaults alone for now.

2. Upload your HTML file

Inside the bucket, upload:

index.html

Make sure it is exactly lowercase:

index.html

Not Index.html, index.htm, or index.html.html.

3. Enable static website hosting

Go to:

S3 bucket → Properties → Static website hosting

Choose:

Enable
Host a static website
Index document: index.html

Save it.

AWS’s static site setup specifically requires enabling static website hosting and configuring the index document before testing the website endpoint. (AWS Documentation)

4. Make the bucket public

Go to:

S3 bucket → Permissions → Block public access

Click Edit.

Uncheck:

Block all public access

Save.

AWS notes that public S3 websites require disabling relevant Block Public Access settings and adding a bucket policy granting public read access. (AWS Documentation)

5. Add a bucket policy

Still under:

Permissions → Bucket policy

Paste this, replacing the bucket name:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "PublicReadForStaticWebsite",
      "Effect": "Allow",
      "Principal": "*",
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::colony-insulation-id-page/*"
    }
  ]
}

Replace:

colony-insulation-id-page

with your real bucket name.

Save it.

6. Use the website endpoint, not the raw S3 URL

Go back to:

Properties → Static website hosting

Copy the Bucket website endpoint.

It will look like:

http://colony-insulation-id-page.s3-website-us-east-1.amazonaws.com

That is the URL you use.

Do not use the regular S3 object URL like:

https://colony-insulation-id-page.s3.amazonaws.com/index.html

That is the common cause of the XML AccessDenied page.

Option B — better/professional: S3 + CloudFront

Use this if you want HTTPS, cleaner delivery, and a better long-term setup.

Basic flow

  1. Create the S3 bucket.
  2. Upload index.html.
  3. Keep the bucket private.
  4. Create a CloudFront distribution.
  5. Set the S3 bucket as the origin.
  6. Use Origin Access Control so CloudFront can read the private bucket.
  7. Set:
Default root object: index.html

CloudFront uses the default root object when someone visits the distribution root instead of requesting a file directly. (AWS Documentation)

CloudFront URL will look like:

https://d123abc456.cloudfront.net

If you use CloudFront, you do not necessarily need S3 static website hosting enabled. CloudFront can serve the object directly from S3, but you must set the default root object and bucket access correctly.

For your current AccessDenied error

Most likely, one of these is wrong:

You are using the raw S3 URL instead of the website endpoint.
index.html is not public.
Static website hosting is not enabled.
The bucket policy does not grant s3:GetObject.
CloudFront has no default root object.
CloudFront does not have permission to read the bucket.

My recommended setup for your use case

For these simple generated entity/ID pages, I’d do:

S3 public static website first

Then later, if you want HTTPS/custom domain polish:

CloudFront + custom domain + SSL certificate

For right now, get the page working at the S3 website endpoint first. Then layer CloudFront/custom domain only after the base page loads.

Website Setup

Keyword & Competitor Research

Website Research & Planning

  1. Backup Existing Website Data
    • Current sitemap
    • Blog posts content
    • Images
    • Etc.
  2. Create a sitemap
    • Organize the client information into rough sitemap
      • 1 service per page
      • Necessary core pages (home, about, contact, etc.)
    • Understand client service structure and location targets
      • Use AI to research services and geo coverage
      • Understand options to target geo and categorize services
      • Create a brand data sheet including:
        • Facts & Offerings
        • Brand Voice & Tone
    • Perform keyword research to revise structure and naming
    • Create spreadsheet of each page, include:
      • their focus keywords
      • page titles
      • slugs
  3. Create base content
    • Create Surfer doc for each service page and home
    • Download guidelines for each page
    • Have AI create each landing page using prompt tool and guidelines doc
    • Paste into Sufer to check scores and revise as needed
  4. Create content spreadsheet
    • Export completed Surfer page html for each page
    • Create a spreadhseet with all landing page ACF field labels in column 1 (not row 1 yet)
    • Upload each page html file 1 at a time into AI and use the csv building prompt
    • Copy code format output and paste into emplty the next empty column from left to right
    • Ensure each page has all fields and all line up properly
    • Once all pages are in the sheet, export as CSV file
  5. Upload and map content spreadsheet

Website Sitemap Design

ACF Configuration

Import Sitemap with Empty Pages

SEO Setup

Client Fact Sheet

  • Create client fact sheet
  • Document company info
  • Document contact info
  • Document services
  • Document service area
  • Document client brand voice

SEO Plan

  • Create SEO plan
  • Plan service pages
  • Plan service + location pages
  • Plan blog article pages
  • Create backlink list

Analytics Setup

  • Configure Google Analytics
  • Configure Google Search Console
  • Add client users

CallRail Setup

  • Set up CallRail
  • Configure website pool & integration
  • Enable external form tracking
  • Configure GBP phone & integration
  • Integrate CallRail with Google Analytics
  • Set key events for calls and forms

SEMrush Project Setup

  • Set up SEMrush SEO project
  • Set up and run Site Health report
  • Share technical SEO needs with website technician
  • Set up and run Position Tracking
  • Select competitors after complete
  • Connect Google Search Console
  • Connect Google Analytics

SEMrush Local Setup

  • Set up SEMrush Local
  • Set up GBP AI Agent
  • Set up keyword list, posting schedule, and review replies
  • Upload photos
  • Set up SEMrush Map Rank Tracker

AgencyAnalytics Setup

  • Create AgencyAnalytics dashboard
  • Copy all SEO dashboard templates
  • Connect all client accounts
  • Verify accuracy of data
  • Add client users

Surfer Setup

  • Set up Surfer
  • Connect client GSC
  • Create client content folder
  • Create initial content pieces

BrightLocal Citation Setup

  • Create new BrightLocal local citation campaign
  • Input all client data
  • Configure citation selections
  • Order and hand off to account management

GBP Optimization

  • Optimize Google Business Profile
  • Set logo
  • Clean up business name
  • Check NAP match with website
  • Update description
  • Update category
  • Update services with descriptions
  • Update products with descriptions and images
  • Update service area
  • Update social links

Rank Math & Website SEO Setup

  • Configure Rank Math
  • Configure sitemap
  • Configure robots.txt
  • Configure local schema
  • Configure website schema
  • Configure Rank Math local SEO settings

Technical SEO Audit & Hitlist

  • Complete technical SEO audit
  • Create technical SEO hitlist
  • Share technical SEO needs with website technician

Website Production

Custom Post Type Setup

Web Page Template & ACF Setup

Blog Archive & Post Template Setup

Header, Footer & Sticky Buttons

Landing Page Writing

Landing Page Importing with CSV

Blog Content Writing

Standard Website Page Writing

Standard Website Page Importing

SEO Monthly Production

Assessment & Reporting

  • Review overall performance in SEMrush
  • Review SEMrush Position Tracking
  • Review Surfer recommendations
  • Review GSC performance
  • Review GSC page indexing and status
  • Review GBP performance
  • Review CallRail organic leads

Strategy & Plan Update

  • Set monthly content, backlink, and technical priorities
  • Create new content briefs and set up Surfer
  • Document task list for each category and assign in Trello
  • Update SEMrush Position Tracking
  • Update GBP keyword targets
  • Create client monthly update email with AgencyAnalytics link

Content Writing & Optimization

  • Write/revise [service/location/blog]
  • Check Surfer scores
  • Integrate internal links
  • Perform copywriting QA check

Create New Website Content

  • Export and provide JSON website snapshot file and documentation
  • Upload Surfer HTML files to ChatGPT and fill missing fields
  • Create new import/update JSON file
  • Import new JSON and check for accuracy
  • Obtain and place images into new content as needed
  • Perform website content QA
  • Publish and index content immediately or schedule
  • Submit [new/updated URLs] in GSC
  • Confirm sitemap inclusion

Technical SEO

  • Review SEMrush Site Health Audit
  • Review GSC indexing report
  • Check Core Web Vitals issues
  • Check Screaming Frog issues
  • Check AI crawl issues
  • Resolve priority issues
  • Log unresolved issues

GBP & Local SEO

  • Update GBP profile, services, categories, and hours as needed
  • Upload new GBP photos in SEMrush Local AI Agent as available

Backlinks & Authority

  • Review backlink opportunities and competitors
  • Build/pitch [local citation/directory listing/niche/press release/membership/sponsorship/partner/vendor/manufacturer] link
  • Review unlinked brand mentions
  • Track new and lost backlinks
  • Review toxic backlinks
  • Update disavow file if needed

Website Closeout

Pre-Launch Setup

Google Site Kit Integrations

CAPTCHA Integration

Rank Math Initial SEO Setup

Website Quality Assurance

Launch the Website

Website Post-Launch Support