GAP School Module 01 — Foundation Lesson 1.4

Security for small business websites fails in two ways: either it's non-existent (nothing configured, everything default) or it's so locked down that legitimate operations get blocked and the developer spends half their time whitelisting. The goal is a baseline that blocks real threats, surfaces real problems, and stays out of your way.


The situation

WordPress security has a bad reputation because most WordPress sites are poorly secured. The platform itself isn't the vulnerability — the vulnerability is the combination of outdated core, unupdated plugins, weak admin credentials, and no monitoring. Hit any of those four and you're exposed.

For a business running a sales platform — with customer data, lead records, and active email/SMS communications — the stakes of a breach are higher than "the website looks defaced for a day." It's customer data exposure, reputation damage, and depending on what the site handles, regulatory liability.


What I did

Four layers.

Layer 1 — Wordfence (application-layer firewall)

Wordfence runs inside WordPress — it intercepts requests at the PHP level before they reach your application code. This catches things Cloudflare WAF misses: WordPress-aware attacks like wp-login.php brute force, XML-RPC abuse, known plugin exploits.

Wordfence key configuration decisions
Firewall mode: Extended protection (PHP early launch) — Runs Wordfence before WordPress loads; even direct-to-PHP requests that bypass WP routing are caught. Login security: — 2FA enabled for all admin accounts — Lockout after 5 failed attempts / 30-min lockout — Hide WordPress version from unauthenticated requests Alerting: — Admin email on any successful admin login from a new IP — Admin email on any blocked attack — Daily malware scan summary Blocked: xml-rpc.php (no legitimate use case on a modern WP install)

The extended protection mode (early launch) is the most important configuration item. It requires adding one constant to wp-config.php:

wp-config.php
define('WFWAF_EARLY_LOAD', '1');

Without this, Wordfence runs after WordPress bootstraps — meaning a fast exploit could get through before the firewall is active. With early launch, the firewall is up before any plugin or theme code runs.

Layer 2 — Cloudflare WAF (edge-layer firewall)

From a security baseline perspective:

  • Managed rulesets enabled: OWASP, WordPress-specific rules
  • Rate limiting on wp-login.php and any admin endpoints
  • Security level: Medium (balances blocking bots vs allowing legitimate traffic)
  • Bot Fight Mode: On (blocks known bad bots at Cloudflare's edge)

Cloudflare WAF + Wordfence together cover different attack surfaces. Cloudflare blocks at the network/HTTP layer — it never reaches your server. Wordfence blocks at the PHP layer — catches things Cloudflare lets through. They don't conflict; they're defense in depth.

Layer 3 — Daily backups with tested restore

Backups are not backups until you've verified a restore. Most hosting backup systems say "backup completed" and you find out the backup is corrupt when you actually need it. That's the worst possible time.

Backup setup for the Anchor build:

  • Cloudways automated snapshots: Full server snapshot daily at 3am. Retained for 4 weeks. This is a point-in-time snapshot of the entire server — files, databases, configs. Restore takes ~10 minutes.
  • UpdraftPlus to remote storage: Daily WP files + database backup pushed to cloud storage (R2 or S3). Independent of the server — if the server itself is compromised, the backup is safe elsewhere.

The backup schedule gets verified manually on the first of each month: pull the latest backup, run a restore on staging, verify the site loads and the database is current. Not glamorous but it's the only way to actually know your backups work.

Layer 4 — UptimeRobot monitoring

UptimeRobot pings the site every 60 seconds from multiple geographic locations. If the site returns anything other than HTTP 200, it alerts via SMS and email.

UptimeRobot configuration
Monitor type: HTTP(S) Check interval: 1 minute Alert contacts: owner SMS + developer SMS Alert when down for: 1 check failure (immediate — no grace period) SSL certificate monitoring: Yes, alert 30 days before expiration Separate monitors for: — Homepage (the obvious one) — Inventory archive (highest traffic page) — /wp-admin/ (if this errors, there's an application-layer problem) — Lead form endpoint (if this errors, we're losing leads silently)

Why specific endpoints, not just the homepage: the homepage returning 200 doesn't tell you if your lead form is broken or your inventory pages are erroring. Monitor the things that matter to the business.


Why it matters

Security incidents at small businesses follow a pattern: nothing is configured, the breach goes unnoticed for weeks or months, the cleanup is expensive, the reputation damage is lasting. Most of these are preventable with a competent baseline.

The secondary benefit of this setup is operational visibility. The Wordfence live traffic log and the UptimeRobot alert history give a clear picture of what's hitting the site. Before touching any infrastructure, I check these. They tell me if something changed — a spike in blocked requests, a pattern of 404s from a new referrer, anything that indicates I'm not looking at the baseline I thought I was.


The Anchor build

The Anchor build has not had a successful breach since launch. Wordfence blocks several hundred malicious requests per day — mostly automated WordPress vulnerability scanners, wp-login brute force attempts, and known plugin exploit patterns. None have gotten through.

The one incident worth documenting: three months post-launch, UptimeRobot fired an SMS alert at 2am. The site was returning 502. Root cause was a PHP-FPM worker count exhaustion — a traffic spike from a marketplace feed sync hitting at the same time as a scheduled email sequence. Fixed in 20 minutes by bumping PHP-FPM max_children from 10 to 20 on the Cloudways panel.

The alert gave 2am visibility instead of 9am discovery. That's the point of the monitoring setup. You find out when it happens, not when a client calls.


Do this, not that

  • Install Wordfence in extended protection (early launch) mode from day one. The default installation doesn't enable this — you have to add the constant manually. It's the difference between a firewall that's almost-always-up vs always-up.
  • Disable XML-RPC. There is no reason a modern WordPress site needs it. It's a persistent attack vector with no legitimate use case on a non-legacy site.
  • Test your backups on a real restore, on a real schedule. A backup you haven't tested is a hope, not a backup.
  • Monitor specific endpoints, not just the homepage. The homepage returning 200 doesn't tell you if your lead form is broken or your inventory pages are erroring.
  • Set up SMS alerts, not just email. Email gets filtered. SMS wakes you up. For a production sales platform, you want to know immediately.
When you’re ready to build

The lessons are yours. When you want it built, we’re here.

Every lesson stays free — no account, no paywall, no email gate, ever. But if you’d rather have this system standing on your business than wire all 48 lessons yourself, leave your email. We’ll send you a direct line to a build — and you’ll be first to hear when we add new tools to the curriculum.

None of this gates a single lesson. The curriculum was free before you got here and it stays that way.

We’ll use your email to send you a fast-track to a GAP build and occasional notes on how GAP builds digital sales departments. Lessons stay 100% free — no email required to read any of them. We never share or sell your information. Unsubscribe any time. Privacy policy at gapindustriesllc.com/privacy.html.

Done learning how it’s built? We’ll build it.

You came here to understand the system, and now you do. If you’d rather have it standing on your business than spend the next three months wiring it yourself, GAP Concierge is the same architecture from these lessons — a white-label AI agent that knows your catalog and captures your leads — set up for you, from $97/mo.

See GAP Concierge →