Install

Paste it once. Then stop touching your site.

One script tag in your layout carries every form you will ever publish. Inline forms render where you put a div. Popups, slide-ins, bars and fullscreen forms need no markup at all: they arm themselves from the tag and open on the rules you set in the builder.

A form built next month appears on your site without a deploy, a release or a conversation with whoever owns the template.

On every plan, including the free one

The whole install

Two snippets, one of them optional

The first goes in your layout once. The second marks a spot in the page where an inline form should appear. A popup, slide-in, bar or fullscreen form needs nothing at all.

layout.html, once
<script
  src="https://popziq.com/s/<site_key>.js"
  async
></script>
anywhere you want a form in the page
<div data-popziq="<form_id>"></div>

// nothing at all for a popup,
// slide-in, bar or fullscreen form

How it works

Six things the tag does for you

The per-form tag is still there and still works. This one exists because a site with six forms should not carry six script tags.

  • One tag, in your layout

    It goes in the template every page already shares. That is the last time you touch your site for a form, however many forms you go on to build.

  • A div where you want a form in the page

    Put an empty div carrying the form id wherever an inline form belongs. The tag finds it and fills it. A div added later by your own code is filled too.

  • Popups need no markup at all

    A form set to popup, slide-in, bar, fullscreen or spin to win arms itself from the tag. There is nothing to paste for it, which is the whole reason the app stops showing you a snippet for one.

  • A new form needs no deploy

    Publish a popup in the builder and it starts appearing on your site. Your site has not changed since the day you pasted the tag.

  • It fetches what the page needs

    The tag reads a small manifest of the forms that arm themselves and nothing else. A page with no inline div fetches no form configuration at all.

  • Under the size budget, still

    The whole thing loads async, holds under 30KB gzipped and lazy-loads the renderer only when a form is about to show. One engine is shipped for every form on the page rather than one per form.

Which do I paste

It depends on the mode, only on the mode

The app tells you which of these you need on the form itself, so nobody has to remember this table. It is here so you can see there is nothing else to it.

What each display mode needs on your site
ModeWhat you pasteWhere
InlineThe site tag, then a div carrying the form idThe layout, then the spot in the page
PopupThe site tagThe layout. Nothing else.
Slide-inThe site tagThe layout. Nothing else.
BarThe site tagThe layout. Nothing else.
FullscreenThe site tagThe layout. Nothing else.
Spin to winThe site tagThe layout. Nothing else.
Hosted linkNothingSend the link. There is no site involved.

Where this stops

One framed form opens per page view. If two popups could both fire on the same page, the first trigger wins and the others stand down for that view. This is a rule rather than a setting.

A draft never reaches your site. The manifest the tag reads carries published forms only, so an unfinished form cannot appear because somebody left a div in a template.

A site key belongs to one workspace. It cannot reach a form in another workspace, which is asserted by a named test rather than assumed from the shape of the id.

A form the tag cannot show draws nothing. A paused, archived or deleted form leaves the div empty and announces it to your own code, so you can swap in whatever should be there instead. This site does exactly that on its own home page.

Find your tag in the app, under Settings

Create a workspace, open Settings and your site tag is on the Website tab with the two steps in order. It is the same tag for every form you will ever build.

No card to start. No trial clock. The free plan runs the whole loop.