Hulk Form Builder

Hulk Form Builder Logo

Built for Shopify

Hulk Form Builder

Rating

100

%

Recommended

(

2

reviews

)

Pricing

Free plan available. Free trial available.

Developer

Launched

11-Aug-17

Hulk Form Builder Logo

Built for Shopify

Hulk Form Builder

Rating

100

%

Recommended

(

2

reviews

)

Pricing

Free plan available. Free trial available.

Developer

Launched

11-Aug-17

Hulk Form Builder Logo

Built for Shopify

Hulk Form Builder

Rating

100

%

Recommended

(

2

reviews

)

Pricing

Free plan available. Free trial available.

Developer

Launched

11-Aug-17

Build unlimited forms with custom fields easily for contact forms or surveys using Form Builder.

Form Builder lets you create unlimited custom forms, including registration forms, contact forms, survey forms, wholesale order forms, multi-step forms, and Typeform-style forms for your Shopify store. With drag-and-drop design, Google reCaptcha, advanced conditional logic, and custom fields, building forms is easier than ever. Fully mobile-responsive, supports file uploads, and works with all Shopify themes. Track UTMs and customize every detail to match your brand.

Categories:

Forms, Surveys

Integrations:

Shopify Flow, Shopify Admin, Google Sheets, Klaviyo, MailChimp, Slack, Stripe, PayPal, Zapier, ZeroBounce

Shopify Flow, Shopify Admin, Google Sheets, Klaviyo, MailChimp, Slack, Stripe, PayPal, Zapier, ZeroBounce

Languages:

Danish, German, English, Spanish, Finnish, French, Italian, Japanese, Korean, Norwegian (Bokmål), Dutch, Portuguese (Brazil), Swedish, Thai, Chinese (Simplified), Chinese (Traditional), Czech, Polish, Portuguese (Portugal), Turkish

Danish, German, English, Spanish, Finnish, French, Italian, Japanese, Korean, Norwegian (Bokmål), Dutch, Portuguese (Brazil), Swedish, Thai, Chinese (Simplified), Chinese (Traditional), Czech, Polish, Portuguese (Portugal), Turkish

Filter Reviews

Operator reports

100

%

Recommended

(

2

reviews

)
Photo of Reviewer Dan K.

Dan K.

Role:

Owner

Category:

Toys & Games

Shopify Plan:

Plus

Overall satisfaction

Very Satisfied

Feb 14, 2026

Years of use:

More then 3 years

Relationship with this product:

I both used it and influenced the buying decisions

Still use this tool:

Yes

Importance:

Critical for me to do my job

What exceeded expectations

We use it for the light pop-up and form work we do.

What was disappointing

It met my expectations.

Photo of Reviewer Dan K.

Dan K.

Role:

Owner

Category:

Toys & Games

Shopify Plan:

Plus

Overall satisfaction

Very Satisfied

Feb 14, 2026

Years of use:

More then 3 years

Relationship with this product:

I both used it and influenced the buying decisions

Still use this tool:

Yes

Importance:

Critical for me to do my job

What exceeded expectations

We use it for the light pop-up and form work we do.

What was disappointing

It met my expectations.

Photo of Reviewer Ryan W.

Ryan W.

Role:

Owner

Category:

Sports & Recreation

Shopify Plan:

Plus

Overall satisfaction

Very Satisfied

Feb 9, 2026

Years of use:

More then 3 years

Relationship with this product:

I both used it and influenced the buying decisions

Still use this tool:

Yes

Importance:

Not very important

What exceeded expectations

It was simple to set up and does exactly what we need it to do in letting customers fill out a form and attach pictures (which can be done right from mobile). We can reply straight from email, not needing to interface with the app itself.

What was disappointing

It occasionally has had outages where the form submission emails aren't hitting our inbox and we aren't really notified about it until we go look on the back end. This is very infrequent, but annoying when it happens due to time lapse in responding.

Photo of Reviewer Ryan W.

Ryan W.

Role:

Owner

Category:

Sports & Recreation

Shopify Plan:

Plus

Overall satisfaction

Very Satisfied

Feb 9, 2026

Years of use:

More then 3 years

Relationship with this product:

I both used it and influenced the buying decisions

Still use this tool:

Yes

Importance:

Not very important

What exceeded expectations

It was simple to set up and does exactly what we need it to do in letting customers fill out a form and attach pictures (which can be done right from mobile). We can reply straight from email, not needing to interface with the app itself.

What was disappointing

It occasionally has had outages where the form submission emails aren't hitting our inbox and we aren't really notified about it until we go look on the back end. This is very infrequent, but annoying when it happens due to time lapse in responding.

Related Apps

