Webhooks
Receive real-time notifications when events occur in your Meeva account.
Event Reference
All webhook events & payloads
Comprehensive list of all webhook events including booking.created, booking.cancelled, and more.
Security & Verification
HMAC SHA-256 signatures
Learn how to verify webhook signatures to ensure requests are genuinely from Meeva.
Quick Setup
Meeva pushes JSON payloads to your endpoint via HTTP POST. Here's how to set up webhook handling in 3 easy steps.
Create an Endpoint
Set up an HTTP POST endpoint in your application to receive webhook events.
Endpoint Requirements:
- Accept
POSTrequests - Return
200 OKwithin 30 seconds - Use HTTPS in production (required)
- Verify the
meeva-signatureheader
const express = require('express');
const crypto = require('crypto');
const app = express();
// Use raw body for signature verification
app.post('/webhooks/meeva',
express.raw({ type: 'application/json' }),
(req, res) => {
// 1. Get signature from headers
const signature = req.headers['meeva-signature'];
// 2. Verify signature (see Security docs)
const isValid = verifySignature(req.body, signature);
if (!isValid) {
return res.status(401).send('Invalid signature');
}
// 3. Parse and handle the event
const event = JSON.parse(req.body);
console.log('Received event:', event.type);
switch (event.type) {
case 'booking.created':
handleNewBooking(event.data);
break;
case 'booking.cancelled':
handleCancellation(event.data);
break;
}
// 4. Return 200 to acknowledge receipt
res.status(200).send('OK');
}
);from flask import Flask, request
import hmac
import hashlib
app = Flask(__name__)
@app.route('/webhooks/meeva', methods=['POST'])
def handle_webhook():
# 1. Get signature from headers
signature = request.headers.get('meeva-signature')
# 2. Verify signature
if not verify_signature(request.data, signature):
return 'Invalid signature', 401
# 3. Parse and handle the event
event = request.json
print(f"Received event: {event['type']}")
if event['type'] == 'booking.created':
handle_new_booking(event['data'])
elif event['type'] == 'booking.cancelled':
handle_cancellation(event['data'])
# 4. Return 200 to acknowledge
return 'OK', 200Register Your Endpoint URL
Add your webhook URL in the Meeva dashboard to start receiving events.
Dashboard Steps:
https://yourapp.com/webhooks/meeva)Test Your Webhook
Use the "Send Test Event" button in your dashboard to verify your endpoint is working correctly.
Retry Policy
If your endpoint doesn't return 2xx within 30 seconds, Meeva will retry:
1 min
1st retry
5 min
2nd retry
30 min
3rd retry
After 3 failed attempts, the webhook is marked as failed. You can view failed webhooks and manually retry them from your dashboard.