VBVolleyball coaching membership site
Tens of thousands of members on slow shared hosting. Rebuilt on four servers.
- WordPress
- s2Member Pro
- WooCommerce
VPEmbeddable video playlist platform
Client project, not public
Multi-tenant video playlists with permissions, embeddable on other sites.
MSMulti-sport content network
Rebuilt from scratch with a custom content import. One install, a sub-site per sport.
- WordPress
- s2Member Pro
- Custom import scripts
AFAuto Funnel Press
My own product
Funnel and landing page plugin I built and sold to several hundred customers.
PPPositive Performance Training
Mental training membership site for athletes, plus iOS and Android apps.
- WordPress
- MemberMouse
- Hybrid mobile apps
MAMartial arts studio platform
Local studio's online platform: members-only Zoom classes, events, and a protected video course.
- WordPress
- LearnDash
- EventON
RDRoofing deductible payment plan platform
Custom WooCommerce plugin that turns an insurance deductible into monthly payments, with partner payouts.
- WooCommerce
- Gravity Forms
- AffiliateWP
Twenty years, more than this.
These are the projects I could describe in public. There's plenty more: smaller plugins, integrations, rescue jobs, and tools nobody outside the client ever saw.
Ask me about yours
Tens of thousands of members and thousands of videos, crawling on shared hosting. Moved it to a four-server setup, then added playlists, favorites and faster search.
- The problem
- Very slow on shared hosting, with tens of thousands of members, thousands of videos and many plugins. WordPress loads every active plugin on every request, so a plugin-heavy site pays that cost per process and per user. Code cleanup couldn't fix that; it needed a stronger back end.
- What I built
- Redesigned the site around s2Member Pro and moved it to four Linode servers: nginx web, a primary PHP server with a secondary taking overflow at a load cap, and an isolated database server. Later split the store onto a WooCommerce subdomain: two WordPress installs sharing one membership. Custom features included personal drill-video playlists, favorites and a more concise search, gated by membership level.
- The result
- Noticeably faster, plus features the old setup couldn't support.
- WordPress
- s2Member Pro
- WooCommerce
- PHP
- MySQL
- nginx
- Linode
A multi-tenant platform for organizing videos into playlists, restricting who can watch, and embedding them on other sites. Built for a long-time client to manage content for his own customers.
- The problem
- A long-time client managed video content for many customers and needed one place to organize it, control who could see what, and show it on each customer's site without hosting the videos or rebuilding a player every time.
- What I built
- A full-stack TypeScript monorepo: a NestJS API on PostgreSQL with Prisma, and a Next.js front end. It doesn't host video. It organizes videos from Vimeo and other sources into playlists, with admin and user roles, channel-scoped permissions, and member-only visibility. Auth uses JWT in HTTP-only cookies, checked in both the API and Next.js middleware. Playlists embed on third-party sites by iframe, restricted to allowed domains, with a custom CSS build for the embedded player. Deployed on Render with a managed database, plus a Docker setup that mirrors production locally.
- Next.js
- NestJS
- TypeScript
- PostgreSQL
- Prisma
- Tailwind
- Docker
- Render
One big membership system serving many sports. Rebuilt from scratch on a single WordPress install, with each sport as its own sub-site and the existing content brought over by a custom import.
- The problem
- One big membership system that needed to serve many sports, with a large library of content on the existing site that had to carry over to the new one.
- What I built
- Rebuilt the site from scratch on WordPress and s2Member Pro, using the same membership approach as the volleyball site. Instead of separate installs, category-based separation gives each sport (basketball, volleyball, lacrosse, softball and more) its own sub-site on a single install. Wrote a custom import script to pull the content out of the old site and into the new one.
- WordPress
- s2Member Pro
- Custom import scripts
- PHP
AFAuto Funnel Press
My own product
Funnel and landing page system for affiliate marketers. Built, sold and supported across two versions to several hundred paying customers.
- The problem
- Affiliate marketers needed funnel and landing pages that capture leads, with optional paid gating.
- What I built
- A premium WordPress product with AWeber, Mailchimp and GetResponse for email capture and Stripe and Authorize.net for payments. Version 1 was a custom theme with a license system I wrote. Version 2 was rebuilt as a plugin on Easy Digital Downloads and its Software Licensing add-on, with custom Elementor blocks and a custom Zapier endpoint, so customers could connect services I hadn't built in. I was the only developer, working with a marketing partner.
- The result
- Several hundred paying customers across both versions. About half of v1 customers migrated to v2. Retired once the market was too narrow to justify another rebuild; the site is still up.
- WordPress
- PHP
- Stripe
- Authorize.net
- Easy Digital Downloads
- AWeber
- Mailchimp
- GetResponse
- Elementor
- Zapier
A former pro women's basketball player wanted a player-focused training app before that was common. Two years of work grew a simple membership site into a custom content platform, plus iOS and Android apps.
- The problem
- A former pro women's basketball player and her business partner wanted a player-focused training web app, years before that was common.
- What I built
- A custom LMS-style experience on WordPress and MemberMouse. MemberMouse handled memberships; custom code delivered her content as a training platform. I also shipped iOS and Android apps: a hybrid wrapper around the web platform that signed members in with their WordPress accounts and played guided mental training audio. Getting members signed in across the site and the apps was the hardest part.
- The result
- Grew over about two years from a simple membership site into a large, content-driven custom platform with companion mobile apps. The site is now just a sales landing page, so the platform and apps I built no longer run.
- WordPress
- MemberMouse
- Hybrid mobile apps
- PHP
A local martial arts studio needed its members to keep attending classes online during Covid. It grew into the studio's own membership, events and course platform, built by wiring several WordPress plugins together.
- The problem
- During Covid, a local studio needed existing members to be able to join classes over Zoom. Later it wanted to run its regular events, like quarterly graduation parties and monthly parents' nights, without relying on Eventbrite, and to sell the head instructor's video series as a standalone course without the videos being easy to share around.
- What I built
- A small-business platform on WordPress, WooCommerce, WooCommerce Memberships, EventON and LearnDash, with a lot of small custom touches to make the separate plugins work as one system. The Zoom classes themselves were open, but the invites lived in a members-only area, so you had to be a logged-in member to get them. The studio's recurring events moved onto the site. I structured the head instructor's video series into a course sold separately from the membership, delivered through LearnDash, with the videos on a private Vimeo account and Vimeo's domain lock so they only played on the studio's site.
- The result
- Started as a Covid-era way to keep classes running and grew into the studio's events, membership and course platform.
- WordPress
- LearnDash
- EventON
- Vimeo
- WooCommerce
- WooCommerce Memberships
A custom WordPress plugin that lets homeowners spread an insurance deductible over up to seven years, while roofing partners earn tracked residual payouts on the plans they refer.
- The problem
- Homeowners needing a reroof often can't pay the insurance deductible up front, and contractors can't absorb or defer it for them. The service needed a way to turn the deductible into automated monthly payments, and to pay referring roofing companies their share.
- What I built
- A custom plugin tying together WooCommerce, WooCommerce Subscriptions, AffiliateWP and Gravity Forms. It wasn't a membership site, so I wrote my own user handling, with separate dashboards for homeowners and for roofing partners. A multi-step Gravity Forms form with custom validation takes the deductible, the number of months (up to seven years) and any deposit the roofing company requires. It calculates the monthly payment and sign-up fee, then prices the order on the fly: the store has only two products, a subscription and a pay-in-full option, and the price is set per customer at checkout. A processing page bridges the form to the WooCommerce checkout, and Stripe runs through the standard WooCommerce gateway. AffiliateWP tracks each partner's homeowners, and partners are activated by hand with an activation code. The calculation layers a flat processing fee, a sliding-scale fee on down payments, an account setup fee and a retained share of partner residuals, each with its own payout timing. Homeowners get a custom My Account tab showing their active plan, payment history and expiration date.
- The result
- Launched and ran with a partner's roofing jobs on it.
- WooCommerce
- Gravity Forms
- AffiliateWP
- WooCommerce Subscriptions
- Stripe
- PHP
- WordPress