DEV Community

qrstudiovault
qrstudiovault

Posted on

I built a freemium SaaS on WordPress in 4 months — here's the stack, the mistakes, and lessons learned

I built a freemium SaaS on WordPress in 4 months — here's what I learned

Today I'm launching QR Studio Vault (https://qrstudiovault.com), a freemium QR code generator. It's my first SaaS, built solo, on WordPress. Here's the full story.

Why WordPress?

When I told other developers I was building SaaS on WordPress, I got laughed at. "Use Next.js." "Use Laravel." "WordPress is for blogs."

Here's why I chose it anyway:

  • I'm solo. Speed matters more than prestige.
  • Paid Memberships Pro handles subscriptions, access control, drip content — $0 upfront.
  • WordPress has 50,000+ plugins. Almost anything I needed already existed.
  • Hosting is cheap (~$10/mo vs $50+ for Vercel + database).
  • SEO is battle-tested.

The stack:

  • CMS/Framework: WordPress 6.x
  • Membership/subscriptions: Paid Memberships Pro (free core)
  • Payment gateway: PayPal (more on this below)
  • QR generation: Custom engine built on top of qrcode.js with SVG rendering
  • Caching: [your cache plugin]
  • Email: WordPress + SMTP plugin
  • Hosting: [your host] with SSL

The 9 QR code types

I built support for:

  1. URL (standard)
  2. WiFi (auto-connects)
  3. vCard (contact info)
  4. Email (prefilled)
  5. SMS (prefilled text)
  6. Phone (auto-dial)
  7. Plain text
  8. Location (opens maps)
  9. Event (adds to calendar)

The SVG rendering for vCard was the hardest — encoding contact data creates very dense QR codes that needed optimized rendering.

The Stripe disaster

I set up Stripe in live mode, tested it, everything worked. 24 hours before launch, Stripe banned my account with zero explanation. No appeal. No specifics. Just "not a fit for our platform."

Scrambled to set up PayPal. Took 2 days of debugging webhook issues:

  • PMPro auto-registered a webhook that didn't actually exist in PayPal
  • I ended up with 3 stale webhooks with wrong URLs
  • Users were being created but not assigned memberships

Lesson: always have a backup payment gateway ready BEFORE launch.

The PayPal webhook fix

For anyone doing PMPro + PayPal:

  1. Log into PayPal Developer Dashboard
  2. Delete ALL existing webhooks
  3. In WordPress, clear Client ID + Secret → Save
  4. Paste credentials back → Save (forces fresh registration)
  5. Verify webhook URL is: https://yourdomain.com/wp-json/pmpro-paypal/v1/webhook
  6. Subscribe to ALL events (or minimum: PAYMENT.SALE.COMPLETED, BILLING.SUBSCRIPTION.ACTIVATED)

Pricing strategy

  • Free: 5 codes/month
  • Starter: $9.99/mo (50 codes)
  • Pro: $19.99/mo (500 codes + SVG)
  • Business: $49.99/mo (unlimited + API)

Competitors charge $30-50/mo for basic SVG exports. My Pro plan is deliberately underpriced to win the "I just need a nice QR code with my brand colors" market.

Mistakes I made

  1. Scope creep. Cut 4 features last minute to ship.
  2. No email list. I have no one to tell about my launch.
  3. No warm audience. Building in public would've helped.
  4. Underestimated payments. Payment setup took 30% of my build time.
  5. No marketing prep. Should've written launch posts weeks in advance.

What went right

  1. WordPress speed. I shipped in 4 months what would've taken 8 in Next.js.
  2. Real free tier. No dark patterns.
  3. Fair pricing. Customers tell me it's refreshing.
  4. SEO foundation. WordPress + Yoast gave me a head start.

What's next

  • [ ] Add Stripe via a different business structure
  • [ ] Build Zapier integration
  • [ ] Launch API docs site
  • [ ] SEO content push (10 articles in 30 days)

Try it

If you use QR codes, try the free tier — no credit card:
👉 https://qrstudiovault.com

Would love feedback from this community especially on the API design.

Building solo, launching scared, doing it anyway. 💪

— Diego

Top comments (0)