Developers
Everything you need to put Rennt bookings on another website, send new bookings to your other tools, and keep your calendar in sync. No coding required for most of it — copy, paste, done.
Embed widget
Add your Rennt booking experience to any website you already have (WordPress, Wix, Squarespace, Shopify, a hand-built site). Paste one script tag where you want bookings to appear.
Where to copy it: in your dashboard, open Website → Add booking to your existing website. Your code is pre-filled with your own slug.
<script src="https://rennt.app/embed.js"
data-rennt="SLUG"
data-mode="inline"
data-text="Book now"
data-color="#0f766e"></script>
| Attribute | Required | What it does |
|---|---|---|
data-rennt | Yes | Your storefront slug — the SLUG part of rennt.app/s/SLUG. |
data-mode | No | inline (default) puts the booking site right where the script sits. button adds a floating “Book now” pill that opens bookings in a pop-up window. |
data-text | No | Button label in button mode. Default Book now. |
data-color | No | Button color in button mode. Default #0f766e. |
Inline mode
The script inserts an iframe of your storefront. The frame resizes itself to fit the content, so there are no double scrollbars: the storefront posts its height to the parent page as a message of the form {type: "rennt:height", ...} and the widget only accepts it from https://rennt.app.
Button mode
A floating pill appears in the corner of every page that has the script. Clicking it opens your storefront in a modal. You can also open or close it from your own buttons or links:
<a href="#" onclick="Rennt.open(); return false;">Check availability</a>
<script>
// close it again from your own code
window.Rennt.close();
</script>
Plain iframe fallback
If your website builder strips script tags, use a plain iframe instead. It will not resize automatically, so give it a generous height.
<iframe src="https://rennt.app/s/SLUG?embed=1"
style="width:100%;height:1200px;border:0"
allow="payment"></iframe>
Webhooks
Webhooks send each new booking to a URL you choose — a Zapier or Make “catch hook”, your CRM, or your own server — so you can connect Rennt to thousands of other apps. Webhooks are included on the Pro plan.
Set it up
- In your dashboard go to Settings → Integrations — Webhooks.
- Paste your Endpoint URL. It must start with
https://. - Under Events choose
booking.createdor All events (*), leave Active on, and click + Add endpoint.
You can add several endpoints, switch each one on or off, or delete it. Each endpoint gets its own signing secret (see Verifying signatures). Recent deliveries on the same screen shows the last 20 deliveries with their status, the number of attempts, the last error and when the next retry is due.
Events
| Event | When it fires |
|---|---|
booking.created | A customer submits a new booking request (on your storefront, the embed widget, or through your AI booking chat). |
* | All events. Subscribes the endpoint to every event Rennt sends, including any added later. |
booking.created is currently the only event Rennt sends. Changes to a booking afterwards (confirming, cancelling, payments) do not send a webhook yet. Use the X-Rennt-Event header or the event field to tell events apart if you subscribe with *.
The request
Rennt sends an HTTP POST with these headers:
Content-Type: application/json
User-Agent: Rennt-Webhooks/1
X-Rennt-Event: booking.created
X-Rennt-Delivery: <unique delivery ID>
X-Rennt-Signature: t=1760371200,v1=5f1c...e9a0
X-Rennt-Delivery is the same on every retry of the same delivery, so you can use it (or order_id) to ignore duplicates.
The body is a flat JSON object:
{
"event": "booking.created",
"tenant_slug": "your-slug",
"order_id": "3f2a9c1e-5b7d-4e8a-9c0f-1a2b3c4d5e6f",
"event_date": "2026-11-14",
"event_type": "Birthday",
"guest_count": "40",
"est_total": "385.00",
"contact_name": "Maria Gomez",
"contact_email": "maria@example.com",
"contact_phone": "555-0142"
}
| Field | Notes |
|---|---|
event | Always booking.created. |
tenant_slug | Your storefront slug. |
order_id | The booking’s unique ID (UUID). Use it to de-duplicate. |
event_date | Date as text, YYYY-MM-DD. |
guest_count, est_total | Sent as text, not numbers — convert them if you need math. |
| All other fields | Text. Any field the customer left blank arrives as null. |
Delivery and retries
- New bookings are queued and sent within about a minute.
- Any
2xxresponse counts as delivered. Anything else — a non-2xx status, no response within 10 seconds, or an unreachable server — counts as a failed attempt. - Redirects are not followed. A
3xxresponse is a failed attempt, so point the endpoint at the final URL. - Failed attempts are retried automatically with backoff: after 1 minute, 5 minutes, 30 minutes, 2 hours and 12 hours. After 6 attempts in total the delivery is marked failed and is not retried again.
- Every booking is still in your dashboard and in the Bookings CSV export, so nothing is lost if your endpoint was down for longer than that.
- Endpoints that are switched off, deleted, or that point at a private or internal network address are skipped.
Verifying signatures
Every request is signed with your endpoint’s signing secret so you can confirm it really came from Rennt and was not changed on the way.
Where to find the secret: Settings → Integrations — Webhooks. Each endpoint shows its secret masked; use Show to reveal it, Copy to copy it, and Rotate to replace it with a new one. Rotating takes effect immediately — the old secret stops working, so update your receiver at the same time.
The X-Rennt-Signature header looks like t=<unix seconds>,v1=<hex>. v1 is the hex HMAC-SHA256 of t + "." + raw request body, keyed with your secret. To verify:
- Read the raw request body exactly as received (before any JSON parsing).
- Compute HMAC-SHA256 of
t + "." + rawBodywith your secret and compare it tov1using a constant-time comparison. - Reject the request if
tis more than 300 seconds (5 minutes) away from your server’s clock — this blocks replayed requests.
Node.js (Express) example:
const crypto = require('crypto');
const express = require('express');
const app = express();
const SECRET = process.env.RENNT_WEBHOOK_SECRET; // from Settings → Webhooks
function verifyRennt(rawBody, header, secret) {
const parts = Object.fromEntries(
String(header || '').split(',').map(p => p.split('='))
);
const t = parts.t, v1 = parts.v1;
if (!t || !v1) return false;
if (Math.abs(Math.floor(Date.now() / 1000) - Number(t)) > 300) return false;
const expected = crypto.createHmac('sha256', secret)
.update(t + '.' + rawBody)
.digest('hex');
const a = Buffer.from(expected, 'hex');
const b = Buffer.from(v1, 'hex');
return a.length === b.length && crypto.timingSafeEqual(a, b);
}
// Use the raw body — not express.json() — so the bytes match what was signed.
app.post('/hooks/rennt', express.raw({ type: 'application/json' }), (req, res) => {
const rawBody = req.body.toString('utf8');
if (!verifyRennt(rawBody, req.get('X-Rennt-Signature'), SECRET)) {
return res.status(401).send('bad signature');
}
const event = JSON.parse(rawBody);
// ... handle event.event === 'booking.created'
res.sendStatus(200); // any 2xx = delivered
});
Calendar feed
Subscribe to a private calendar feed and every booking shows up in Google Calendar, Apple Calendar or Outlook automatically.
- Go to Settings → Integrations → Calendar — Google · Apple · Outlook and click Enable calendar feed.
- Click Copy URL.
- In Google Calendar choose Other calendars → From URL and paste it. In Apple Calendar or Outlook use Subscribe to calendar.
The URL looks like this (your dashboard fills in the real values):
https://zvmhmxhiknwnsaauklxh.supabase.co/functions/v1/calendar-feed?slug=SLUG&t=PRIVATE_TOKEN&apikey=PUBLIC_KEY
- It is a standard iCalendar (
.ics) feed. Each booking with an event date appears as an all-day event titled with the customer’s name, with the address as the location and the time, pickup or delivery, and total in the notes. Cancelled bookings are left out. - The
ttoken is what keeps the feed private. Anyone with the full URL can read your booking calendar, so only share it with your team. - Reset link creates a new token. The old URL stops working right away — re-subscribe with the new one.
- The feed refreshes every few minutes on our side, but calendar apps decide how often to check it. Google Calendar can take several hours to show a new booking.
Storefront URLs & custom domains
- Every company gets a booking site at
https://rennt.app/s/SLUG. The slug is set when you sign up. - Add
?embed=1for the chrome-free version used by the embed widget. - Each eligible storefront also publishes a sitemap for search engines at
https://rennt.app/s/SLUG/sitemap.xml. - On the Pro plan you can use your own domain (for example
book.yourcompany.com). Set it up under Settings → Custom domain; the domains page walks you through the DNS records. Your rennt.app address keeps working too.
Public REST API
A public REST API is not yet available. If you need programmatic access to your bookings, inventory or customers, email support@rennt.app and tell us what you are building — it shapes what we build next. In the meantime, webhooks, the calendar feed and the CSV exports in your dashboard cover most integrations.
See also: What’s new · System status · Help Center