Skip to content

Embedding a form on your own site

A form on your Sliick Edge address can be embedded in a page on your own website. This page is for the admin who turns embedding on and for the web developer who owns the page it goes on. Hand the whole page over: the failure everyone hits, a blank rectangle where the form should be, has causes on both sides of that line.

The Share tab gives you a single snippet: a plain <iframe>. There is no script-loader snippet, and its absence is deliberate rather than pending. So everywhere this page says “the embed”, it means the frame, and the limits below follow from that.

The Share tab refuses to show a snippet until the form can actually be framed, and it gives one reason at a time, in this order.

1. The form must not collect a payment. A form with a Stripe payment field cannot be embedded: card entry inside a frame inside someone else’s page is not confirmed to work, and a broken checkout is worse than a link. Share the public link instead.

2. The form must be on your public Sliick Edge address. Tick Allow on your public Sliick Edge address in Form settings, Availability. Without it there is no address to put in the snippet. See Hosting on Sliick Edge.

3. At least one site must be on the embed allowlist. Set it in Form settings, Availability, under Embed allowlist.

A blank allowlist permits nobody, not everybody. An empty list means the form renders as a blank frame on every site, including yours. There is no “allow all” value and there is not meant to be.

Exact origins only. Wildcards are refused. The grammar that would accept https://*.acme.com also accepts a wildcard over shared hosting, where every customer has a subdomain of the same host, so separating your own subdomains from anyone’s page is not something the list can be trusted to do. List the addresses you actually use.

An origin is a scheme, a host and an optional port, and nothing else: no path, no trailing slash.

ValueAcceptedWhy
https://www.acme.comYesScheme and host
http://dev.acme.com:8080YesA port is part of an origin, and http is allowed
https://acme.co.ukYesAny number of labels
https://acme.com, https://www.acme.comYesComma separated, and these are two different origins
https://*.acme.comNoWildcards are refused
https://www.acme.com/careersNoA path is not part of an origin
www.acme.comNoThe scheme is required
http://localhost:3000NoThe host needs at least one dot
http://127.0.0.1:3000NoA bare IP address is not accepted

Local development needs a dotted hostname. http://dev.localhost:3000 is accepted and resolves to your own machine in every current browser, so that is the spelling to use, or point a dev.acme.com hosts entry at your loopback address.

Framing is not fetching. The embed allowlist governs who may put this form in a frame. The separate CORS allowlist governs who may fetch a form’s data from their own script, and that one does accept a single leading wildcard subdomain such as https://*.acme.com, though never a bare top-level domain. If you are embedding, you want the embed allowlist and you do not need the CORS one.

Copy it from the builder’s Share tab. It looks like this:

<iframe src="https://acme.Sliick.net/embed/contact-us"
        width="100%" height="640" style="border:0"
        title="Contact us" loading="lazy"></iframe>
  • src is your form’s embed address. Paste it exactly as the Share tab gives it to you.
  • height is a fixed pixel height, estimated from the tallest page of your form. You will probably want to change it, because it is an estimate and the frame cannot correct itself.
  • width="100%" fills the container. Size the container, not the frame.
  • title is the form’s name, and it is mandatory: an untitled frame is a dead end for anyone using a screen reader, and it is the failure that looks perfect on screen. Change the wording if you like, but do not remove the attribute.
  • loading="lazy" defers loading until the frame is near the viewport. Safe to remove if the form is the point of the page.

If your site sends a Content Security Policy, the browser refuses to load the frame unless the Sliick Edge host is allowed as a frame source. Add frame-src https://acme.sliick.net;, substituting the host from your own snippet.

If your policy has no frame-src directive, the browser falls back to default-src, so a restrictive default-src blocks the frame even though nothing in the policy mentions frames. Adding frame-src is the fix either way.

You do not need script-src, style-src, connect-src or font-src entries for the form. Everything the form loads happens inside the frame’s own document, which is governed by its own policy, not yours. Your policy only decides whether the frame may exist at all. Teams who add four directives and still see a blank frame have usually missed the one that is actually consulted.

  1. It cannot resize itself. The height is whatever the snippet says. Multi-page forms are the awkward case, because pages differ in height: size for the tallest page you care about.
  2. It cannot send someone to your own thank-you page after they submit. The success message appears inside the frame. If a post-submit redirect matters, use the public link on its own page instead.
  3. It cannot carry prefill or page analytics in from your page, because the frame does not know what the surrounding page knows.

Point 3 has an exception worth knowing. A signed prefill link does work on an embedded form: what the frame cannot do is build one for you. Put the prefill address in the src yourself and the form loads prefilled exactly as it would on its own page.

Both work. Two things to know first.

A link that carries a reference is readable. Prefill and resume references travel in the address, so anything that logs, forwards or indexes full addresses, such as an analytics tool, a proxy, or a case comment, captures it. The public address clears the reference from the visible address once it has been read, which stops it persisting in browser history, but it cannot un-log an address your own systems already recorded.

Do not paste a respondent’s resume link into anything that stores addresses. A resume link is that respondent’s answers. Send it to them and nowhere else.

A freshly minted link may take a second to become usable. If you mint one and open it immediately, which is exactly what you do when testing, the first read can restore nothing. The form says it is restoring your saved answers and retries by itself rather than claiming the link has expired.

The embedded form sets one cookie, and its only purpose is keeping a respondent on the same variant of an A/B experiment if they reload the page mid-form. It is not used for tracking, profiling, advertising, or identifying a respondent across sites, and blocking it degrades that stickiness and nothing else: the form loads, validates, submits and confirms with no cookies at all.

Four causes, each with a different fingerprint.

What you seeCauseFix
The Share tab shows no snippet at all, with a messageOne of the three prerequisites aboveDo what the message says. It names exactly one, and it is the one that matters
Blank frame, and the browser console names frame-src and your own site’s policyYour site’s Content Security PolicyAdd frame-src for your Sliick Edge host
Blank frame, and the console names frame-ancestors or refuses to displayThe embed allowlistAdd the exact origin of the page doing the embedding, scheme included
The frame loads and the form says the link expiredA prefill or resume link that is genuinely finishedNot an embedding problem. Issue a new link

Two notes that save time: the origin on the allowlist is the origin of your page, not of the form, and acme.com and www.acme.com are different origins, so list both if your site answers on both. If the frame is blank and the console says nothing at all, check that the address is exactly what the Share tab produced: a retyped address is the one cause with no diagnostic.