Skip to content

Trystpilot - IP Whitelist for Payment Processing & Infrastructure

Version: 1.0.0 · Last updated: 2026-03-02 Purpose: Complete list of IP addresses and services that require whitelisting for credit card payment processing and infrastructure access.


This document catalogs all IP ranges and service endpoints that communicate with Trystpilot infrastructure for payment processing, database access, rate limiting, security, and analytics.

Important: IP ranges change frequently. Use the official documentation links provided for each service to verify current ranges before deploying to production.


Purpose: Next.js application hosting, API Routes, edge functions

Vercel uses dynamic IP ranges managed by AWS. For payment webhook verification, use domain-based authentication instead of IP whitelisting.

RegionCIDR BlocksStatus
US EastAWS EC2 rangesDynamic
EUAWS EC2 rangesDynamic
Global CDNMultiple cloudsDynamic

Official Documentation:

  • Vercel IP Addresses
  • Vercel uses AWS infrastructure — for static IPs, request Vercel Enterprise

Best Practice for Payment Processing:

  • ✅ Use HMAC-SHA256 signature verification instead of IP whitelisting
  • ✅ Store webhook signing secret in NEXT_PUBLIC_STRIPE_WEBHOOK_SECRET (example for Stripe)
  • ✅ Verify webhook signatures on every incoming request

Outbound IPs (from Vercel Functions):

  • Dynamically assigned from AWS ranges
  • For external services that require IP whitelisting, contact Vercel Enterprise Support

Purpose: Primary data store for profiles, reviews, moderation queue

ComponentDetails
ServiceSupabase PostgreSQL
Hostdb.*.supabase.co (project-specific)
Port5432 (standard) or 6543 (direct connection)
ProtocolTCP / PostgreSQL wire protocol
RegionVaries (AWS/GCP)

Supabase runs on AWS infrastructure. Outbound connections from Vercel will use dynamic AWS IP ranges.

For Supabase IP whitelisting (if using cloud.supabase.com):

  • Supabase runs on AWS — no fixed IPs for inbound from external clients
  • Solution: Use connection pooler or private networking
    • Supabase offers connection pooling (PgBouncer) at *.pooler.supabase.com
    • For production, use AWS VPC peering or Supabase Direct Connection with IAM role

Current Trystpilot Setup:

DATABASE_URL=postgresql://...@db.XXXX.supabase.co:5432/postgres
DIRECT_URL=postgresql://...@direct.XXXX.supabase.co:6543/postgres # For migrations

Recommended Whitelist Approach:

  • No IP whitelisting needed for Vercel → Supabase (AWS trusted)
  • If you have a separate admin machine accessing the DB:
    • Configure your public IP in Supabase dashboard
    • Or use AWS Systems Manager Session Manager for secure access

Purpose: Distributed rate limiting, sliding-window counters, ephemeral storage

ComponentDetails
ServiceUpstash Redis (REST API)
Endpoints*.upstash.io (REST) + *.upstash.io (HTTPS WebSocket)
ProtocolHTTPS (REST) / WebSocket
Port443 (HTTPS)
AuthenticationToken-based (Bearer token in Authorization header)

Upstash runs on AWS globally. REST API endpoints are accessed via HTTPS.

Upstash IP Ranges (if needed for firewall rules):

ProviderRegionCIDR
AWSus-east-152...* (AWS ranges)
AWSeu-west-152...* (AWS ranges)
AWSap-southeast-152...* (AWS ranges)

Current Trystpilot Setup:

UPSTASH_REDIS_REST_URL=https://your-instance.upstash.io
UPSTASH_REDIS_REST_TOKEN=<token>

For Vercel → Upstash:

  • No IP whitelisting required — Upstash REST API accepts all sources
  • Rate limit note: Upstash tracks requests by API key, not IP

Purpose: Bot prevention on review submission form (/api/reviews)

ComponentDetails
ServicehCaptcha
Frontend domainhcaptcha.com
API endpointhttps://hcaptcha.com/siteverify
ProtocolHTTPS POST
Port443

hCaptcha uses Cloudflare & AWS infrastructure.

IP Ranges (from hCaptcha docs):

ProviderPurposeCIDR
CloudflareAPI endpoint104.16.0.0/12
CloudflareAlt IP blocks172.64.0.0/13, 173.245.48.0/20
AWSBackup52...* (varies)

Webhook callback IPs: If using hCaptcha enterprise webhooks, whitelist:

  • 107.155.64.0/22 (primary)
  • 162.125.0.0/16 (secondary)

For HCAPTCHA_SECRET validation from Vercel:

  • ✅ Outbound HTTPS to hcaptcha.com — allowed by default on Vercel

