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>
AttributeRequiredWhat it does
data-renntYesYour storefront slug — the SLUG part of rennt.app/s/SLUG.
data-modeNoinline (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-textNoButton label in button mode. Default Book now.
data-colorNoButton 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>
Bookings made through the widget are exactly the same as bookings on your storefront: same availability, prices, deposits, rental agreement and e-signature, and they land in your dashboard the same way.

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

  1. In your dashboard go to Settings → Integrations — Webhooks.
  2. Paste your Endpoint URL. It must start with https://.
  3. Under Events choose booking.created or 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

EventWhen it fires
booking.createdA 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"
}
FieldNotes
eventAlways booking.created.
tenant_slugYour storefront slug.
order_idThe booking’s unique ID (UUID). Use it to de-duplicate.
event_dateDate as text, YYYY-MM-DD.
guest_count, est_totalSent as text, not numbers — convert them if you need math.
All other fieldsText. Any field the customer left blank arrives as null.

Delivery and retries

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:

  1. Read the raw request body exactly as received (before any JSON parsing).
  2. Compute HMAC-SHA256 of t + "." + rawBody with your secret and compare it to v1 using a constant-time comparison.
  3. Reject the request if t is 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
});
Zapier and Make catch hooks can’t check signatures — that’s fine. Keep the hook URL private (they generate long, unguessable URLs for you) and don’t publish it.

Calendar feed

Subscribe to a private calendar feed and every booking shows up in Google Calendar, Apple Calendar or Outlook automatically.

  1. Go to Settings → Integrations → Calendar — Google · Apple · Outlook and click Enable calendar feed.
  2. Click Copy URL.
  3. 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

Storefront URLs & custom domains

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