Przejdź do głównej zawartości

Referencja widgetu embed

Przewodnik dla właściciela firmy: Osadzanie rezerwacji na stronie WWW.

Zamień {origin} na adres Twojej instalacji BUKMI (np. https://app.bukmi.pl).

TrybWzorzec URL
Hub{origin}/embed/b/{slug-firmy}
Usługa{origin}/embed/b/{slug-firmy}/{slug-uslugi}
Płatność (breakout){origin}/embed/b/{slug-firmy}/pay/{token-potwierdzenia}
Podziękowanie{origin}/embed/b/{slug-firmy}/confirmed/{token-potwierdzenia}

Parametry zapytania: ?accent=%237c6cf2&lang=pl (opcjonalnie).

<script
src="https://app.bukmi.pl/embed.js"
data-business="twoj-slug-firmy"
data-mode="inline"
data-target="#bukmi-embed"
async
></script>
<div id="bukmi-embed"></div>
AtrybutWymaganyOpis
data-businesstakSlug firmy (/b/{slug}).
data-modenieinline (domyślnie), popup lub sam iframe bez skryptu.
data-targetinlineSelektor CSS kontenera (domyślnie #bukmi-embed).
data-servicenieSlug usługi - od razu otwiera tę usługę.
data-accentnieKolor akcentu hex (np. #7c6cf2).
data-langniepl lub en interfejsu gościa.
data-button-labelpopupEtykieta przycisku (domyślnie „Zarezerwuj”).
data-button-classpopupDodatkowa klasa CSS przycisku.
data-button-stylepopupStyle inline przycisku.
data-titlenieTytuł iframe (dostępność).

Tryb popup wstawia przycisk tuż za tagiem <script>.

Właściciel firmy musi wpisać origin strony rodzica w Moja oferta → Embed (np. https://www.twoj-salon.pl). Bez dopasowania odpowiedzi /embed/... zwracają 403.

Podgląd właściciela: ?preview=1 po zalogowaniu jako edytor (pomija allowlist do testów).

Iframe wysyła komunikaty JSON do strony rodzica:

window.addEventListener('message', (event) => {
if (event.origin !== 'https://app.bukmi.pl') return;
const { type, ...detail } = event.data || {};
switch (type) {
case 'bukmi:ready':
// iframe załadowany; detail.height
break;
case 'bukmi:resize':
// detail.height - auto-wysokość inline
break;
case 'bukmi:step':
// detail.step - krok kreatora ("1" | "2")
break;
case 'bukmi:booking-created':
// detail.bookingId, confirmationToken, awaitingPayment, series?
break;
case 'bukmi:booking-confirmed':
// detail.bookingId lub bookingSeriesId - popup zamyka się sam
break;
case 'bukmi:payment-breakout':
// detail.stripeUrl - rodzic może przejść na Stripe
window.location = detail.stripeUrl;
break;
}
});

Bundlowany embed.js obsługuje automatycznie bukmi:resize, bukmi:payment-breakout i bukmi:booking-confirmed.

Strona klienta musi zezwalać na:

  • script-src - origin skryptu embed.js
  • frame-src (lub child-src) - origin aplikacji BUKMI dla iframe

BUKMI ustawia Content-Security-Policy: frame-ancestors 'self' https://twoja-strona.pl na odpowiedziach embed.

Stripe Checkout nie działa w iframe. Trasa płatności zwraca krótką stronę HTML z window.top.location na Stripe i zdarzeniem bukmi:payment-breakout. Po opłaceniu Stripe wraca na embed thank-you na domenie BUKMI.