Accept Monero for VPN Services
Privacy-first payments for privacy-first services. Integrate Monero subscriptions into your VPN with zero KYC and zero custody.
Last updated: 2026-04-28
Why Monero for VPN Services
VPN customers choose your service for privacy. Requiring credit card payments or KYC-compliant crypto exchanges undermines that promise. Monero is the only major cryptocurrency where transactions are private by default — ring signatures, stealth addresses, and RingCT ensure that neither the sender nor the amount is visible on the blockchain.
By accepting Monero through GhostBill, you offer your customers complete payment anonymity. No accounts, no identity verification, no payment trail that links back to their VPN subscription.
GhostBill adds recurring billing on top — the missing piece that makes Monero viable for subscription services. Customers create a subscription once and receive renewal invoices automatically.
Architecture
A typical integration looks like this:
- Your VPN backend creates customers and subscriptions via GhostBill API
- GhostBill generates invoices, monitors payments, sends webhooks
- Your webhook handler provisions or extends VPN access on payment confirmation
- Tor handles all communication between your backend and GhostBill
Both GhostBill and your VPN can run on the same server or on separate infrastructure. All API communication happens over the local network or Tor — no clearnet exposure required.
Subscription Flow
The typical VPN subscription lifecycle:
- Customer selects a plan on your website
- Your backend creates a customer and subscription in GhostBill
- GhostBill generates the first invoice with a unique Monero subaddress
- Customer pays to the subaddress from any Monero wallet
- GhostBill detects payment, confirms it, fires webhook
- Your backend provisions VPN access (WireGuard config, OpenVPN cert, etc.)
- At renewal time, GhostBill creates a new invoice automatically
- Customer pays the renewal invoice to keep access active
- If payment is late, the subscription enters grace period before expiring
Implementation
Step 1: Create a customer
curl -X POST http://your-ghostbill.onion/v1/customers \
-H "Authorization: Bearer gb_live_..." \
-H "Content-Type: application/json" \
-d '{
"external_id": "vpn-user-7f3a9b",
"metadata": {"plan": "premium", "region": "eu"}
}'Step 2: Create a monthly subscription
curl -X POST http://your-ghostbill.onion/v1/subscriptions \
-H "Authorization: Bearer gb_live_..." \
-H "Content-Type: application/json" \
-d '{
"customer_id": "cust_...",
"amount_xmr": "0.05",
"interval": "monthly",
"description": "VPN Premium - Monthly",
"grace_period_hours": 72,
"metadata": {"plan": "premium", "bandwidth": "unlimited"}
}'
# Response (201 Created):
# {
# "id": "sub_...",
# "status": "active",
# "current_invoice": {
# "id": "inv_...",
# "address": "86jXqk...",
# "amount_atomic": 50000000000,
# "status": "pending"
# },
# "next_billing_at": "2026-05-28T07:00:00Z"
# }Webhook Handling
The critical webhook events for VPN providers:
subscription.payment_confirmed— provision or extend VPN accesssubscription.past_due— warn the customer, keep access for grace periodsubscription.expired— revoke VPN accesssubscription.cancelled— clean up resources at end of billing period
import hmac, hashlib, json
from flask import Flask, request
app = Flask(__name__)
WEBHOOK_SECRET = "your-webhook-hmac-secret"
@app.route("/ghostbill/webhook", methods=["POST"])
def handle_webhook():
# Verify HMAC-SHA256 signature
signature = request.headers.get("X-GhostBill-Signature")
expected = hmac.new(
WEBHOOK_SECRET.encode(),
request.data,
hashlib.sha256
).hexdigest()
if not hmac.compare_digest(signature, expected):
return "Invalid signature", 401
event = json.loads(request.data)
event_type = event["event_type"]
sub_id = event["data"]["subscription_id"]
if event_type == "subscription.payment_confirmed":
extend_vpn_access(sub_id, days=30)
elif event_type == "subscription.expired":
revoke_vpn_access(sub_id)
return "OK", 200XMR Pricing Strategy
Monero is volatile against fiat. Two common approaches for VPN pricing:
- Fixed XMR price — set a stable XMR amount (e.g. 0.05 XMR/month). Simple, predictable for customers. Your revenue fluctuates with XMR price.
- Fiat-pegged — use GhostBill's price endpoint to convert USD to XMR at current market rate when creating each invoice. Revenue is stable in fiat terms.
Most VPN providers targeting privacy-conscious users prefer fixed XMR pricing. It signals commitment to the Monero ecosystem and simplifies the customer experience.
Related Pages
- Recurring Billing — full subscription lifecycle documentation
- Pricing — choose the right tier for your VPN service
- API Reference — complete endpoint documentation
- GhostBill vs BTCPay Server — why GhostBill for Monero
Ready to deploy?
Open Core — backend API is free and open source. Dashboard licenses start at $49/month. Zero transaction fees.