User guide
Development and staging sites
Staging never consumes a licence slot. The full list of what we detect, why staging-cafe.com is charged as a real site, and what to do if we get it wrong.
A development or staging site never consumes a licence slot. It activates normally, gets updates normally, and is free — even when every paid slot on the licence is already in use.
This is not generosity. Agencies build on staging and push to production, so if staging burned a slot every one of them would open a ticket, and we would rather write a detection list than answer that ticket for the rest of time.
What we detect
Detection is on the host only. The list is explicit rather than clever, and it is published here because it is a pricing rule, not an implementation detail.
Local development
| Matches | Covers |
|---|---|
localhost, *.localhost | Any local server |
| Any raw IP address | IPv4 or IPv6, public or private |
*.local | Local by WP Engine, mDNS |
*.test | Reserved for testing by RFC 6761 |
*.dev.cc | Older Local by Flywheel |
*.ddev.site | DDEV |
*.lndo.site | Lando |
Every IP address counts, not only the private ranges. A production WordPress site is served on a domain; an activation reporting a bare address is a container, a VM, a direct-to-origin check, or a site that has not been pointed at its domain yet.
Managed host sandboxes
| Matches | Host |
|---|---|
*.wpengine.com | WP Engine |
*.wpenginepowered.com | WP Engine |
*.kinsta.cloud | Kinsta |
*.flywheelsites.com | Flywheel |
*.flywheelstaging.com | Flywheel |
*.cloudwaysapps.com | Cloudways |
*.pantheonsite.io | Pantheon |
*.platformsh.site | Platform.sh |
Environment-name subdomains
staging, stage, dev, test, uat and preprod, matched structurally — read the
next section, because this is the part that behaves differently from how people expect.
Why staging-cafe.com is a real site
Nothing here is matched as a substring. For an environment name to count, a whole dot-separated label has to equal the keyword, and it has to leave at least two more labels after it.
So these are free:
staging.example.com
dev.example.com
shop.staging.example.com
uat.example.co.uk
And these are charged as ordinary production sites:
staging-cafe.com
devonshire.com
mydevsite.com
staging.com
staging-cafe.com is a real business with a real website, and a substring match would have
quietly made it free forever. staging.com is an apex domain that happens to be named
“staging” — there is nothing after it but a TLD, so it is somebody’s actual site.
Hosts we deliberately left out
Four plausible-looking domains are not on the list, because all four are routinely used as the live address of a real site rather than as a sandbox:
*.sg-host.com(SiteGround)*.myftpupload.com(GoDaddy)*.nxcli.net(Nexcess)*.go-vip.net(WordPress VIP)
If you are genuinely staging on one of these, tell us — adding one is a configuration change, and these four are first in the queue.
Known false positives
Two cases where we will call a site “development” when it is not, both fixable per account without a plugin update:
- an apex domain whose first label is one of the keywords under a two-part public suffix,
like
dev.co.uk; - a live Pantheon or Platform.sh site that never had a custom domain attached.
Being wrong this way costs you nothing, so neither is urgent — but if a free slot on your account looks wrong in the dashboard, that is probably why.
A free site is still a licensed site
A development site bypasses the site limit. It does not bypass the licence itself: an
expired or revoked licence cannot activate localhost either. “Development sites always
work” is a statement about counting, not a way around a dead licence.
And as everywhere else: a plugin on a development site whose licence has lapsed still runs. See When a licence expires.