clavitor/clavitor.ai/admin/SANDBOX.md

2.9 KiB

Clavitor Admin - Local Development (Paddle Sandbox)

Quick Start

1. Get Sandbox API Key

  1. Go to https://sandbox-vendors.paddle.com
  2. Log in (create account if needed)
  3. Go to Developer Tools > Authentication
  4. Create API Key (server-side) - copy this
  5. Create Client Token (client-side) - copy this too

2. Set API Key

Edit admin/sync.go:

const DefaultAPIKey = "pdl_sandbox_apikey_..."  // Your sandbox API key

3. Set Client Token

Edit admin/static/checkout.html:

const PADDLE_CLIENT_TOKEN = 'pdl_sandbox_clienttoken_...';  // Your sandbox client token

4. Create Products in Sandbox

  1. Go to https://sandbox-vendors.paddle.com
  2. Catalog > Products
  3. Create products:
    • Clavitor Personal - $12/year
    • Clavitor Family - $29/year
    • Clavitor Pro - $49/year
  4. Copy the Price IDs (look like pri_01xxx)

5. Update Price IDs

Edit admin/paddle_checkout.go:

var PriceIDs = map[string]string{
    "personal_yearly_usd": "pri_01xxxxxx",  // Replace with actual
    "family_yearly_usd":   "pri_02xxxxxx",
    "pro_yearly_usd":      "pri_03xxxxxx",
}

6. Run Admin Locally

cd /home/johan/dev/clavitor/clavitor.ai/admin
go run main.go

Open http://localhost:8080

7. Test Checkout

  1. Go to http://localhost:8080/static/checkout.html
  2. Select a plan
  3. Enter email
  4. Click "Subscribe Now"
  5. Use Paddle's test card: 4242 4242 4242 4242
    • Any future expiry date
    • Any 3-digit CVC
  6. Payment succeeds in sandbox
  7. Check webhook delivered to your local endpoint

Sandbox vs Production

Sandbox Production
URL sandbox-api.paddle.com api.paddle.com
Money Fake Real
Cards Test cards only Real cards
Webhooks Same format Same format

Webhook Testing

Paddle webhooks need to reach your local machine. Use one of:

  1. ngrok: ngrok http 8080 → gives you public URL
  2. localtunnel: lt --port 8080
  3. Set webhook URL in Paddle to your tunnel URL + /webhooks/paddle

Environment Variables (Alternative)

Instead of editing code, use env vars:

export PADDLE_API_KEY="pdl_sandbox_apikey_..."
export PADDLE_CLIENT_TOKEN="pdl_sandbox_clienttoken_..."
export PADDLE_SANDBOX="true"
go run main.go

Troubleshooting

"Invalid API key": You're using production key in sandbox (or vice versa)

"Product not found": Price ID is from wrong environment

"Client token invalid": Token expired or wrong environment

"Checkout doesn't open": Check browser console for JavaScript errors

Switching to Production

When ready for real payments:

  1. Get production API key from https://vendors.paddle.com
  2. Change environment: 'sandbox' to 'production' in checkout.html
  3. Change sandbox URLs to production in sync.go
  4. Use real Price IDs from production dashboard
  5. Test with small real payment first