Sóley docs
How to add the Sóley booking widget to your website, and what to do when something looks off. For the product overview, see the widget marketing page.
You need three things:
One <script> tag, anywhere before the closing </body>. Replace your-widget-id with the widget ID from your dashboard.
<script type="module"
src="https://widget.soley.travel/v1.0.0/loader.js"
data-soley-operator-id="your-widget-id"
data-soley-modes="book,chat"
data-soley-primary-color="#0066cc"></script>Attribute reference:
data-soley-operator-id (required): your widget ID. UUID.data-soley-modes (optional): any of book, chat. Defaults to both.data-soley-primary-color (optional): hex like #0066cc. Defaults to Sóley gold.data-soley-service-id (optional): if set, the Book-now flow opens with this service pre-selected. Otherwise the guest picks from a list.Three ways depending on your setup:
footer.php. Paste the snippet just before </body>. Save.On a multisite, install per-site rather than network-wide so each site keeps its own widget ID.
Wix Premium plan required for custom code. Free plans cannot embed third-party scripts.
Code Injection requires the Business plan or higher. Personal plans cannot embed third-party scripts.
Paste the snippet directly before </body> in your HTML template. If your site is split across many pages, put it in the shared footer include.
The loader is a plain <script> tag. Most frameworks accept it in the root layout’s <body> as long as it runs client-side.
For Next.js App Router specifically, drop the snippet into the root app/layout.tsx <body> using the next/script component with strategy=“afterInteractive”. The widget mounts itself in a Shadow DOM, so it will not interfere with React hydration.
Three ways to prove the operator controls a domain. Pick whichever fits your setup; each is sufficient.
<meta name="soley-widget-verification" content="<token>"> tag inside your page’s <head>. The token comes from the verification panel in your dashboard. Works on any platform that lets you edit the page head.<head>. Add a TXT record soley-verify=<token> at your domain root. DNS propagation can take a few minutes after the change.widget_allowed_origins list; (3) the snippet sits inside <body>, not <head>. Open the browser devtools console; the loader logs a clear error for each of these.https://example.com and https://www.example.com, add both.EventSource / fetch to api.soley.travel. See the CSP section below.data-soley-primary-color attribute must be a 6-character hex like #0066cc. The widget derives a WCAG-AA contrast ramp from this colour; very-light or very-dark inputs may give a low-contrast result. Adjust toward a mid-luminance brand colour.If your site uses a strict CSP, add these directives:
script-src 'self' https://widget.soley.travel;
connect-src 'self' https://api.soley.travel;
img-src 'self' data: https://*.soley.travel;
style-src 'self' 'unsafe-inline';The style-src ‘unsafe-inline’ is needed for the widget’s Shadow DOM stylesheet. The widget never loads external CSS, only its own bundled styles, isolated inside the Shadow DOM so they cannot leak into your site.
The data-soley-primary-color attribute drives a WCAG-AA contrast ramp: hover, active, focus, and text-on-primary are all derived so the colour you set is the colour guests see, and the result still meets accessibility contrast thresholds.
Live preview is on the dashboard Settings page so you can test a colour before publishing.
Beyond colour: removing the “Powered by Sóley” footer, custom fonts, or replacing the bubble icon are roadmap items, not v1 features. If you need them, tell us.
<script> tag from your site. The widget disappears. The widget ID stays valid in your dashboard so you can reinstall later.source: widget attribution so you can filter if you want to track widget vs directory vs WhatsApp.Still stuck? Message us from your dashboard and we will dig in.