import * as React from "react" type Props = { name: string slug: string description: string image: string developer: string categories: string pricing: string launchedAt: string dateModified: string ratingValue: number ratingCount: number faqQ1: string faqA1: string faqQ2: string faqA2: string faqQ3: string faqA3: string faqQ4: string faqA4: string faqQ5: string faqA5: string } export function SchemaMarkup(props: Props) { const { name, slug, description, image, developer, categories, pricing, launchedAt, dateModified, ratingValue, ratingCount, faqQ1, faqA1, faqQ2, faqA2, faqQ3, faqA3, faqQ4, faqA4, faqQ5, faqA5 } = props const scriptContent = ` (function () { var ORIGIN = window.location.origin; var SAT = { "Very Satisfied": 100, "Neutral": 50, "Not Satisfied": 0 }; var AGG_NOTE = "Percentage of vetted Shopify merchants and agency operators who recommend this app, based on first-party reviews collected by app store research."; function read(root, key) { if (!root) return ""; var el = root.querySelector('[data-k="' + key + '"]'); return el ? el.textContent.trim() : ""; } function iso(v) { if (!v) return null; var d = new Date(v); return isNaN(d) ? null : d.toISOString().slice(0, 10); } function notes(text) { return { "@type": "ItemList", "itemListElement": [{ "@type": "ListItem", "position": 1, "name": text }] }; } var root = document.getElementById("asr-seo-data"); if (!root) return; var NAME = read(root, "name"); var SLUG = read(root, "slug"); if (!NAME || !SLUG) return; var PAGE_URL = ORIGIN + "/shopify-app-reviews/" + SLUG; function collectReviews() { var out = []; Array.prototype.forEach.call( document.querySelectorAll(".asr-review-seo"), function (n) { var author = read(n, "author"); var pos = read(n, "positive"); var neg = read(n, "negative"); if (!author || (!pos && !neg)) return; var r = { "@type": "Review", "author": { "@type": "Person", "name": author }, "itemReviewed": { "@id": PAGE_URL + "#app" } }; var d = iso(read(n, "date")); if (d) r.datePublished = d; var s = read(n, "satisfaction"); if (s && SAT.hasOwnProperty(s)) { r.reviewRating = { "@type": "Rating", "ratingValue": String(SAT[s]), "bestRating": "100", "worstRating": "0", "alternateName": s }; } if (pos) r.positiveNotes = notes(pos); if (neg) r.negativeNotes = notes(neg); out.push(r); } ); return out; } function buildGraph(reviews) { var app = { "@type": "SoftwareApplication", "@id": PAGE_URL + "#app", "name": NAME, "url": PAGE_URL, "applicationCategory": "BusinessApplication", "operatingSystem": "Web (Shopify)" }; var v; if ((v = read(root, "description"))) app.description = v; if ((v = read(root, "image"))) app.image = v.replace(/&/g, "&"); if ((v = read(root, "developer"))) app.author = { "@type": "Organization", "name": v }; if ((v = read(root, "categories"))) app.keywords = v; if ((v = read(root, "pricing"))) { app.offers = { "@type": "Offer", "price": "0", "priceCurrency": "USD", "description": v }; } if ((v = iso(read(root, "launchedAt")))) app.datePublished = v; if ((v = iso(read(root, "dateModified")))) app.dateModified = v; if (reviews.length) app.review = reviews; var rv = read(root, "ratingValue"); var rc = parseInt(read(root, "ratingCount"), 10); if (reviews.length && rv && rc > 0) { app.aggregateRating = { "@type": "AggregateRating", "ratingValue": String(parseFloat(rv)), "bestRating": "100", "worstRating": "0", "ratingCount": String(rc), "description": AGG_NOTE }; } var graph = [app]; var faq = []; for (var i = 1; i <= 5; i++) { var q = read(root, "faqQ" + i); var a = read(root, "faqA" + i); if (q && a) { faq.push({ "@type": "Question", "name": q, "acceptedAnswer": { "@type": "Answer", "text": a } }); } } if (faq.length) { graph.push({ "@type": "FAQPage", "@id": PAGE_URL + "#faq", "mainEntity": faq }); } graph.push({ "@type": "BreadcrumbList", "@id": PAGE_URL + "#breadcrumb", "itemListElement": [ { "@type": "ListItem", "position": 1, "name": "Home", "item": ORIGIN + "/" }, { "@type": "ListItem", "position": 2, "name": "Shopify App Reviews", "item": ORIGIN + "/shopify-app-reviews" }, { "@type": "ListItem", "position": 3, "name": NAME, "item": PAGE_URL } ] }); return graph; } function build() { var reviews = collectReviews(); var old = document.getElementById("asr-jsonld"); if (old && old.dataset.count === String(reviews.length)) return; if (old) old.remove(); var s = document.createElement("script"); s.type = "application/ld+json"; s.id = "asr-jsonld"; s.dataset.count = String(reviews.length); s.textContent = JSON.stringify({ "@context": "https://schema.org", "@graph": buildGraph(reviews) }); document.head.appendChild(s); } if (document.readyState === "loading") { document.addEventListener("DOMContentLoaded", build); } else { build(); } [300, 900, 2000].forEach(function (ms) { setTimeout(build, ms); }); })(); ` return ( <> {/* HIDDEN DIV – provjeri da li je ID tačan */} {/* SCRIPT TAG – OBAVEZNO zatvoren */} </> ) } SchemaMarkup.defaultProps = { name: "Naziv aplikacije", slug: "slug-aplikacije", description: "", image: "", developer: "", categories: "", pricing: "", launchedAt: "", dateModified: "", ratingValue: 0, ratingCount: 0, faqQ1: "", faqA1: "", faqQ2: "", faqA2: "", faqQ3: "", faqA3: "", faqQ4: "", faqA4: "", faqQ5: "", faqA5: "" }