Purpose:

  • DNS resolution (if domain routed through Cloudflare)
  • Web Analytics beacon (beacon.trystpilot.xyz or cloudflareanalytics.com)
ComponentDetails
ServiceCloudflare (if enabled)
Analytics endpointcloudflareanalytics.com (or custom domain)
ProtocolHTTPS POST (beacon)
Port443

Cloudflare Public IP Ranges (as of 2026):

Use CaseCIDRNotes
Anycast CDN104.16.0.0/12Primary nameserver IPs
172.64.0.0/13Alternate ranges
173.245.48.0/20Third-party range
AnalyticsIncluded aboveUses CDN infrastructure
DDoS mitigationIncluded aboveOriginating scrubbing center

Full List:

Current Trystpilot Setup:

NEXT_PUBLIC_CF_ANALYTICS_TOKEN=<token> # Optional; if set, loads analytics.js

For analytics integration:

  • Cloudflare beacon is loaded client-side (no server-side IP issues)
  • ✅ No IP whitelisting needed

2. Payment Processor Integration (When Implemented)

Section titled “2. Payment Processor Integration (When Implemented)”

Status: ⚠️ Planned (Phase 1/2) Note: Stripe requires platform review before accepting payments for user-generated reviews.

ComponentDetails
ServiceStripe
API endpointapi.stripe.com (HTTPS)
Webhook endpointYour custom endpoint (e.g., /api/webhooks/stripe)
ProtocolHTTPS POST
Port443
AuthenticationAPI key + HMAC-SHA256 signature verification

Stripe uses AWS infrastructure. Outbound IPs are dynamic.

For inbound webhook delivery to Trystpilot:

PurposeCIDRNotes
Stripe Webhook IPs35.184.0.0/13, 35.192.0.0/11, 52...*See docs below
54...*Additional AWS ranges
3...*Additional AWS ranges

Official Documentation:

Stripe Signature Verification (Recommended):

// In /api/webhooks/stripe
import Stripe from 'stripe';
const stripe = new Stripe(process.env.STRIPE_SECRET_KEY!);
const event = stripe.webhooks.constructEvent(
body,
sig,
process.env.STRIPE_WEBHOOK_SECRET!
);

Environment Variables Needed:

Terminal window
STRIPE_PUBLIC_KEY=pk_live_...
STRIPE_SECRET_KEY=sk_live_...
STRIPE_WEBHOOK_SECRET=whsec_...
NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY=pk_live_...

Webhook Events to Handle:

  • payment_intent.succeeded
  • payment_intent.payment_failed
  • customer.subscription.updated
  • customer.subscription.deleted
  • charge.refunded

Status: ⚠️ Optional alternative to Stripe

ComponentDetails
ServicePayPal
API endpointapi.paypal.com (production)
Webhook endpointYour custom endpoint (e.g., /api/webhooks/paypal)
ProtocolHTTPS POST
Port443
AuthenticationOAuth 2.0 + signature verification
PurposeIPsNotes
Webhook sources184.106.0.0/16PayPal primary range
192.0.0.0/8Additional ranges
216.113.188.0/25Secondary range

Official Documentation:

Best Practice: Verify webhook signatures using PayPal’s signature verification API.


Status: ⚠️ Optional alternative

ComponentDetails
ServiceSquare
API endpointsquareup.com (HTTPS)
Webhook endpointYour custom endpoint (e.g., /api/webhooks/square)
ProtocolHTTPS POST
Port443

Square uses Cloudflare + AWS. Dynamic IP allocation.

Webhook verification: Square includes HMAC-SHA256 signature in headers.


Status: 📋 Planned (crypto + fiat payment processor)

ComponentDetails
ServiceCCPayment
API endpointccpayment.com (HTTPS)
Webhook endpointhttps://trystpilot.xyz/api/webhooks/ccpayment
ProtocolHTTPS POST
Port443
AuthenticationAPI Key + HMAC-SHA256 signature verification
Rate limit100 requests/sec per IP

CCPayment → Your Server (Inbound Webhooks)

Section titled “CCPayment → Your Server (Inbound Webhooks)”

Whitelist these IPs on any firewall protecting your webhook endpoint:

IP AddressNotes
54.150.123.157CCPayment primary (AWS ap-northeast-1)
35.72.150.75CCPayment primary (AWS ap-northeast-1)
57.180.23.33CCPayment secondary (newer infrastructure)
54.250.238.239CCPayment secondary (newer infrastructure)

Sources: CCPayment FAQ · CCPayment Docs Whitelist all four — CCPayment appears to use two different IP sets across their infrastructure.

Your Server → CCPayment (Outbound API Calls)

Section titled “Your Server → CCPayment (Outbound API Calls)”

CCPayment requires you to register your server’s outbound IPs in their Developer Console (API whitelist field).

