The website launch checklist
A launch checklist is not a list of good practice; it is a list of the things that get more expensive after launch or never come back at all. It has four columns, technical, content, legal and measurement, and its most important item is a four letter tag left over from the staging version.
- Lesson 11 of 12
- Intermediate
- Free, no signup
The four columns of work that finish before launch
The count on each column is exactly the cards written under it.
-
Content
4- The pages you must have
Contact, about, terms, privacy
- Final copy
No placeholder text survives to the live site
- Images with width and height
So the text does not shift under the reader
- Favicon and sharing image
Tested by sending the link in a chat
- The pages you must have
-
Technical
5- noindex removed
In the page source and in robots.txt, both
- One hostname and a valid SSL
Every other form 301s, with no chain
- A 404 page with a 404 code
Not a 200 with the words not found
- Sitemap and robots
CSS and JavaScript must not be blocked
- Automatic backups running
And a restore tried at least once
- noindex removed
-
Legal
3- Domain in the owner name
The designer gets access, the owner keeps ownership
- Hosting account and DNS access
On handover day, not a year later
- Contract and file handover
The design sources are part of the handover
- Domain in the owner name
-
Measurement
4- Google Analytics 4
With one test visit in the realtime report
- Search Console verified
Preferably by DNS record, with the sitemap submitted
- Contact form event
Otherwise you count visits and not enquiries
- A real email delivery test
To two destinations, then read the server log
- Google Analytics 4
This list is for a brochure or company site. An online shop has several more items that are not the subject of this lesson.
Last checked: Facts and tool names in this lesson are re-checked against their sources on this date.
What actually has to be finished before launch?
Whatever gets more expensive later. That is the only test that separates a launch checklist from a wish list: the colour of a button can change tomorrow, but three things never come back.
First, data. If analytics is not installed on day one, that week of traffic is gone for good and no tool recovers it. Second, ownership. A domain registered in the agency name is a negotiation later, not a setting. Third, access. The hosting account, the domain panel and the site administrator user, if they are not handed over on the day, are usually chased a year later at the worst possible moment.
The rest can be repaired, but not at the same price. One leftover tag can keep a site out of the results for weeks. A contact form whose mail does not arrive means leads you never learn existed. That is why this list sits in four columns, with the technical one first: not because it matters most, but because its failures are the quietest.
Technical: the two lines that do the most damage
Both come from the staging version and both are invisible. The first is a noindex tag in the head of the page, the second a Disallow: / line in robots.txt. You have seen the site that went live, works, is fast, and six weeks later somebody asks why it is not in Google.
In WordPress that tag usually comes from a checkbox: under Settings and Reading there is an option that asks search engines not to index the site. On staging it is right for it to be on; on launch day it has to go off, and that should be the last switch you flip, not the first.
Checking takes thirty seconds, and looking at the page will not answer it, because neither of them is visible. Open the page source and look for the robots tag, and open robots.txt directly in the browser. If you have a terminal, the exact command is in the fast path section of this lesson.
Three more items in the same column:
- One canonical hostname. The site should come up on one address only and every other form should 301 to it: without https to with https, and with www to without www or the other way round. Do not build redirect chains; every form should go straight to the final destination. The SSL certificate has to be valid both with and without www, and the SSL checker shows you its expiry and its issuing chain.
- A real 404. Open a meaningless address. You should see your own 404 page and the status code should genuinely be 404, not a 200 with the words "not found" on it. A page that returns 200 is a healthy page as far as Google is concerned.
- Sitemap and robots. The sitemap should be reachable and hold only indexable URLs, and robots.txt must not block CSS and JavaScript. The robots and sitemap tool reads both together.
Content: the pages that must not be half done on day one
A site with ten finished pages launches better than a site with forty half finished ones. The minimum is this: a contact page with a channel that actually answers, an about page with the names of real people, terms and privacy pages, and a 404 page that offers a way to the home page and to search rather than a dead end.
Then the small things, all of which take five minutes and all of which are usually forgotten. Add the favicon, or the browser tab shows a blank sheet. Add the sharing image and test it: send your own link to yourself in a WhatsApp or Telegram chat and look at what appears; that is the only real test of those tags. The title and meta description of every page should be unique, and the meta tag checker shows that page by page.
And two things that hit the experience directly: no placeholder text should survive onto the live site, and every image should carry a width and a height. The second is so the browser holds the space before the image arrives, otherwise the text shifts under the reader; the same thing we know from site speed as layout shift.
Does the site email actually arrive?
This is the only item on the whole list whose failure gives no sign at all. The contact form shows a green "sent", WordPress says it did its job, and the message never reaches anybody inbox.
The reason is that when the WordPress mail function returns true it has said only one thing: I handed the message to the sending system. Whether the destination server accepted it, dropped it in spam, or refused it outright is outside that function view. So any test that stops at the green message has proved nothing.
Three DNS records decide this and all three belong in place before launch. SPF says which servers are allowed to send mail in your domain name. DKIM puts a cryptographic signature on the message itself so the receiver can be sure it is untouched and came from where it claims. DMARC tells the receiver what to do when those two do not line up, and where to send the report. There is a fourth record that is not in your DNS at all and sits with the server provider: the reverse record, or PTR, which turns the sending IP back into a name. Large mail providers look suspiciously at mail arriving from an IP with no reverse name.
The right test has two steps. First a real send, not from inside a plugin but through the site own form, to two different destinations: a Gmail address and a company one. Second, reading the send log on the server, the place where the destination server acceptance line is written. Until you have seen that line, you are guessing that the mail arrived.
The path of one email, from the send button to the inbox
The green message is printed at step one, and your test has to finish at step five.
-
1
The site form
The "sent" message is printed right here and nothing has been proved yet.
-
2
The WordPress mail function
A true value means handed over, not delivered.
-
3
The sending service on the server
The first place a real log line is written and can be read.
-
4
The checks at the receiver
Here SPF, DKIM, DMARC and the reverse name of the IP are read.
-
5
Inbox or spam
The only place your test is allowed to end.
This path is for mail sent from the site own server. If you use an external sending service, step three moves elsewhere and its records differ.
Measurement: the thing you cannot make up later
Analytics and Search Console go in before launch, not after. The reason is simple and has nothing to do with SEO: there is no retrospective data. Install them a month later and that month is a black hole no tool will fill.
Three jobs in this column. First install Google Analytics 4 and make one test hit to confirm data really arrives; the realtime report answers you on the spot. Second verify ownership in Search Console, preferably with a DNS record, because that method does not depend on a file or a tag on the site and does not vanish when the theme changes. Third submit the sitemap; the guide to submitting a site to Google has that step by step.
One thing that usually gets left out: define the contact form submission as an event. Without it, next month you will know how many people arrived and not how many got in touch, and it is the second number that shapes every decision after launch.
Ownership and legal: what belongs in the contract
This column has no code in it and produces most of the arguments that follow a handover. Four things have to be settled on launch day and preferably written into the contract before it: in whose name the domain is registered, in whose name the hosting account stands, who holds DNS management, and to whom the site files and design sources are delivered.
One sentence makes it simple: the designer should have access, the owner should have ownership. A domain registered in the agency name is no problem at all while the relationship is good, and on the day it cools, the only real asset of the site is in the other party hands. A web design contract is the right place to write those four items down.
On the pages side, two are needed: terms and conditions, and a privacy page. The privacy page has to say what data you collect and with which tools; if you run analytics, that belongs there.
And a boundary, honestly stated: if your site is a shop, the permits and marks required to sell online are a separate subject with their own process, and it starts before launch rather than after. We say nothing about the details here because we have not checked them.
The order of launch day, and why noindex comes off last
You have done all of these before; here only their order matters.
-
1
Keep the staging version closed
With a password, not only noindex; two copies of one site in the results is trouble.
-
2
Domain, SSL and one hostname
After the DNS change give it a few hours to settle everywhere.
-
3
Analytics and Search Console
Before the first real visit, or that data is gone for good.
-
4
A real form and email test
From the site own form, to two destinations, then the server log.
-
5
Take the noindex off
The last switch you flip, and then read the page source again.
-
6
Submit the sitemap
Now that the pages are indexable, this step means something.
If there was a previous site, one more step comes before all of these: the redirect map for the old URLs, which is its own job and bigger than this list.
The first forty eight hours after launch
Launch is not the end of the work, it is the start of the two days in which most of the errors surface. Watch four things: the server error log, the URLs returning 404 (if there was a previous site, this is where a missing redirect shows itself), the arrival of form email, and the pages section of Search Console over the following days.
And one thing that eats a lot of people time because nobody thinks about it in advance: cache layers. You make a small change, open the page, see the previous version and conclude the change did not take. Usually it did, and what you are looking at came from a cache.
On this site there are three layers between you and PHP: the page cache on the server itself, the content delivery network cache at the edge, and the browser cache. The headers on public pages here tell the edge to keep the HTML version for 2592000 seconds, which is thirty days. So a fix that is already sitting on the server may not reach a visitor until that cache is cleared. Before launch, know which layers you have and how each of them is cleared; launch day is not the time to discover it.
The fast path, with AI
The usual method is clicking around the browser and looking page by page, and that is exactly why the noindex tag gets missed: it cannot be seen. The fast path inverts this. First you ask the site itself, with a few lines of command, what it actually returns, then you hand that raw output, not your description of the state, to a model to sort and rank. The whole thing takes under two minutes, and a fast cheap model is enough to sort the output; our current pick is in <a class="text-link" href="/en/ai/">the AI section</a>.
- Run the first half of the recipe below in a terminal, putting your own domain in place of the slot. If you have no terminal, open the same addresses in a browser and read the page source.
- Take the output untouched. Summarising it, or writing "everything looked fine", is exactly where this method stops being useful.
- Run the second half of the recipe with that output and take the ranked list.
- Check every item the model flags again yourself with the same command. A fix is finished when the command output has changed, not when the model says it is done.
Copy-ready recipe
Part one, in a terminal:
SITE=https://{your own domain}
for u in / /contact/ /blog/ /a-page-that-does-not-exist/; do
printf "%s " "$u"
curl -s -o /dev/null -w "status=%{http_code} redirect=%{redirect_url}\n" "$SITE$u"
done
curl -s "$SITE/" | grep -oiE "<meta[^>]+name=.robots.[^>]*>|<link[^>]+rel=.canonical.[^>]*>"
curl -s "$SITE/robots.txt"
Part two, hand the output above over with this text:
Role: website launch reviewer.
The output below came from the commands above, run against my site:
{paste the output right here}
The site goes live today and {one line: it is new, or it replaces a previous site}.
- List everything that does not fit a site that is going live, most important first.
- For each item write what breaks and which command checks it again.
- List separately what this check cannot see at all.
- Do not guess or write anything that is not in the output.
Before you trust the output: This check shows what the server tells curl, and you should know that boundary: Google crawler may see something else, because some sites answer differently by user agent or by country and some tags are added with JavaScript; for that case the URL inspection tool in Search Console gives the definitive answer. A cache layer can also hand you an old copy, so add a random parameter to the address if you are in doubt. And a detail we lost time on ourselves: the pattern above deliberately replaces the quote with a dot. The theme of this site prints the robots tag with single quotes, so a search for name with double quotes finds nothing and you conclude the tag is absent while it is sitting right there.
AI in this kind of work
On this topic a language model is a second pair of eyes on configuration text, and at that it is genuinely good: it reads robots.txt, response headers, a redirect list and DNS records accurately and tells you what each line implies. Our position is one sentence: give it the real output, not your description of the state. The difference between those two is the difference between a check and a reassuring conversation.
Tools that actually help
- Claude Good at reading a raw output and turning it into a ranked list, and it explains the reason behind each item if you ask. Iran is not on Anthropic supported-countries list; we read that on Anthropic own page.
- Gemini Enough for configuration questions and for explaining a DNS record in Persian. Google own page says the Gemini web app runs in over 230 countries and territories, and Iran is not on that list.
- Claude Code Because it works in your own terminal it can run the commands itself and read the answer there; that pays off when several sites have to be checked in a row. It installs free but needs an Anthropic subscription, and Iran is not on the supported-countries list.
Where it backfires
Three risks, and the first is the most common of all: the model believes you. If you write that you removed the noindex, the answer is built on that and nothing contradicts it, because the model cannot open your site. The only thing that fixes this is handing over the real output. Second, read robots.txt suggestions carefully: rules that block CSS and JavaScript still turn up in answers, while Google needs those files to render the page; and a blanket Disallow written for staging, if it gets copied to production, is exactly the disaster this lesson warns about. Third and simple: the API key of your DNS service, the hosting password and login details have no place in a chat window. For how each tool can be paid for from Iran, see the buying guide.
Sources: Google: block search indexing with noindex Google: build and submit a sitemap Google: verify site ownership in Search Console Google: email sender guidelines Anthropic: supported countries Google: where Gemini Apps are available
Where this advice stops
This list gets a site launched without an own goal; making the site good is a different job and does not come from a list. It has three clear boundaries. First, it is written for a brochure or company site; an online shop also needs a payment path, more legal pages and a real test purchase. Second, moving from an old site is not the subject of this lesson and is a larger job whose heart is the redirect map for the previous URLs; that cannot be turned into one line of a checklist. Third, the numbers we quoted from our own server, such as the thirty day edge cache, are this server configuration and not a law of nature; on your host there may be no such layer at all.
From our own work
Three things checkable on this site own server, all three of them among the items this lesson warns about. First, mail: the sending path is Postfix and two of its settings are deliberately pinned to version four of the protocol, inet_protocols and smtp_address_preference both ipv4. We rechecked the reason today: the version four address of this server has a reverse name and the version six address has none at all, and mail leaving from an address with no reverse name is treated with suspicion from the start. The DKIM signature is applied by a milter on 127.0.0.1 port 11332. And the thing we actually look at is the send log, not the green message on the form. Second, cache: the headers on public pages here tell the edge to keep the HTML for 2592000 seconds, thirty days; that one line explains why a fix made after launch may not reach a visitor for hours. Third, a small trap we have fallen into ourselves: the theme of this site prints the robots tag with single quotes, so any search that writes name with double quotes finds nothing and tells you the tag is absent while it is sitting right there.
Real follow-up questions
I launched the site but it is not in Google. How long should I wait?
Before waiting, check two things: the robots tag in the page source and the robots.txt file. If both are right, open Search Console and test the address with the URL inspection tool; it tells you whether Google has seen the page and what stopped it. Waiting without those two checks is wasted time.
I have an old site and want to replace it with a new one. Is this list enough?
No. A replacement is a separate job whose most important part is the redirect map: a list of every old URL and where each one goes with a 301. Without that map, pages that ranked for years land on 404s and their standing is lost. Run this list after that map, not instead of it.
Do I really need a separate staging version?
For a five page site, no, and building on the same domain behind a coming soon page works fine. From the point where the live site has traffic, the answer changes: any change made straight on production is tested on real visitors. If you do keep a staging version, close it with a password rather than only with noindex.