MeetStream Guide: Test Webhooks Locally with ngrok or Cloudflare Tunnel
When you’re building a MeetStream integration, you’ll often want to test webhooks locally (on your laptop) before deploying a server.
This guide shows how to:
- run a local webhook server
- expose it to the internet using ngrok or Cloudflare Tunnel (cloudflared)
- paste the public URL into MeetStream as your
callback_url
What you’re building
- You run a local HTTP server (example:
http://localhost:3000/webhooks/meetstream) - You create a tunnel that gives you a public URL (example:
https://abc123.ngrok-free.app/webhooks/meetstream) - You use that public URL as MeetStream’s webhook
callback_url
0) Create a simple local webhook endpoint
Pick any stack. Here are two minimal examples.
A) Node.js (Express)
Create server.js:
Run it:
Your local endpoint is now:
http://localhost:3000/webhooks/meetstream
B) Python (FastAPI)
Create app.py:
Run it:
Endpoint:
http://localhost:3000/webhooks/meetstream
1) Option A — Use ngrok (quickest)
Step 1: Install ngrok
- macOS (Homebrew):
Or download from ngrok website and follow install steps.
Step 2: Authenticate ngrok
Step 3: Start a tunnel to your local port
If your local server is running on localhost:3000:
ngrok will print a public HTTPS URL like:
https://abc123.ngrok-free.app
Step 4: Use the public URL as callback_url
If your route is /webhooks/meetstream, your final webhook URL becomes:
https://abc123.ngrok-free.app/webhooks/meetstream
Use this in your Create Bot payload:
2) Option B — Use Cloudflare Tunnel (cloudflared)
Cloudflare Tunnel is great if you already use Cloudflare or want a stable tunnel.
Step 1: Install cloudflared
- macOS (Homebrew):
Step 2: Start a quick (temporary) tunnel
If your local server is on port 3000:
cloudflared will output a public URL like:
https://something.trycloudflare.com
Step 3: Use it as callback_url
Final webhook URL:
https://something.trycloudflare.com/webhooks/meetstream
3) Verify your local webhook is receiving events
A) Add the URL while creating the bot
Include in Create Bot / Create Agent payload:
B) Trigger a bot lifecycle
You should see incoming webhook payloads for events like:
bot.joiningbot.inmeetingbot.stopped
4) Common issues & fixes
Webhook not arriving?
- Confirm your local server is running and the endpoint path matches exactly.
- Ensure your tunnel is pointing to the right port (e.g., 3000).
- Make sure your webhook handler returns 2xx quickly.
“502 Bad Gateway” in ngrok / Cloudflare
- Your local server is not reachable on that port.
- Try opening locally:
curl -X POST http://localhost:3000/webhooks/meetstream -H "Content-Type: application/json" -d '{}'
Missing JSON body
- Ensure you have JSON parsing enabled:
- Express:
app.use(express.json({ type: "*/*" })) - FastAPI already parses JSON with
await req.json()
- Express:
5) Production best practices (when you deploy)
- Make webhook handling idempotent (avoid double-processing).
- Verify webhook signatures (if configured).
- Log webhook events + store minimal event history for debugging.
- Don’t run tunnels in production — use a hosted endpoint.
If you tell me your preferred runtime (Node / Python / Bun / Go), I can add a “copy‑paste ready” webhook handler with signature verification + de-duplication.
