The current appzapper.com is a static marketing page with 3 PHP endpoints handling payments, license lookup, and downloads. That's it. The entire backend logic fits in a single Cloudflare Worker.
The store uses the OLD Stripe Checkout (checkout.js, deprecated) β not Stripe Checkout Sessions or Payment Links. This needs to be updated regardless of migration.
β‘
Migration: What Changes
π
Nameservers: GoDaddy β Cloudflare
GoDaddy stays as registrar (owns the name). Cloudflare handles DNS. ~5 min change, 1-24hr propagation.
π
charge.php β Worker route /api/charge
Stripe Checkout Sessions (modern API) β webhook β generate license β email via Resend. Already 90% built in forge-mail.
π
lostcode.php β Worker route /api/lostcode
Email lookup against D1 customer database (133K records already migrated). Resend the license.
π
download.php β R2 bucket or redirect
Serve DMG from Cloudflare R2 (cheap, fast, global CDN) or redirect to existing host during transition.
Need to know where this lives. If GoDaddy email β set MX records on Cloudflare pointing to same servers. Or forward to Gmail/Cloudflare Email Routing.
AppZapper Store
Not a subscription. Buy it and you own it.
Single
$19.95
1 Mac
Family
$34.95
3 Macs
Agency
$97.00
10 Macs
π³
Checkout
Powered by Stripe Checkout Sessions (modern API)
Current site uses deprecated checkout.js. New flow uses Stripe Checkout Sessions β redirects to Stripe-hosted page, returns to appzapper.com/success.
π
Lost Your License?
Currently: lostcode.php β AJAX lookup
β‘
POST /store/lib/stripe_box/charge.php
β Worker: POST /api/charge (Stripe webhook handler)
This is the most critical endpoint. When Stripe confirms payment, this generates the license key and emails it to the customer. Here's the full flow:
1
Customer clicks "Buy" on /store
Creates Stripe Checkout Session β redirect to checkout.stripe.com
2
Customer completes payment on Stripe
Card charged β Stripe fires webhook to our endpoint
3
Webhook hits Worker β verify signature
Validate Stripe webhook signature to prevent spoofing
4
Generate license key (hardcoded algo)
Same algorithm Austin uses in the app. Key = f(email, product, timestamp)
5
Store customer in D1
INSERT into customers table (133,165 existing records)
6
Email license to customer via Resend
from: [email protected] β customer's email with license key + download link
7
Redirect customer to /success
"Check your email" confirmation page
β οΈ
Known Issue: License Emails
"We get several emails daily from people who don't receive their license" β this is the #1 support burden. The current PHP flow has no retry, no logging, no fallback. The Worker version should:
Log every send attempt to D1 (email_sends table)
Retry failed sends 3x with exponential backoff
Push a notification to Brian via ntfy on any failure
Provide a /api/resend/:chargeId endpoint for manual retry
π
POST /store/lostcode.php
β Worker: POST /api/lostcode
Customer enters email β lookup in DB β resend license key. Currently an AJAX call to lostcode.php that returns an inline response.
// D1 query
SELECT * FROM customers WHERE email = ''
// Result
π‘
Improvement: AI-Powered Support
Instead of just looking up the code, the Worker could handle common support patterns automatically. "I bought it but didn't get my email" β check email_sends β resend. "I need a refund" β link to refund flow. "Will it work on my Mac?" β check system requirements. This alone could eliminate 80%+ of the [email protected] inbox.
π¦
GET /download.php?file=appzapper203.zip
β Worker: GET /download/:version
Currently serves a 935KB zip file from the PHP server's filesystem. Two options for the Worker:
Option A: Cloudflare R2 bucket
Upload DMG/ZIP to R2. Worker serves from R2 with proper Content-Disposition headers. Global CDN, fast everywhere, pennies/month. Can track download counts in D1.
Option B: Redirect to existing host (transition)
Worker 302 redirects to the GoDaddy IP (107.180.50.231) for downloads while we migrate. Zero risk, zero file copying. Switch to R2 later.
Note: AppZapper 3000 will need a NEW download URL. Austin will provide the build. The old appzapper203.zip stays for existing v2 customers.