Case Study
44 YEARS IN PRINT. REBUILT IN 5 WEEKS.
A bi-monthly publication's full publishing platform. Site, membership system, 123K-user data migration, custom email infrastructure. Delivered six months ahead of contract.
Print & Digital Publishing
Austin, TX
Website & Platform Rebuild
March to May 2026
A 44-year-old subscription publication needed to leave a retiring legacy stack without losing a single subscriber, mailing, or deliverability point.
We rebuilt the platform from scratch and brought every record across with passwords intact.
123,073
User Accounts Migrated
Day-one login compatibility via bcrypt cost-10 hashing
5 WEEKS
Signing to Launch
Against a 7-month contract deadline
ZERO
Paid Plugins
Custom membership engine, custom blast tool, no licensing tax
The Situation
The Caretaker Gazette is a bi-monthly subscription publication that has been in continuous print since 1983. The site, member system, and ad-order forms ran on a PHP 5.3.29 SMART framework on a Linode box managed by a third-party admin. Newsletter blasts ran on self-hosted Pommo on the same Linode infrastructure. Reactivation campaigns and welcome flows depended on that same machine staying online.
Three pressures hit at once. The legacy admin announced he was retiring his server. PayPal flagged the publisher's integration as out of compliance with current standards. And the existing site was effectively unusable on mobile, which on its own can tank conversion rates for a subscription business. There was no path to keep the existing stack running, and no time to replatform incrementally.
A data audit on the dump showed 121K plaintext passwords sitting in MySQL, 63K encrypted credit card blobs, 43K CVVs, and a `status` field that had drifted out of sync with renewal reality (active subscribers were sometimes flagged EXPIRED because the publisher updated the `last_issue` field on every renewal but rarely flipped status). Any migration that trusted the status column verbatim would have lost current subscribers.
What We Built
Site & Brand
FOUNDATION
Custom WordPress theme with retiree-first typography (Cormorant Garamond at 15px minimum, Outfit body). Homepage filmstrip and embedded NBC Today Show clip. 19 public pages, 10 caretaker profiles, 123 archived sample issues. WCAG 2.1 AA pass with a 17-template mobile sweep at desktop and 375px breakpoints.
Membership Engine
ENTITLEMENTS
User-meta-driven custom system with no paid plugins. Five distinct statuses: active, expired, gift, lifetime, legacy. A 12-cell subscribe-page state matrix decides what each visitor sees across their current state and the four subscription tiers. Gift purchase flow synthesizes recipient accounts. Auto-renewal is opt-in, gated server-side to saved Square tokens.
Data Migration
PIPELINE
Idempotent 25-minute pipeline. SQL dump to local SQLite, Python ETL to clean CSVs, batched WordPress importers. 123K users brought across with bcrypt cost-10 password hashing, so subscribers log in on day one with their existing credentials. Renewal-recovery promotion logic uses `last_issue` as source of truth, beating the stale `status` column.
Database Footprint
FOOTPRINT
JSON-blob meta collapsing under transparent `get_user_metadata` filters cut usermeta from 4.48M rows to 3.16M rows, saving 149 MB. HPOS was abandoned for a custom flat-table that took order storage from a projected 5M-plus rows down to 204K. Final database lands at 796.7 MB with headroom against the SiteGround 1 GB cap.
Email Infrastructure
DELIVERABILITY
Custom SendGrid Web API adapter at `inc/sendgrid.php` preserves 5+ years of warmed IP reputation. Domain Auth and Link Branding CNAMEs in the SiteGround zone. SPF, DKIM s1 and s2 (2048-bit), and DMARC `p=none` aligned. A transparent `phpmailer_init` filter routes every WordPress and WooCommerce mail through one chokepoint with no per-caller rewrites.
Bulk Blast System
BLASTS
Pommo retired. Chunked self-rescheduling cron paced at 1,200 per hour matches the legacy deliverability cadence. Per-blast atomic locks survive PHP timeouts and server restarts. Two-bucket error log keeps the first 25 errors and the most recent 25 across a 50-hour run. RFC 8058 one-click unsubscribe and branded HTML chrome ship with every send.
Postal Mailing Flows
MAILING
Mid-cycle in-house envelope PDFs (FPDF, 9.5 by 4.125 inch) emailed to the publisher's son for stuffing and stamping. Four bi-monthly mailhouse CSVs (USA_BIG, USA_LAST_ISSUE, NON_USA_BIG, NON_USA_SMALL) for Thompson Mailing Solutions, replicating the legacy SMART export byte for byte so the printer's intake automation kept working without changes.
Content Workflow
ISSUE FLOW
Issue meta box plus media-picker PDF upload plus a `Process PDF` button extracts each bi-monthly issue to single-column HTML. Boilerplate filtering is revertable on a per-issue basis, so the publisher can roll a bad extraction back without touching code.
Admin Dashboards
CONTROL
A CG Dashboard top-level menu surfaces member breakdown SQL (active, gift, lifetime, expired, legacy). The unified Manage Member screen merges WooCommerce orders, ad CPT, and flat-table legacy orders into one timeline. A phone-search field on All Users makes call-in lookups instant.
Security & Cutover
CUTOVER
HSTS, X-Frame-Options, Referrer-Policy, and Permissions-Policy headers in `.htaccess`. All hardcoded keys rotated. Let's Encrypt R12 SSL. Send-button lockdown on bulk blasts until the publisher's first cleared send. Hand-curated SiteGround DNS zone matching Linode record by record before the manual GoDaddy nameserver flip.
Email Infrastructure, Verified
Domain Authentication, Link Branding, DKIM (2048-bit), SPF, and DMARC aligned on caretaker.org before the cutover. Transactional and bulk send paths verified end to end on the same SendGrid account that carried five plus years of warmed IP reputation.
The Site
Cormorant Garamond display type and a homepage filmstrip set the tone for a 44-year-old print brand. The subscribe page is a 12-cell state matrix that branches on visitor status across the four subscription tiers.
Inside the Admin
CUSTOM ADMIN, BUILT FOR THE PUBLISHER
Two custom admin screens replace the legacy SMART CMS and the self-hosted Pommo blast tool. Member counts, ad orders, blast composer, and postal mailing flows live in one WordPress dashboard.
The Numbers
Concrete cutover-day metrics from the production migration. The last three tiles call out the database savings, active-subscriber reconciliation, and final database size.
123,073
Users Migrated
187,420
Legacy Orders Preserved
6,527
Classified Ads Imported
0
Migration Errors
3 / 3
Bcrypt Logins Verified
8 / 8
Membership-End Spot-Checks
149 MB
Database Savings
1,897
Active Subscribers Reconciled
796.7 MB
Final Database Size
Common Questions
FAQ
Why a custom membership system instead of MemberPress or another plugin?
The publication has 121K users at scale, five distinct status types (active, expired, gift, lifetime, legacy), a 12-cell subscribe-page state matrix, gift-recipient synthetic accounts, and a lifetime tier safety net. No paid plugin handled all five cleanly without conflicting with WooCommerce. The custom code is roughly 1,200 lines and lives in the theme's `inc/` folder.
How was the publisher's warmed IP reputation preserved through the migration?
SendGrid was already the production sender. We took over the existing account (number 25545083), verified the existing Domain Auth and DKIM 2048-bit records, added Link Branding CNAMEs in the SiteGround zone, and routed every WordPress and WooCommerce mail through one custom Web API adapter. Five plus years of sending history transferred without a warmup pause.
What happens if SendGrid rate-limits a blast mid-send?
Bulk blasts run through a chunked self-rescheduling cron paced at 1,200 per hour (twenty messages every sixty seconds). Per-blast atomic locks survive PHP timeouts and server restarts. State persists in `wp_options` with autoload off. A 60K-recipient blast runs across roughly fifty hours, and two-bucket error logging captures the first errors seen and the most recent twenty-five.
How do existing subscribers log in on day one with their old passwords?
Bcrypt cost-10 hashing was applied during the migration. Three of three round-trip logins were verified before flip (RECIDs 50180, 51866, 143606). The legacy password hashing scheme was unwrapped at import time and stored in WordPress's native bcrypt format, so the standard `wp_check_password` call works unchanged.
How was the legacy stored credit-card data handled?
63K encrypted CC blobs, 43K CVVs, and 121K plaintext passwords were left behind. We do not import any payment data. New billing runs through Square (saved card tokens only) and PayPal. The legacy admin's server is being decommissioned with a Brandon-issued Certificate of Destruction.
What does ongoing support cover?
Hosting, SendGrid, Square, and 8 hours per month of engineering and support. Bi-monthly issue PDF processing, ad order monitoring, blast configuration, deliverability monitoring, and feature requests as they come up.
Got a Platform Rebuild in Front of You?
This kind of work falls under our full websites service. We build subscription platforms, run data migrations with day-one login compatibility, and stand up email infrastructure that keeps existing reputation intact.