Debug local webhooks with an FRP tunnel
Webhook providers (GitHub, Stripe, Telegram, Slack, payment PSPs) must call a public https:// URL. Your laptop is not public. Create an HTTP tunnel, run official frpc, and paste the platform hostname into the provider's dashboard.
This is the same job people use ngrok for. NiceFRP does not include a request inspector or replay UI; if you need that, use ngrok. Comparison: FRP vs ngrok vs Cloudflare Tunnel.
Steps
- Start the local app (
http://127.0.0.1:3000or whatever port). - In the console, create an HTTP tunnel and connect it to that host and port.
- Install and run frpc from the Quick Start.
- Copy
https://<tunnel-id>.<region>.tunnel.nicefrp.com(plus the path, for example/webhooks/stripe) into the provider.
Free HTTP tunnels terminate TLS at the edge. You do not upload a certificate. Use the platform hostname, not the node IP.
The hostname stays attached to that tunnel until you delete it, so you can leave the same URL in GitHub while you restart the laptop — as long as frpc is running again.
When Free is not enough
| Need | What to do |
|---|---|
Custom domain (hooks.example.com) | Paid plan + custom domains |
| End-to-end TLS with your own cert | Paid HTTPS tunnel type |
| More than one tunnel | Starter ($5/mo) and up |
| Inspect and replay POST bodies | ngrok's local inspector |
Free: 1 tunnel, 1 Mbps, 5 GiB / 30 days, TCP and HTTP only. Webhook bodies are small; the usual blocker is the single-tunnel cap or a provider that refuses *.tunnel.nicefrp.com.
Tips
- Put a secret in the path or verify signatures (Stripe
Stripe-Signature, GitHub HMAC). A public URL is crawlable. - Local frameworks that trust
X-Forwarded-Protowill seehttpsfrom the edge. If redirects bounce tohttp://127.0.0.1, set the public URL in the app's config (Railsconfig.hosts, DjangoCSRF_TRUSTED_ORIGINS, etc.). - WebSocket-based tooling on the same app can share the HTTP tunnel; browsers must use
wss://.