How This Blog Is Set Up (and What It Costs)

An earlier version of this page told you how to start a blog that makes money. It described a ladder from affiliate links to display ads to your own product, and it put figures against the rungs. I wrote none of those figures down from experience, because this blog has never earned a cent, and I have deleted the whole thing.

What is left is the part I can actually document: how this site is built, what each piece costs, what I got wrong, and what it earns today, which is nothing. If you are looking for a revenue projection, this is the wrong page. If you want to see the inside of a small WordPress blog with the lid off, including the parts that are embarrassing, read on.

What the site is made of

PieceWhat it is hereCost
DomainA .com with a non-ASCII character in itRegistrar’s annual fee
HostingHostinger shared, LiteSpeed, PHP 8.3.33Shared with two other sites of mine
PlatformSelf-hosted WordPressFree
ThemeA block theme generated by the host’s AI flowIncluded
PluginsFour, three of which came with the hostingFree
CertificateLet’s Encrypt, issued automaticallyFree
EmailMailboxes on the domain, from the hosting planFree for the first year
Analytics and searchSearch ConsoleFree
AdvertisingAdSense code in the head, ads.txt at the rootFree, and currently earning nothing
The state of the site on 20 September 2026.

There is no premium theme, no page builder, no paid SEO suite and no email marketing tool. Not out of minimalism as a philosophy — I just have not needed them, and a blog with no readers does not need an email platform.

The domain has an ñ in it

I registered a Spanish-language domain name for an English-language blog, which is the first decision I would take back. The bigger consequence is technical: a domain with a non-ASCII character is transmitted in punycode, so the address of this site on the wire is xn--reseasdehostingpro-q0b.com.

That is not a bug and everything works. It does mean a permanent second spelling for every address on this site, and that is the spelling Search Console, certificates, logs and command-line tools show back to me. Everything it touched, and the checks I would run before buying a name like it, is in buying a domain: the trap nobody warns you about.

One shared plan, three sites

This blog is not alone on its hosting. It shares a Hostinger shared plan with a second blog and with my agency’s own site: three sites, one plan, one hPanel login.

The plan on Hostinger’s page that matches what I run — three sites on one account — is Premium: $2.99 a month on the 48-month term, renewing at $10.99, with 20 GB of storage, a free domain for the first year, weekly backups and two mailboxes per site free for a year (Hostinger web hosting, checked 20 September 2026). I am not publishing my own invoice: it reflects the term and the promotion on the day I signed up, not what you would be offered today. The renewal figure is the honest number, and split across three sites it is the cheapest line in this whole post.

Two things in that sentence deserve more attention than they usually get. The mailboxes are free for the first year, which means a later bill the headline does not show. And weekly backups are not daily backups: on Premium, the worst case is losing a week.

The install took ten minutes. The decisions did not.

WordPress, the self-hosted kind rather than the WordPress.com subscription, went on through the panel’s one-click installer, and the theme came out of the host’s AI site-building flow. From “I have a domain” to “there is a site here” was one evening, which is genuinely how it works now and is not the hard part of anything.

The decisions I made in those first weeks without thinking about them are the ones that cost me later. The AdSense snippet went into the theme’s functions.php a few weeks after launch, and because that theme is a parent theme, a theme update would have wiped it without any visible error. There was no caching plugin, and I assumed from day one that there was. There was no SEO plugin, so every post shipped without a meta description, without Open Graph tags and without structured data. And the old static site that used to live on this domain stayed in the web root, live and indexable, long after WordPress replaced it.

None of that was visible from the dashboard. All of it was visible from outside with curl. The plugin side of the clean-up is in the plugins I keep, and the one I just removed.

ads.txt, the easiest file on the list

One line, one file, at the root of the domain:

google.com, pub-0000000000000000, DIRECT, f08c47fec0942fa0

Your own publisher ID replaces the zeros; the last field is Google’s certification authority ID and is the same for everyone. Google describes ads.txt as not mandatory but highly recommended, with one catch that is worth understanding: if the file exists and does not contain your ID, your status flips to unauthorised and ad requests get refused (Google’s ads.txt guide). Having no file is safer than having a wrong one. Changes can also take days to be picked up, or longer on a site with little traffic, so it is not a file to leave until the last minute.

Check it the way a crawler would, not by opening the file manager:

curl -s https://example.com/ads.txt

Search Console, and the two lines I had wrong

The robots.txt on this site pointed search engines at a sitemap that belonged to the previous, static version of the blog — an index listing twenty-seven URLs that WordPress knows nothing about. The real one, the sitemap WordPress generates at /wp-sitemap.xml, was not referenced anywhere.

The same file also started with a byte order mark: three invisible bytes, EF BB BF, in front of the first directive, left there by whatever editor wrote it. Depending on the parser, that can make the first line unreadable. You will never see it in a browser. You see it immediately with curl -s https://example.com/robots.txt | od -c | head -1, which should begin with U s e r and nothing else.

The Search Console side has its own small trap: submit the sitemap with its full URL rather than the bare filename, and delete old sitemaps that no longer resolve instead of leaving them in the list throwing errors at you forever. I go through the screens I actually use in Search Console: the parts that actually matter.

What it costs a month

At published prices, and dividing the shared plan three ways, the recurring cost of this blog is about a third of $10.99 a month at the renewal price, plus a domain renewal spread over twelve months. Call it four or five dollars a month. Everything else on the list above is free, and stays free at this size — the certificate, the platform, the plugins, the mailboxes for now, Search Console.

What is not in that figure is the only expensive thing here. Ninety posts got written, and the audit that followed took days. If your time has a price, the hosting bill is a rounding error and always was.

What it earns

Nothing, and I want to be exact about that rather than vague.

The AdSense code has been in the head of this site since the summer. The site’s status in AdSense has been “Getting ready” since 31 August 2026 and, as I write this on 20 September, it has not been approved and no advertisement has ever been served on this domain. Since 27 September 2026 I am in one programme, and only one: Hostinger’s referral scheme, which pays me 20% of a sale and gives the buyer 20% off. Four posts carry that referral link, each in a box that says what it is. Every other outbound link to a provider is still marked rel="nofollow" and carries no tracking ID, including the pricing pages I cite as sources. Nothing was rewritten to sell anything: the recommendations, the prices and the measurements are exactly what they were before the link existed.

I am also not going to tell you what this blog might earn later. I have no traffic worth reporting, no approval, and no data. Anyone publishing a revenue timeline on a site in this condition is guessing, and I have already published one version of this page that did exactly that.

If I set it up again tomorrow

Publish less, more slowly. Twenty-six posts went up here in about three weeks. They were short, they followed the same template, and none of them contained anything a reader could not have found in ten other places. A blog that publishes at a rate no human could sustain is telling everyone what it is.

Remove the old site before launching the new one. Moving the files out of the web root takes five minutes. Leaving them there gave me months of an obsolete site competing with the real one on its own domain.

Decide the consent question before installing anything. I installed a consent plugin, saw a banner, and assumed the requirement was met. It was not, for reasons that took an afternoon of reading to understand.

Check everything from outside. Every problem in this post was invisible in wp-admin and obvious in a response header. That habit, more than any plugin, is what changed how this site is run — and it is the same habit I apply to a site from the first hour in how I build a small business site, start to finish.

Which leaves the setup in its current state: cheap, small, honest about what it is, and finally pointing at its own sitemap. The version of this page that promised you a thousand dollars a month is gone, and it is not coming back.