Challenge: Vercel serverless functions use dynamic AWS IPs — no fixed outbound IPs on standard plans.

OptionDetails
Leave emptyTry first — CCPayment may allow empty = all IPs accepted
Vercel Pro Secure ComputeProvides dedicated egress IPs; contact Vercel support
Fixed-IP proxyRoute CCPayment API calls through Fly.io / Railway / VPS with static IP

Best Practice: Use HMAC-SHA256 signature verification for webhooks regardless of IP whitelist.

Terminal window
CCPAYMENT_MERCHANT_ID=merchant_xxx
CCPAYMENT_API_KEY=key_xxx
CCPAYMENT_API_SECRET=secret_xxx
CCPAYMENT_WEBHOOK_SECRET=webhook_secret_xxx

ServiceInboundOutboundIP Critical?Auth Method
VercelCDN trafficDynamic AWS❌ NoSignature + TLS
SupabaseDB accessAWS❌ No (pooler)Password + TLS
UpstashN/AHTTPS API❌ NoBearer token
hCaptchaFrontend JSHTTPS❌ NoAPI key
CloudflareN/ABeacon❌ NoToken
CCPaymentWebhooks (4 IPs)API calls⚠️ Inbound onlySignature
StripeWebhooksAPI⚠️ OptionalSignature
PayPalWebhooksAPI⚠️ OptionalSignature

If using IP whitelisting in Supabase dashboard:

# Allow Vercel deployments (dynamic — not recommended)
# Instead: Use connection pooler + no IP restrictions
# Allow local dev admin
192.0.2.1/32 # Your office IP (example)
198.51.100.0/24 # Your home network (example)

Recommended: Skip IP whitelisting; use connection pooler with strong passwords.


Outbound from Vercel Functions:

ServicePortProtocolRule
hCaptcha443HTTPS✅ Allow (default)
Stripe443HTTPS✅ Allow (default)
PayPal443HTTPS✅ Allow (default)
Upstash443HTTPS✅ Allow (default)
Supabase5432TCP✅ Allow (via pooler)

All outbound HTTPS is enabled by default on Vercel.


4.3 For Webhook Ingress (Your Application)

Section titled “4.3 For Webhook Ingress (Your Application)”

