← Back to Platform Platform · Custom code

When the stock inputs
don't fit the research.

custom: runs author HTML, CSS, and JavaScript inside the survey — a per-question shadow-DOM widget, a survey-wide helper installed on flow-reach, or a page layout scaffold with named slots. Shelf tests, image hotspots, concept boards, drag-and-rank, any custom input device — same wire back to native DSL answers.

Fieldbase platform · 5 patterns

Bring your own forms

Insights teams build proprietary methodology libraries — branded shelf tests, virtual aisles, reaction-curve players, concept dials, pack-front hit-maps. They're competitive assets, and historically they lived in a parallel JavaScript stack bolted onto the survey tool. custom: dissolves that split. Your form library is part of the survey, written in the same YAML as the standard questions, running on the same engine as the rest of the fieldwork.

Native in the data

The system of record stays the question. A shelf-test widget writes an ordered SKU list to a hidden rank through Jet.setValue(qid, order) — downstream, skip logic, quotas, piping, and export treat it like a normal rank. A hotspot widget writes coordinates to a hidden open. A dial player writes a timestamped series. No parallel export job after fieldwork closes.

Three places to plant it

Question-level blocks run in a Shadow DOM on their host question. CSS doesn't leak out; the survey's --jet-* theme tokens pierce in. Survey- level blocks are flow nodes installed once on flow-reach — the right home for a shared modal, a delegated handler, or a helper like Jet.modal. Page-level blocks are layout scaffolds: the questions on the page render into elements marked data-jet-slot, so a concept board (hero stimulus + three ratings in a row) is one block instead of three stacked questions.

A programmer surface

Custom code runs same-realm — no iframe, no allow-list. Load Chart.js, D3, Three.js, or a proprietary component library the firm already ships. Scripts are deduped by URL across questions, and the runtime captures fetch and the session token up-front so author code can't exfiltrate credentials. A new input device is a YAML block, not a vendor queue.