Webhooks
Receive real-time notifications when events happen in your marketplace. Connect to external systems like Zapier, Make, or your own backend.
Business Plan Feature
Custom webhooks are available on the Business plan ($249/month). Upgrade to integrate your marketplace with external systems.
What are Webhooks?
Webhooks are automated messages sent from your marketplace to external systems when specific events occur. Think of them as real-time notifications that let other applications know something happened.
Common Use Cases
Inventory Management
Sync orders to your inventory system when purchases are made.
Custom Notifications
Send alerts to Slack, Discord, or email when events occur.
Automation Platforms
Trigger workflows in Zapier, Make (Integromat), or n8n.
CRM Updates
Update your CRM when new sellers register or orders complete.
Analytics Dashboards
Build custom analytics by streaming events to your data warehouse.
Fulfillment Systems
Automatically trigger shipping and fulfillment workflows.
Available Events
Subscribe to any combination of these events when creating a webhook endpoint:
| Event | Triggered When |
|---|---|
| order.created | A new order is placed and payment is confirmed |
| seller.registered | A new seller signs up for your marketplace |
| booking.created | A buyer submits a new booking (rental or service) |
| booking.payment_succeeded | A booking is paid successfully |
| booking.cancelled | A booking is cancelled by the buyer, seller, or marketplace owner |
| booking.declined | A seller declines a booking request |
More events (order.shipped, listing.created, review.posted, etc.) are on the roadmap. You'll be able to subscribe to new events as they become available.
Booking lifecycle: when does each event fire?
Use this timeline to decide which events to subscribe to. A single booking can fire multiple events over its lifetime.
booking.createdstatus: pending or awaiting_paymentA buyer submits a booking. Fires before payment for request-based flows, or together with booking.payment_succeeded on auto-approve free bookings.
booking.payment_succeededstatus: confirmedThe buyer completed payment through Stripe. This is the most reliable event for "a real booking just landed."
booking.declinedstatus: declinedFires instead of payment_succeeded when a seller rejects a pending request. Useful for ops recovery workflows.
booking.cancelledstatus: cancelledFires when any party (buyer, seller, or marketplace owner) cancels. Check data.cancellation.cancelledBy and data.cancellation.refundIssued.
What the panel looks like
A simplified view of an endpoint's configuration: pick which events fire, copy the signing secret to verify requests on your end, and watch deliveries succeed or retry.
https://hooks.acme.com/orders Activeorder.createdbooking.payment_succeededseller.registeredbooking.createdbooking.cancelledbooking.declined•••••••••••••••••••• Show Copyorder.created2s agobooking.payment_succeeded1m agoorder.created Retrying5m agoSimplified illustration. The real panel sits inside Store Settings → Webhooks. You can add multiple endpoints, each with its own event subscriptions, signing secret, and delivery history.
Creating a Webhook Endpoint
Follow these steps to set up a webhook endpoint:
Go to Store Settings → Webhooks
Click "Add Endpoint"
Enter your endpoint URL (must be HTTPS)
Select the events you want to receive
Click "Create Endpoint" to save
Copy the signing secret for verification
Webhook Security
Each webhook endpoint receives a unique signing secret. Use this to verify that incoming requests are genuinely from Prometora and haven't been tampered with.
Signing Secret
Store this secret securely. Never expose it in client-side code.
Security Best Practice
Always verify the webhook signature in your endpoint before processing the data. This prevents attackers from sending fake events to your system.
Webhook Payload
Webhook requests are sent as HTTP POST with a JSON body. Every event uses the same envelope —id, type,createdAt, storeId, and a data block whose shape depends on the event type.
Example: booking.created
{
"id": "evt_8a3f7c2d9e1b4a6f8c2d9e1b4a6f1234",
"type": "booking.created",
"createdAt": "2026-04-23T14:22:11.823Z",
"storeId": "66f1a2b3c4d5e6f7a8b9c0d1",
"data": {
"bookingId": "66f4e5d6c7b8a9f0e1d2c3b4",
"bookingNumber": "CON-1745418131-A3KZ7Q",
"status": "pending",
"bookingType": "service",
"livemode": true,
"listing": {
"id": "66f2c3d4e5f6a7b8c9d0e1f2",
"title": "Deep Clean — 3 Bedroom"
},
"buyer": {
"id": "66f3b4c5d6e7f8a9b0c1d2e3",
"email": "[email protected]",
"firstName": "Marie",
"lastName": "Tremblay",
"name": "Marie Tremblay"
},
"pricing": {
"currency": "cad",
"total": 18000,
"originalTotal": 20000,
"discount": 2000,
"couponCode": "SPRING10"
},
"schedule": {
"serviceDate": "2026-05-01",
"serviceTimeSlot": "09:00 - 12:00",
"serviceDuration": 180,
"serviceAddress": "123 Rue Sainte-Catherine, Montréal, QC"
},
"message": "Please focus on the kitchen",
"payment": {},
"createdAt": "2026-04-23T14:22:11.823Z",
"updatedAt": "2026-04-23T14:22:11.823Z"
}
}All prices are sent in cents of the store's currency (so 18000 means CA$180.00). The livemode flag is true for real customer bookings andfalse when Stripe test keys were used — add a filter in your automation so test bookings don't leak into production flows.
Event-specific fields:
booking.payment_succeeded— adds a populatedpaymentblock (stripePaymentIntentId,stripeSessionId,paidAt) andstatusbecomes"confirmed".booking.cancelled— addscancellation: { cancelledBy, refundIssued }.cancelledByis one of"buyer","seller", or"owner".booking.declined— addsdecline: { reason }from the seller's decline message.
Delivery Logs
Every webhook delivery is logged so you can see exactly what happened. Expand the "Recent Deliveries" section on any webhook to view:
- Status: Success (green) or failure (red) badge with HTTP status code
- Event type: Which event triggered the delivery
- Response time: How long your endpoint took to respond (in milliseconds)
- Retry indicator: Shows "Retry #1" or "Retry #2" for retried deliveries
- Timestamp: When the delivery was attempted
Delivery logs are kept for 7 days. The 10 most recent deliveries are shown per endpoint.
Automatic Retries
If a delivery fails (your endpoint returns a non-2xx status code or times out), Prometora will automatically retry the delivery up to 2 more times with increasing delays:
| Attempt | Delay | Description |
|---|---|---|
| 1st (original) | Immediate | Sent right when the event occurs |
| 2nd (retry #1) | ~1 minute | First retry after initial failure |
| 3rd (retry #2) | ~10 minutes | Final retry attempt |
The exact same payload is resent on each retry, so your endpoint will receive identical data. Each retry attempt appears as a separate entry in the delivery logs.
Auto-Disable Protection
To protect both your system and ours, webhooks are automatically disabled after 10 consecutive failures. This prevents repeated delivery attempts to endpoints that are consistently unreachable.
Webhook Disabled?
If your webhook was auto-disabled, fix the issue with your endpoint and then re-enable it from the webhook settings. The consecutive failure counter resets when a delivery succeeds.
Managing Webhooks
Enable/Disable
Toggle webhooks on or off without deleting them. Disabled webhooks won't receive any events.
View Activity
Each webhook shows when it was last triggered and how many consecutive failures have occurred. Expand "Recent Deliveries" to see detailed delivery history.
Delete
Remove webhook endpoints you no longer need. This action cannot be undone.
Integration Examples
Prometora webhooks are a standard HTTP POST with a JSON body, so they work with any automation platform. Below are step-by-step recipes for the most common setups.
Make.com (recommended)
- In Make, create a new scenario and add the Webhooks → Custom webhook trigger.
- Click Add, give the webhook a name, and Make will generate a URL like
https://hook.eu2.make.com/xxxxxxxx. - Copy that URL and paste it as the Endpoint URL when creating a webhook in Prometora.
- Select the events you want (e.g.
booking.created,booking.payment_succeeded) and save. - Back in Make, click Redetermine data structure and trigger a test booking in Prometora — Make will auto-map every field.
- Add a Filter step with condition
data.livemode = trueso test bookings don't flow to production. - Add downstream modules (Gmail, Google Sheets, HubSpot, SMS, etc.) and map fields from the webhook output.
Zapier
- Create a new Zap and add Webhooks by Zapier → Catch Hook as the trigger.
- Zapier gives you a URL like
https://hooks.zapier.com/hooks/catch/.... Copy it. - In Prometora, create a webhook with that URL and subscribe to the events you want.
- Trigger a test booking, then click Test trigger in Zapier to load the sample payload.
- Add a Filter by Zapier step: only continue when
Data Livemodeis true. - Add your action step (Gmail, Slack, HubSpot, Notion, Airtable, etc.). Zapier has 6,000+ connectors.
n8n (self-hosted)
- Create a new workflow and add a Webhook node as the starting trigger.
- Set HTTP Method to
POSTand copy the Production URL. - Paste the URL into Prometora's webhook form and pick your events.
- Activate the workflow, fire a test event, and n8n captures the payload. Use
{{$json["data"]["buyer"]["email"]}}-style expressions to reference fields downstream. - For HMAC verification, add a Function node that recomputes
HMAC-SHA256(rawBody, secret)and compares against theX-Prometora-Signatureheader.
Top Automation Recipes
1. SMS reminder 24h before a service booking
Trigger on booking.payment_succeeded → in Make, use the Sleep until module set todata.schedule.serviceDate minus 24h → send SMS via Twilio with the service address and time.
2. Sync every paid booking to a Google Sheet
Trigger on booking.payment_succeeded → Google Sheets → Add Row. Map bookingNumber, buyer.email, pricing.total / 100 (for dollars), schedule.serviceDate, listing.title. Great for tax/accounting exports.
3. Slack alert when a seller declines a booking
Trigger on booking.declined → Slack → Send Message to #operations with"{{data.listing.title}} declined for {{data.buyer.name}} — reason: {{data.decline.reason}}". Lets ops manually rescue the customer.
4. Auto-refund follow-up email
Trigger on booking.cancelled with a filterdata.cancellation.refundIssued = true → send a branded confirmation email via Gmail/SendGrid with the refund amount and a discount code to win the customer back.
5. Push new sellers into your CRM
Trigger on seller.registered → HubSpot / Pipedrive → Create Contact. Automate onboarding email sequences and assign to an account manager based on tag.
Pro Tips
- Start with a test endpoint (like webhook.site) to see the payload structure
- Your endpoint should respond with a 2xx status within 10 seconds to count as successful
- Process webhooks asynchronously to avoid timeouts
- Implement idempotency using the event ID to handle retries and duplicate deliveries gracefully
- Check the delivery logs regularly to ensure your endpoint is responding correctly