If you configure a firewall in front of /api/webhooks/*:

Allow: 3.18.12.63
Allow: 3.130.192.231
Allow: 34.212.75.30
Allow: 35.184.0.0/13
Allow: 35.192.0.0/11
# See: https://stripe.com/docs/ips (always verify current list)
Allow: 184.106.0.0/16
Allow: 216.113.188.0/25
# See: https://www.paypal.com/us/cshelp/article/what-are-the-ip-addresses-you-use-for-webhooks-ips-help140
# Verify via signature verification (preferred over IP whitelisting)
# See: https://developer.squareup.com/docs/webhooks

All external communication uses HTTPS with certificate validation.

ServiceCert AuthorityPinning?
StripeLet’s Encrypt / AWS❌ No (use system CA)
PayPalVeriSign❌ No (use system CA)
hCaptchaCloudflare❌ No (use system CA)
SupabaseAWS ACM❌ No (use system CA)
UpstashAWS ACM❌ No (use system CA)

Node.js / Next.js on Vercel:

  • Automatically validates root CAs from system trust store
  • No manual certificate pinning needed unless security policy requires it

RecordTypeValuePurpose
trystpilot.xyzA(Vercel)Root domain
www.trystpilot.xyzCNAME(Vercel alias)WWW subdomain
docs.trystpilot.xyzCNAME(Vercel alias)Documentation site
design.trystpilot.xyzCNAME(Vercel alias)Design system site
api.trystpilot.xyzCNAME(Vercel alias)Optional: API subdomain
webhook.trystpilot.xyzCNAME(Vercel alias)Optional: Webhook domain

DNS Provider: Cloudflare (if using for analytics)


Terminal window
# Database
DATABASE_URL=postgresql://...@db.XXXX.supabase.co:5432/...
DIRECT_URL=postgresql://...@direct.XXXX.supabase.co:6543/...
# Supabase
SUPABASE_PROJECT_URL=https://XXXX.supabase.co
SUPABASE_PROJECT_ID=XXXX
SUPABASE_PUBLIC_ANON_KEY=...
SUPABASE_SERVICE_ROLE_KEY=...
# Rate limiting
UPSTASH_REDIS_REST_URL=https://XXXX.upstash.io
UPSTASH_REDIS_REST_TOKEN=...
# CAPTCHA
NEXT_PUBLIC_HCAPTCHA_SITE_KEY=...
HCAPTCHA_SECRET_KEY=...
# Analytics
NEXT_PUBLIC_CF_ANALYTICS_TOKEN=...
# Admin
ADMIN_SECRET=...

7.2 For Payment Processing (Add when implementing)

Section titled “7.2 For Payment Processing (Add when implementing)”
Terminal window
# Stripe
STRIPE_PUBLIC_KEY=pk_live_...
STRIPE_SECRET_KEY=sk_live_...
STRIPE_WEBHOOK_SECRET=whsec_...
NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY=pk_live_...
# PayPal (if implemented)
PAYPAL_CLIENT_ID=...
PAYPAL_CLIENT_SECRET=...
PAYPAL_WEBHOOK_ID=...
# Square (if implemented)
SQUARE_ACCESS_TOKEN=...
SQUARE_APPLICATION_ID=...
SQUARE_WEBHOOK_SIGNATURE_KEY=...

DO:

  • Verify webhook signatures (HMAC-SHA256)
  • Check webhook timestamps to prevent replay attacks
  • Store webhook signing secrets in environment variables only
  • Log all webhook events (for audit trail)
  • Return 200 OK immediately; process async in background

DON’T:

  • Whitelist only by IP (IPs change; can be spoofed)
  • Store signing keys in code
  • Process webhook synchronously (may timeout)
  • Ignore signature verification

DO:

  • Rotate keys annually
  • Use separate keys per environment (dev, staging, prod)
  • Restrict API key scope (e.g., Stripe restricted keys)
  • Use .env.local for local dev (never commit)
  • Store secrets in Vercel Project Settings

DON’T:

  • Commit .env files with real secrets
  • Use the same key across environments
  • Share API keys via email or chat
  • Leave old keys active after rotation

DO:

  • Use connection pooler (Supabase default)
  • Use strong, randomly generated passwords
  • Enable SSL/TLS for all connections
  • Rotate credentials quarterly
  • Log failed connection attempts

DON’T:

  • Use default usernames/passwords
  • Connect directly without TLS
  • Share database credentials with developers
  • Log sensitive query parameters

Use ngrok or Stripe CLI for local testing:

Terminal window
# Option 1: ngrok (https://ngrok.com)
ngrok http 3000
# Exposes localhost:3000 → https://abc123.ngrok.io
# Set webhook URL to: https://abc123.ngrok.io/api/webhooks/stripe
# Option 2: Stripe CLI (https://stripe.com/docs/stripe-cli)
stripe listen --forward-to localhost:3000/api/webhooks/stripe
stripe trigger payment_intent.succeeded

Verify allowed IPs are current:

Terminal window
# Check Stripe IPs (example)
curl https://stripe.com/docs/ips -s | grep -i "35.184"
# Check PayPal IPs
curl https://www.paypal.com/us/cshelp/article/what-are-the-ip-addresses-you-use-for-webhooks-ips-help140 -s
# Check hCaptcha IPs
curl https://hcaptcha.com/docs -s | grep -i cloudflare
Terminal window
# Test Supabase connectivity
psql -U postgres -h db.XXXX.supabase.co -d postgres -c "SELECT version();"
# Test Upstash Redis
curl -H "Authorization: Bearer $UPSTASH_REDIS_REST_TOKEN" \
https://XXXX.upstash.io/get/test
# Test hCaptcha
curl -X POST https://hcaptcha.com/siteverify \
-d "secret=$HCAPTCHA_SECRET_KEY&response=$TOKEN"

ServiceCheckAction
StripePayment processing stuckCheck https://status.stripe.com
SupabaseDB unavailableCheck https://status.supabase.com; verify credentials
UpstashRate limits not workingCheck https://console.upstash.com; verify token
hCaptchaCAPTCHAs failingCheck hCaptcha dashboard; verify site key
VercelAPI endpoints downCheck https://www.vercelstatus.com
  1. Check webhook signature log (Stripe/PayPal dashboard)
  2. Review application error logs (Vercel runtime logs)
  3. Manually replay webhook from payment provider dashboard
  4. Verify database transaction completed correctly
  5. Send confirmation email to user if payment succeeded

DateChangeReason
2026-03-02Initial versionFirst comprehensive IP whitelist doc

  • docs/ARCHITECTURE.md — System architecture
  • docs/SECURITY.md — Security & compliance
  • docs/DEVOPS.md — DevOps governance
  • .env.example — Environment variable reference

For questions about IP whitelisting or payment integration:

  1. Vercel support: https://vercel.com/support
  2. Supabase support: https://supabase.com/docs
  3. Stripe support: https://support.stripe.com
  4. PayPal support: https://www.paypal.com/us/smarthelp
  5. Internal: Check CLAUDE.md for project status

Last verified: 2026-03-02 Next review: 2026-06-02 (quarterly)