1<!doctype html> 2<html lang="en"> 3 4<head> 5 <!-- Required meta tags --> 6 <meta charset="utf-8"> 7 <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> 8 <meta name="norton-safeweb-site-verification" content="X4JSMEHQMW889RDPO4KVE5E9086TCLS3TASAV243DAUQO54U8U0C0RS7SMTJDVDC1X0E6GA23YUT9LOH034D2UP-H6I86K8U39FMYTUPMX5LYXD6X4O96AO3A-QBQOKE" /> 9 10 <!-- TODO: Add all meta tags --> 11 <!-- CSRF Token --> 12 <meta name="csrf-token" content="iclSdj089SMzpFriMXJeVRTjkf6BZWgMrBwk7oa9"> 13 14 <!-- Primary Meta Tags --> 15 16 17<title>Jotform Pricing 2026: $34-$99/mo Plans & Hidden Costs - FormNX</title> 18<meta name="title" content="Jotform Pricing 2026: $34-$99/mo Plans & Hidden Costs - FormNX" /> 19 20 <meta name="description" content="Jotform pricing 2026: free Starter to $99/mo Gold (billed annually), Enterprise quote-only. Every plan's real limits, the hidden costs & a no-caps alternative."> 21 22<!-- Open Graph / Facebook --> 23<meta property="og:type" content="website" /> 24<meta property="og:url" content="https://formnx.com/jotform-pricing" /> 25<meta property="og:title" content="Jotform Pricing 2026: $34-$99/mo Plans & Hidden Costs - FormNX" /> 26 <meta property="og:description" content="Jotform pricing 2026: free Starter to $99/mo Gold (billed annually), Enterprise quote-only. Every plan's real limits, the hidden costs & a no-caps alternative." /> 27 28 <meta property="og:image" content="https://formnx.com/img/jotform-pricing.png" /> 29 30<!-- Twitter --> 31<meta property="twitter:card" content="summary_large_image" /> 32<meta property="twitter:url" content="https://formnx.com/jotform-pricing" /> 33<meta property="twitter:title" content="Jotform Pricing 2026: $34-$99/mo Plans & Hidden Costs - FormNX" /> 34 <meta property="twitter:description" content="Jotform pricing 2026: free Starter to $99/mo Gold (billed annually), Enterprise quote-only. Every plan's real limits, the hidden costs & a no-caps alternative." /> 35 36 <meta property="twitter:image" content="https://formnx.com/img/jotform-pricing.png" /> 37 38 39<link rel="canonical" href="https://formnx.com/jotform-pricing" /> 40 41 <link rel="icon" href="https://formnx.com/img/logo.svg"/> 42 43
43<script 44 id="datafast-script" 45 defer 46 data-website-id="dfid_dqAk2mBIKfUfADLlgiY6A" 47 data-domain="formnx.com" 48 src="https://datafa.st/js/script.js"> 49</script>
49 50 51 <!-- Fonts --> 52 <link rel="preconnect" href="https://fonts.googleapis.com"> 53 <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> 54 55 <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Bricolage+Grotesque:opsz,[email protected],400..800&display=swap" rel="stylesheet"> 56 57 <link rel="icon" href="https://formnx.com/img/logo.svg"/> 58 59 60 <link href="https://formnx.com/css/vendor.css?id=3997cc104465c80b4a2f" rel="stylesheet"> 61 62 63<!-- intro.js & animate css--> 64<!-- NOTE:common bundled css files to optimize size --> 65<style type="text/css"> 66 67 /* Reset input fields css by theme*/ 68 :root { 69 --label-color: #525760; 70 --icon-color: #525760; 71 --text-color: #525760; 72 --border-color: #525760; 73 /* --shadow-color: #525760; */ 74 --error-color: #a94442; 75 --error-background: #F8F9FA; 76 --border-radius: 0.25rem; 77 --label-font-size: 14px; 78 --field-bg-color: #ffffff; 79 /* --box-shadow-input: 0 1px 1px var(--shadow-color); */ 80 } 81 82 @supports (color: color-mix(in srgb, white, black)) { 83 :root { 84 --icon-color: color-mix(in srgb, var(--label-color), #fff 30%); 85 --border-color: color-mix(in srgb, var(--label-color), #fff 30%); 86 /* --shadow-color: color-mix(in srgb, var(--label-color), #fff 30%); */ 87 --error-background: color-mix(in srgb, var(--error-color), #fff 80%); 88 /* --box-shadow-input: 0 1px 1px var(--shadow-color); */ 89 } 90 } 91 92 93 body { 94 margin: 0; /* If not already reset */ 95 } 96 .content { 97 min-height: calc(100vh - 80px); 98 } 99 .mh-250{ 100 max-height: 15.625rem; 101 } 102 .w-100-percent { 103 width: 100%; 104 } 105 106 span.error { 107 color: var(--error-color) !important; 108 } 109 110 label.error { 111 color: var(--error-color) !important; 112 background: var(--error-background) !important; 113 padding: 4px 10px !important; 114 border-radius: 5px !important; 115 margin-top: 8px !important; 116 font-weight: 500 !important; 117 font-size: 12px !important; 118 transition: all .2s; 119 } 120 121 label > span { 122 color: var(--label-color); 123 font-size: var(--label-font-size); 124 } 125 label { 126 color: var(--label-color); 127 } 128 .option-description{ 129 color: var(--label-color); 130 font-weight: 600; 131 } 132 .form-group .input-group-text { 133 color: var(--icon-color) !important; 134 } 135 .input-group { 136 border-radius: var(--border-radius); 137 } 138 .form-control, .form-select, .input-group-text, span.select2{ 139 background-color: var(--field-bg-color); 140 color: var(--text-color); 141 border-radius: var(--border-radius); 142 } 143 .form-control:focus, .form-select:focus{ 144 border-color: var(--border-color); 145 outline: 0; 146 } 147 .select2-container--bootstrap-5.select2-container--focus .select2-selection, .select2-container--bootstrap-5.select2-container--open .select2-selection { 148 border-color: var(--border-color); 149 outline: 0; 150 border-radius: var(--border-radius); 151 } 152 .note-frame { 153 color: var(--text-color); 154 background: var(--field-bg-color); 155 } 156 .dropzone { 157 border-color: var(--border-color) !important; 158 background: var(--field-bg-color); 159 border-radius: var(--border-radius); 160 } 161 .form-control[readonly] { 162 background-color: var(--field-bg-color); 163 } 164 .select2-container--bootstrap-5 .select2-dropdown { 165 background-color: #ffffff; 166 border-color: #e2e8f0; 167 border-radius: var(--border-radius) !important; 168 } 169 .select2-container--bootstrap-5 .select2-selection { 170 color: var(--text-color); 171 background-color: var(--field-bg-color) !important; 172 border-radius: var(--border-radius); 173 } 174 .input-group .select2-container--bootstrap-5 { 175 flex-grow: 1; 176 border-radius: var(--border-radius); 177 } 178 table.input_table thead tr th, table.input_table tbody tr td:nth-child(1) { 179 color: var(--label-color); 180 } 181 .option-with-card { 182 border-radius: var(--border-radius); 183 } 184 .input-group:has(.form-control-plaintext) { 185 box-shadow: none; 186 } 187 .form-control-plaintext { 188 font-size: var(--label-font-size) !important; 189 color: var(--label-color) !important; 190 font-weight: 600 !important; 191 padding: .5rem; 192 } 193 /* Remove box shadow when select2 is focused */ 194 .select2-container--focus .select2-selection { 195 box-shadow: none !important; 196 } 197 /* Remove box shadow for the dropdown */ 198 .select2-container--open .select2-selection { 199 box-shadow: none !important; 200 } 201 /*remove outline for better visibility */ 202 .select2-container--focus .select2-selection, 203 .select2-container--open .select2-selection { 204 outline: none !important; 205 } 206 .form-logo * { 207 color: var(--label-color); 208 } 209 /* Upload fields (dropzone / photo capture / voice recorder) disabled because 210 the form owner's workspace has exhausted its storage quota. Children are made 211 inert so every click lands on the wrapper, which raises the "uploads 212 unavailable" alert. */ 213 .upload-disabled { 214 display: flex; 215 align-items: center; 216 justify-content: center;
217 cursor: not-allowed; 218 min-height: 90px; 219 padding: 1rem; 220 background-color: #f6f7f9 !important; 221 border: 1px dashed var(--border-color) !important; 222 border-radius: var(--border-radius); 223 } 224 .upload-disabled * { 225 pointer-events: none; 226 } 227 /* Icon + reason, centred inside the box so the field reads as deliberately 228 switched off rather than as a dropzone that failed to load. */ 229 .upload-disabled__body { 230 display: flex; 231 flex-direction: column; 232 align-items: center; 233 gap: 0.3rem; 234 text-align: center; 235 color: var(--label-color); 236 opacity: 0.75; 237 font-size: 0.875rem; 238 font-weight: 500; 239 } 240 /* Full reason, shown on the field itself so the respondent understands without 241 having to click through to the alert. */ 242 .upload-disabled__hint { 243 max-width: 34rem; 244 font-size: 0.8125rem; 245 font-weight: 400; 246 line-height: 1.4; 247 } 248</style> 249<!-- Form additional css --> 250 <link rel="stylesheet" href="https://formnx.com/assets/css/lp.css?v=231" /> 251 252 <link rel="stylesheet" href="https://formnx.com/assets/css/lp2.css?v=231" /> 253 254
255<script type="application/ld+json"> 256{ 257 "@context": "https://schema.org", 258 "@type": "FAQPage", 259 "mainEntity": [ 260 { 261 "@type": "Question", 262 "name": "How much does Jotform cost per month?", 263 "acceptedAnswer": { "@type": "Answer", "text": "Jotform has a free Starter plan ($0) and four paid tiers: Bronze is $39\/mo ($34\/mo billed annually), Silver $49\/mo ($39 annually), Gold $129\/mo ($99 annually), and Enterprise is custom-priced. The annual prices are the effective monthly cost when you pay for a full year upfront." } 264 }, { 265 "@type": "Question", 266 "name": "Is Jotform free?", 267 "acceptedAnswer": { "@type": "Answer", "text": "Yes. Jotform\u0027s Starter plan is free forever and includes 5 forms, 100 submissions per month, 100 MB of storage and 10,000 monthly views, with Jotform branding on your forms. Payments and signed documents are capped at 10 each per month, so most businesses outgrow the free plan quickly." } 268 }, { 269 "@type": "Question", 270 "name": "What is cheaper than Jotform?", 271 "acceptedAnswer": { "@type": "Answer", "text": "FormNX is cheaper at every comparable volume. Its entry paid plan is $15\/mo ($12 billed annually) versus Jotform\u0027s $34\/mo Bronze, and FormNX gives you unlimited submissions and 5 users where Jotform caps submissions and limits you to a single user until Enterprise." } 272 }, { 273 "@type": "Question", 274 "name": "Does Jotform charge transaction or payment fees?", 275 "acceptedAnswer": { "@type": "Answer", "text": "Jotform charges no platform surcharge on payments on any plan - you pay only Stripe, PayPal or Square\u0027s standard processing fees. However, the number of payment submissions you can collect is capped per tier (10 on free, up to 1,000 on Gold; unlimited only on Enterprise)." } 276 }, { 277 "@type": "Question", 278 "name": "Does Jotform offer a nonprofit discount?", 279 "acceptedAnswer": { "@type": "Answer", "text": "Yes. Nonprofit and educational organizations get 50% off the Bronze, Silver and Gold plans, and 30% off Enterprise. You apply through Jotform with proof of your organization\u0027s status. FormNX also offers nonprofits 50% off all plans - contact FormNX support to claim it." } 280 }, { 281 "@type": "Question", 282 "name": "How much is Jotform Enterprise?", 283 "acceptedAnswer": { "@type": "Answer", "text": "Jotform Enterprise is custom-priced and quote-based - there is no public price. It removes all per-tier caps and adds multi-user access, SSO and dedicated support. Vendr\u0027s procurement data puts the median Jotform contract at $9,549 per year (with buyers ranging from $6,772 to $42,974), and the UK Government\u0027s G-Cloud framework lists a base package covering 5 users and 1 domain at $8,328. Your own quote depends on seats, submission volume and compliance needs." } 284 }, { 285 "@type": "Question", 286 "name": "Does Jotform have HIPAA compliance?", 287 "acceptedAnswer": { "@type": "Answer", "text": "Yes, but only on the Gold and Enterprise plans. The free, Bronze and Silver tiers do not include HIPAA features, so healthcare workflows that handle protected health information need at least Gold ($99\/mo annually)." } 288 }, { 289 "@type": "Question", 290 "name": "How much does Jotform Sign cost?", 291 "acceptedAnswer": { "@type": "Answer", "text": "Jotform Sign is not a separate subscription - e-signatures are built into every Jotform plan, including the free Starter plan. What changes by tier is how many signed documents you can collect each month: 10 on Starter (free), 100 on Bronze, 250 on Silver, 1,000 on Gold and unlimited only on Enterprise. So \u0022Jotform Sign pricing\u0022 is really just your Jotform plan price, with the monthly signed-document cap being the limit to watch. FormNX includes unlimited signed documents on its paid plans - see the comparison below." } 292 }, { 293 "@type": "Question", 294 "name": "What are the disadvantages of Jotform?", 295 "acceptedAnswer": { "@type": "Answer", "text": "The main drawback is that Jotform meters usage: forms, fields per form, monthly submissions, monthly views, payments and signed documents are all capped per plan, so growing teams have to keep upgrading. Every plan below Enterprise is also single-user, and Enterprise pricing is quote-only. A Jotform alternative like FormNX removes those usage caps and lets you invite a team on the entry plan." } 296 }, { 297 "@type": "Question", 298 "name": "Is Google Forms or Jotform better?",
299 "acceptedAnswer": { "@type": "Answer", "text": "Google Forms is free and great for simple internal surveys, while Jotform is more powerful for payments, e-signatures and workflows but costs more and caps usage. If you want Jotform-level features without the caps, see our Jotform vs Google Forms comparison." } 300 }, { 301 "@type": "Question", 302 "name": "What are the limitations of the Jotform free version?", 303 "acceptedAnswer": { "@type": "Answer", "text": "The Starter (free) plan caps you at 5 active forms, 100 submissions per month, 100 fields per form, 10,000 monthly form views and 100 MB of storage, with Jotform branding on every form. Payments and signed documents are limited to 10 each per month, and a separate lifetime ceiling of 500 total stored submissions applies - once you reach it, new responses stop being stored even if you are under the monthly limit." } 304 }, { 305 "@type": "Question", 306 "name": "Does Jotform have discounts or sales?", 307 "acceptedAnswer": { "@type": "Answer", "text": "Yes. Nonprofits and educational institutions get 50% off Bronze, Silver and Gold (30% off Enterprise), annual billing is discounted against month-to-month on every tier, and Jotform runs periodic seasonal sales. All paid plans come with a 30-day money-back guarantee." } 308 } ] 309} 310</script>
310 311
312<script type="application/ld+json"> 313{ 314 "@context": "https://schema.org", 315 "@type": "BreadcrumbList", 316 "itemListElement": [ 317 {"@type": "ListItem", "position": 1, "name": "Home", "item": "https://formnx.com"}, 318 {"@type": "ListItem", "position": 2, "name": "Jotform Pricing", "item": "https://formnx.com/jotform-pricing"} 319 ] 320} 321</script>
321 322
323<script type="application/ld+json"> 324{ 325 "@context": "https://schema.org", 326 "@type": "SoftwareApplication", 327 "name": "FormNX", 328 "applicationCategory": "BusinessApplication", 329 "operatingSystem": "Web", 330 "offers": {"@type": "Offer", "price": "0", "priceCurrency": "USD"} 331} 332</script>
332 333 334<style> 335/* ===== Competitor pricing-guide page (scoped) ===== */ 336/* Inherit the same FormNX-green theme the alternative pages use. */ 337.pricing-guide-page{--template-theme-color:var(--formnx-success,#10b981);--template-theme-hover:#0559a8;} 338.pricing-guide-page .pp-meta{font-size:.85rem;color:#6b7280;margin-bottom:.5rem;} 339.pricing-guide-page .pp-secondary-cta{margin-top:1rem;display:flex;flex-wrap:wrap;gap:.5rem;} 340 341/* Quick-answer box (the single, canonical price summary) */ 342.pp-quick{background:#fff;border:1px solid #e6e8ee;border-radius:16px;padding:1.75rem 2rem;box-shadow:0 8px 30px rgba(20,23,40,.05);} 343.pp-quick h2{font-size:1.35rem;margin-bottom:1rem;} 344.pp-quick ul{list-style:none;padding:0;margin:0;} 345.pp-quick li{position:relative;padding-left:1.6rem;margin-bottom:.6rem;line-height:1.5;} 346.pp-quick li:before{content:"";position:absolute;left:0;top:.55em;width:8px;height:8px;border-radius:50%;background:var(--formnx-primary, #066fd1);} 347 348/* Limits table (replaces the price cards) */ 349table.pp-limits-table,table.pp-limits-table thead th,table.pp-limits-table tbody td{text-transform:none !important;letter-spacing:normal !important;} 350.pp-limits-table thead th{background:#f6f7fb;font-size:.9rem;white-space:nowrap;} 351.pp-limits-table th,.pp-limits-table td{font-size:.88rem;} 352.pp-limits-table tbody td:last-child{background:rgba(47,179,68,.05);} /* Enterprise = "unlimited" column, subtle tint */ 353.pp-no{color:#9ca3af;} 354 355/* Compare-section image ("competitor price vs FormNX price") */ 356.pp-compare-img{border-radius:14px;box-shadow:0 8px 30px rgba(20,23,40,.10);max-width:100%;height:auto;} 357 358/* Callout */ 359.pp-callout{margin-top:1.75rem;background:#f0fdf4;border:1px solid #a7f3d0;border-radius:14px;padding:1.1rem 1.4rem;display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:1rem;} 360.pp-callout p{margin:0;font-weight:600;color:#065f46;} 361 362/* Plan breakdown */ 363.pp-breakdown{max-width:820px;margin:0 auto;} 364.pp-breakdown__item{padding:1.1rem 0;border-bottom:1px solid #edeef2;} 365.pp-breakdown__item:last-child{border-bottom:0;} 366.pp-breakdown__item h3{font-size:1.1rem;margin:0 0 .35rem;} 367.pp-breakdown__item p{margin:0;color:#4b5563;} 368 369/* Deep-dive topic sections (enterprise / nonprofit / HIPAA / add-on pricing) */ 370.pp-deep{max-width:820px;margin:0 auto;} 371.pp-deep__item{padding:1.6rem 0;border-bottom:1px solid #edeef2;} 372.pp-deep__item:last-child{border-bottom:0;} 373.pp-deep__title{font-size:1.35rem;margin:0 0 .75rem;} 374.pp-deep__item p{color:#374151;margin-bottom:.85rem;} 375.pp-deep__item p:last-child{margin-bottom:0;} 376.pp-deep__item ul{color:#374151;padding-left:1.15rem;margin-bottom:.85rem;} 377.pp-deep__item li{margin-bottom:.4rem;} 378.pp-deep__lead{background:#f6f7fb;border-left:3px solid var(--formnx-primary,#066fd1);border-radius:0 10px 10px 0;padding:.9rem 1.15rem;} 379.pp-deep__note{font-size:.85rem;color:#6b7280;} 380 381/* Generic prose panels (is-free, choose-plan) */ 382.pp-panel{max-width:820px;margin:0 auto;background:#fff;border:1px solid #e6e8ee;border-radius:16px;padding:1.75rem 2rem;} 383.pp-panel p{color:#374151;} 384.pp-choose{list-style:none;padding:0;margin:0;} 385.pp-choose li{padding:.7rem 0;border-bottom:1px solid #edeef2;display:flex;gap:.75rem;} 386.pp-choose li:last-child{border-bottom:0;} 387.pp-choose__plan{font-weight:700;color:#111827;min-width:130px;flex-shrink:0;} 388.pp-choose__who{color:#4b5563;} 389@media(max-width:560px){.pp-choose li{flex-direction:column;gap:.15rem;}} 390 391/* Worth-it two columns */ 392.pp-worth{display:grid;grid-template-columns:1fr 1fr;gap:1rem;max-width:900px;margin:0 auto;} 393@media(max-width:680px){.pp-worth{grid-template-columns:1fr;}} 394.pp-worth__col{border-radius:14px;padding:1.4rem 1.5rem;border:1px solid #e6e8ee;background:#fff;} 395.pp-worth__col h3{font-size:1.05rem;margin-bottom:.9rem;} 396.pp-worth__col ul{list-style:none;padding:0;margin:0;} 397.pp-worth__col li{position:relative;padding-left:1.6rem;margin-bottom:.6rem;color:#374151;line-height:1.45;} 398.pp-worth__col li:before{position:absolute;left:0;top:0;font-weight:700;} 399.pp-worth__col--yes li:before{content:"\2713";color:#2fb344;} 400.pp-worth__col--no li:before{content:"\2717";color:#dc2626;} 401
402/* FormNX compare: wins / choose-competitor */ 403.pp-two{display:grid;grid-template-columns:1fr 1fr;gap:1rem;max-width:980px;margin:1.5rem auto 0;} 404@media(max-width:680px){.pp-two{grid-template-columns:1fr;}} 405.pp-two__card{border-radius:14px;padding:1.4rem 1.5rem;border:1px solid #e6e8ee;background:#fff;} 406.pp-two__card--formnx{border-color:#a7f3d0;background:#f0fdf4;} 407.pp-two__card h3{font-size:1.05rem;margin-bottom:.9rem;} 408.pp-two__card ul{list-style:none;padding:0;margin:0;} 409.pp-two__card li{position:relative;padding-left:1.6rem;margin-bottom:.6rem;color:#374151;line-height:1.45;} 410.pp-two__card--formnx li:before{content:"\2713";position:absolute;left:0;color:#2fb344;font-weight:700;} 411.pp-two__card--competitor li:before{content:"\2192";position:absolute;left:0;color:#6b7280;font-weight:700;} 412 413/* Sticky CTA bar */ 414.pp-sticky{position:fixed;left:0;right:0;bottom:0;z-index:1040;background:#0f172a;color:#fff;transform:translateY(110%);transition:transform .25s ease;box-shadow:0 -6px 24px rgba(0,0,0,.18);} 415.pp-sticky.is-visible{transform:translateY(0);} 416.pp-sticky__inner{display:flex;align-items:center;justify-content:center;gap:1rem;padding:.7rem 1rem;flex-wrap:wrap;} 417.pp-sticky__text{font-weight:600;font-size:.95rem;} 418.pp-sticky__text strong{color:#6ee7b7;} 419.pp-sticky .cta-button{margin:0;} 420</style> 421 <style> 422 .menu-item { 423 display: flex; 424 justify-content: space-between; 425 align-items: center; 426 } 427 .menu-divider { 428 border-top: 1px solid white; 429 margin: 0.5rem 0; 430 } 431 .child-category { 432 margin-left: 20px; 433 } 434 .nested-menu { 435 display: none; 436 } 437 .parent-menu { 438 display: flex; 439 justify-content: space-between; 440 align-items: center; 441 } 442 .parent-menu .right-section { 443 display: flex; 444 align-items: center; 445 } 446 .parent-menu .category-menu { 447 margin-left: 10px; 448 } 449 .category-menu { 450 cursor: pointer; 451 background-image: var(--formnx-accordion-btn-icon); 452 width: 1rem; 453 height: 1rem; 454 opacity: 0.7; 455 } 456 .category-menu.active { 457 transform: var(--formnx-accordion-btn-icon-transform); 458 } 459</style></head> 460 461 462<body class="lp2 "> 463 464 <main class="main-content" id="app"> 465 466 <header class="hero container-fluid position-relative"> 467 <div class="hero__content container"> 468 469 <div class="fixed-nav-container"> 470 <nav class="hero-nav position-relative container mx-auto px-0"> 471 <ul class="nav w-100 list-unstyled align-items-center p-0"> 472 <li class="hero-nav__item"><a href="/"><img class="hero-nav__logo" src="https://formnx.com/img/logo-full-transparent.png" change-src-onscroll="https://formnx.com/img/logo-full-transparent.png" alt="FormNX Logo"></a><!-- Don't remove this empty span -->
472<span class=""></span> 473 </li> 474 <li id="hero-menu" class="flex-grow-1 hero__nav-list hero__nav-list--mobile-menu ft-menu"> 475 <ul 476 class="hero__menu-content nav flex-column flex-lg-row ft-menu__slider animated list-unstyled p-2 p-lg-0"> 477 <li class="flex-grow-1"> 478 <ul 479 class="nav nav--lg-side flex-column-reverse flex-lg-row-reverse list-unstyled align-items-center p-0"> 480 <li class="flex-grow-1"> 481 <ul 482 class="nav nav--lg-side flex-column-reverse flex-lg-row-reverse list-unstyled align-items-center p-0"> 483 484 <li class="hero-nav__item"><a href="https://formnx.com/register" class="btn btn-primary">Try For Free</a></li> 485 486 <li class="hero-nav__item"><a 487 href="https://formnx.com/login" class="hero-nav__link">Login</a></li> 488 </ul> 489 </li> 490 <li class="hero-nav__item"><a href="https://formnx.com/contact" class="hero-nav__link">Contact Us</a> 491 </li> 492 <li class="hero-nav__item"><a href="https://formnx.com/price" class="hero-nav__link">Pricing</a></li> 493 <li class="hero-nav__item dropdown" 494 onmouseenter="if(window.bootstrap && window.matchMedia('(min-width: 992px)').matches){bootstrap.Dropdown.getOrCreateInstance(this.querySelector('.dropdown-toggle')).show()}" 495 onmouseleave="if(window.bootstrap && window.matchMedia('(min-width: 992px)').matches){bootstrap.Dropdown.getOrCreateInstance(this.querySelector('.dropdown-toggle')).hide()}" 496 > 497 <a href="#" class="hero-nav__link dropdown-toggle" data-bs-toggle="dropdown">Templates</a> 498 <ul class="dropdown-menu"> 499 <li><a class="dropdown-item" href="https://formnx.com/form-templates">Form Templates</a></li> 500 <li><a class="dropdown-item" href="https://formnx.com/pdf-templates">PDF Templates</a></li> 501 </ul> 502 </li> 503 <li class="hero-nav__item dropdown" 504 onmouseenter="if(window.bootstrap && window.matchMedia('(min-width: 992px)').matches){bootstrap.Dropdown.getOrCreateInstance(this.querySelector('.dropdown-toggle')).show()}" 505 onmouseleave="if(window.bootstrap && window.matchMedia('(min-width: 992px)').matches){bootstrap.Dropdown.getOrCreateInstance(this.querySelector('.dropdown-toggle')).hide()}"> 506 <a href="#" class="hero-nav__link dropdown-toggle" data-bs-toggle="dropdown">Solutions</a> 507 <ul class="dropdown-menu"> 508 <li><a class="dropdown-item" href="https://formnx.com">Form Builder</a></li> 509 <li><a class="dropdown-item" href="https://formnx.com/pdf-builder">PDF Builder</a></li> 510 </ul> 511 </li> 512 <!-- <li class="hero-nav__item"><a href="https://formnx.com/form-templates" class="hero-nav__link">Templates</a></li> --> 513 514 <li class="hero-nav__item"><a href="https://formnx.com" class="hero-nav__link">Home</a></li> 515 516 </ul> 517 </li> 518 </ul><button close-nav-menu="" class="ft-menu__close-btn animated"><svg class="bi bi-x" 519 width="1em" height="1em" viewBox="0 0 16 16" fill="currentColor" 520 xmlns="http://www.w3.org/2000/svg"> 521 <path fill-rule="evenodd" 522 d="M11.854 4.146a.5.5 0 010 .708l-7 7a.5.5 0 01-.708-.708l7-7a.5.5 0 01.708 0z" 523 clip-rule="evenodd"></path> 524 <path fill-rule="evenodd" 525 d="M4.146 4.146a.5.5 0 000 .708l7 7a.5.5 0 00.708-.708l-7-7a.5.5 0 00-.708 0z" 526 clip-rule="evenodd"></path> 527 </svg></button> 528 </li> 529 <li class="hero-nav__item d-lg-none d-flex flex-row-reverse align-items-center gap-1"><button open-nav-menu="" 530 class="text-center px-2"><i class="fas fa-bars"></i></button> 531 <a href="https://formnx.com/register" class="btn btn-primary btn-sm">Try Free</a> 532 </li> 533 </ul> 534 </nav> 535 </div> 536 537 538 </div> 539 </header> 540 541 <div class="pricing-guide-page"> 542 543 544 <div class="pp-sticky" id="pp-sticky"> 545 <div class="pp-sticky__inner">
546 <span class="pp-sticky__text">Hitting Jotform's limits? <strong>FormNX has none - unlimited from $15/mo.</strong></span> 547 <a href="https://formnx.com/register" class="cta-button">Try FormNX Free 548 <svg width="18" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 7l5 5m0 0l-5 5m5-5H6"/></svg> 549 </a> 550 </div> 551 </div> 552 553 554 <div class="templates-hero-section" id="pp-hero"> 555 <div class="container-fluid"> 556 <div class="row align-items-center"> 557 <div class="col-lg-10 mx-auto"> 558 <p class="pp-meta">Pricing verified October 2026 · updated for 2026</p> 559 <span class="hero-badge mb-3 d-inline-block">An independent Jotform pricing analysis · October 2026</span> 560 561 <h1 class="hero-title mb-3">Jotform Pricing 2026: Plans, Real Costs & a Cheaper Alternative</h1> 562 563 <p class="hero-subtitle mb-3">Jotform has a free Starter plan and four paid tiers, starting at $34/mo (Bronze, billed annually) and rising to custom Enterprise pricing. The catch is what each plan limits: forms, form fields, monthly submissions, monthly views, payments and signed documents are all capped per tier, and every plan below Enterprise is single-user.</p> 564 565 <div class="hero-feature-pills d-flex flex-wrap gap-2 mt-3 mb-3"> 566 <span class="hero-pill"> 567 <svg width="14" height="14" fill="none" stroke="currentColor" stroke-width="2.5" viewBox="0 0 24 24" class="me-1"><path stroke-linecap="round" stroke-linejoin="round" d="M5 13l4 4L19 7"/></svg> 568 Free plan: 5 forms, 100 submissions/mo 569 </span> 570 <span class="hero-pill"> 571 <svg width="14" height="14" fill="none" stroke="currentColor" stroke-width="2.5" viewBox="0 0 24 24" class="me-1"><path stroke-linecap="round" stroke-linejoin="round" d="M5 13l4 4L19 7"/></svg> 572 Paid plans from $34/mo (billed annually) 573 </span> 574 <span class="hero-pill"> 575 <svg width="14" height="14" fill="none" stroke="currentColor" stroke-width="2.5" viewBox="0 0 24 24" class="me-1"><path stroke-linecap="round" stroke-linejoin="round" d="M5 13l4 4L19 7"/></svg> 576 Forms, fields, views, payments & signatures all capped 577 </span> 578 <span class="hero-pill"> 579 <svg width="14" height="14" fill="none" stroke="currentColor" stroke-width="2.5" viewBox="0 0 24 24" class="me-1"><path stroke-linecap="round" stroke-linejoin="round" d="M5 13l4 4L19 7"/></svg> 580 Single user until Enterprise 581 </span> 582 </div> 583 584 <div class="pp-secondary-cta"> 585 <a href="https://formnx.com/register" class="cta-button">Try FormNX Free 586 <svg width="20" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 7l5 5m0 0l-5 5m5-5H6"/></svg> 587 </a> 588 <a href="#pricing-table" class="btn btn-outline-secondary">See the limits</a> 589 </div> 590 </div> 591 </div> 592 </div> 593 </div> 594 595 596 <div class="space-between-blocks"> 597 <div class="container"> 598 <div class="col-lg-9 mx-auto"> 599 <div class="pp-quick"> 600 <h2>How much does Jotform cost?</h2> 601 <ul> 602 <li><strong>Free (Starter):</strong> $0 - 5 forms, 100 submissions/mo, Jotform branding.</li> 603 <li><strong>Bronze:</strong> $34/mo billed annually ($39 monthly) - 1,000 submissions/mo.</li> 604 <li><strong>
604Silver:</strong> $39/mo billed annually ($49 monthly) - 2,500 submissions/mo.</li> 605 <li><strong>Gold:</strong> $99/mo billed annually ($129 monthly) - 10,000 submissions/mo, HIPAA.</li> 606 <li><strong>Enterprise:</strong> custom pricing - unlimited usage and multi-user access.</li> 607 </ul> 608 </div> 609 </div> 610 </div> 611 </div> 612 613 614 <div class="space-between-blocks bg-light" id="pricing-table"> 615 <div class="container"> 616 <div class="col-lg-8 mx-auto text-center mb-4"> 617 <p class="block__paragraph--big mb-1">Plans at a glance</p> 618 <h2 class="block__title">What each Jotform plan limits</h2> 619 </div> 620 <div class="col-lg-9 mx-auto text-center mb-4"><p class="hero-subtitle">Jotform prices by usage, so the question that matters isn't just the monthly fee - it's what each tier caps. Here's how the limits scale across plans.</p></div> 621 622 <div class="row justify-content-center"> 623 <div class="col-lg-11"> 624 <div class="table-responsive"> 625 <table class="table table-bordered align-middle text-center bg-white pp-limits-table"> 626 <thead> 627 <tr> 628 <th class="text-start">Limit</th> 629 <th>Starter (Free)</th> 630 <th>Bronze</th> 631 <th>Silver</th> 632 <th>Gold</th> 633 <th>Enterprise</th> 634 </tr> 635 </thead> 636 <tbody> 637 <tr> 638 <td class="text-start fw-semibold">Active forms</td> 639 <td>5</td> 640 <td>25</td> 641 <td>50</td> 642 <td>100</td> 643 <td>Unlimited</td> 644 </tr> 645 <tr> 646 <td class="text-start fw-semibold">Fields per form</td> 647 <td>100</td> 648 <td>250</td> 649 <td>500</td> 650 <td>1,000</td> 651 <td>Unlimited</td> 652 </tr> 653 <tr> 654 <td class="text-start fw-semibold">Monthly submissions</td> 655 <td>100/mo</td> 656 <td>1,000/mo</td> 657 <td>2,500/mo</td> 658 <td>10,000/mo</td> 659 <td>Unlimited</td> 660 </tr> 661 <tr> 662 <td class="text-start fw-semibold">Total stored submissions</td> 663 <td>500</td> 664 <td>10,000</td> 665 <td>25,000</td> 666 <td>100,000</td> 667 <td>Unlimited</td> 668 </tr> 669 <tr> 670 <td class="text-start fw-semibold">Monthly form views</td> 671 <td>10,000/mo</td> 672 <td>100,000/mo</td> 673 <td>1M/mo</td> 674 <td>10M/mo</td> 675 <td>Unlimited</td> 676 </tr> 677 <tr> 678 <td class="text-start fw-semibold">Payment submissions</td> 679 <td>10/mo</td> 680 <td>100/mo</td> 681 <td>250/mo</td> 682 <td>1,000/mo</td> 683 <td>Unlimited</td> 684 </tr> 685 <tr> 686 <td class="text-start fw-semibold">Signed documents</td> 687 <td>10/mo</td> 688 <td>100/mo</td> 689 <td>250/mo</td> 690 <td>1,000/mo</td> 691 <td>Unlimited</td> 692 </tr> 693 <tr> 694 <td class="text-start fw-semibold">Storage</td> 695 <td>100 MB</td> 696 <td>1 GB</td> 697 <td>10 GB</td> 698 <td>100 GB</td> 699 <td>Unlimited</td> 700 </tr> 701 <tr> 702 <td class="text-start fw-semibold">Users</td> 703 <td>1</td> 704 <td>1</td> 705 <td>1</td> 706 <td>1</td> 707 <td>
707Multi-user</td> 708 </tr> 709 <tr> 710 <td class="text-start fw-semibold">HIPAA</td> 711 <td><span class="pp-no">No</span></td> 712 <td><span class="pp-no">No</span></td> 713 <td><span class="pp-no">No</span></td> 714 <td>Yes</td> 715 <td>Yes</td> 716 </tr> 717 </tbody> 718 </table> 719 </div> 720 <p class="text-muted text-center small mt-3">Limits verified against jotform.com/pricing in October 2026. Note the separate lifetime cap on total stored submissions - the free plan stops at 500 stored submissions even if you never exceed 100 in a month. Nonprofit and education accounts get 50% off Bronze, Silver and Gold. Full prices are in the summary above.</p> 721 722 <div class="pp-callout"> 723 <p>FormNX caps none of these — unlimited forms, fields, submissions & views, with 5 team members from $15/mo.</p> 724 <a href="#formnx-compare" class="btn btn-outline-secondary">Compare FormNX ↓</a> 725 </div> 726 </div> 727 </div> 728 </div> 729 </div> 730 731 732 <div class="space-between-blocks"> 733 <div class="container"> 734 <div class="col-lg-8 mx-auto text-center mb-4"> 735 <p class="block__paragraph--big mb-1">What each plan gets you</p> 736 <h2 class="block__title">Jotform plans, explained</h2> 737 </div> 738 <div class="pp-breakdown"> 739 <div class="pp-breakdown__item"> 740 <h3>Starter (Free)</h3> 741 <p>5 forms and 100 submissions a month, 100 fields per form and 100 MB of storage, with Jotform branding. Enough to test the product or run one low-traffic form - most businesses hit a cap within days. Payments and signed documents are limited to 10 each per month.</p> 742 </div> 743 <div class="pp-breakdown__item"> 744 <h3>Bronze</h3> 745 <p>25 forms, 1,000 submissions/mo, 250 fields per form, 100 payment submissions, 100 signed documents and 1 GB of storage. The entry paid tier for a single user with modest, predictable volume.</p> 746 </div> 747 <div class="pp-breakdown__item"> 748 <h3>Silver</h3> 749 <p>50 forms, 2,500 submissions/mo, 500 fields per form, 250 payments and 250 signed documents, 10 GB storage. Jotform's most popular middle tier for growing solo businesses.</p> 750 </div> 751 <div class="pp-breakdown__item"> 752 <h3>Gold</h3> 753 <p>The first tier with HIPAA features. 100 forms, 10,000 submissions/mo, 1,000 fields per form, 1,000 payments and 1,000 signed documents, 100 GB storage. The jump up from Silver more than doubles the effective monthly price.</p> 754 </div> 755 <div class="pp-breakdown__item"> 756 <h3>Enterprise</h3> 757 <p>Custom-quoted. Lifts every cap - unlimited forms, fields, submissions, views, payments and signed documents - and adds multi-user access, SSO and dedicated support. The only plan without a public price, and the only way to add teammates.</p> 758 </div> 759 </div> 760 </div> 761 </div> 762 763 764 <div class="space-between-blocks bg-light"> 765 <div class="container"> 766 <div class="col-lg-8 mx-auto text-center mb-4"> 767 <h2 class="block__title">Is Jotform free?</h2> 768 </div> 769 <div class="pp-panel"> 770 <p>Yes - Jotform's Starter plan is free forever, with no credit card required. It includes <strong>5 forms, 100 submissions per month, 100 fields per form, 100 MB of storage and 10,000 monthly views</strong>, with Jotform branding on your forms.</p><p>Two limits catch people out. Payments and signed documents are capped at <strong>10 each per month</strong>, and there is a separate lifetime ceiling of <strong>500 total stored submissions</strong> - hit that and the free plan stops storing new responses even if you never exceed 100 in a single month.</p><p>The other catch is volume. Those caps are enough to test the product or run one low-traffic form, but most businesses hit them within days. For unlimited forms, fields, submissions and views on a free plan, see the <a href="#formnx-compare">FormNX comparison below</a>.</p> 771 </div> 772 </div> 773 </div> 774 775 776 <div class="space-between-blocks"> 777 <div class="container"> 778 <div class="pp-deep"> 779 780 <section class="pp-deep__item" id="jotform-enterprise-pricing" > 781 <h2 class="pp-deep__title">Jotform Enterprise Pricing</h2> 782 <p class="pp-deep__lead">Jotform Enterprise is quote-only - there is no public price. Independent procurement data puts the median contract at <strong>$9,549 per year</strong>, with buyers landing anywhere between $6,772 and $42,974 depending on seats, submission volume and compliance requirements. It is the only Jotform tier with multi-user access, unlimited usage and SSO.</p> 783<p>
783Three public data points give you a realistic range before you talk to sales:</p> 784<ul> 785<li><strong>$9,549/year median</strong> - Vendr's procurement dataset for Jotform contracts (range $6,772-$42,974).</li> 786<li><strong>$8,328 for a base package</strong> - the UK Government's G-Cloud framework lists a Jotform Enterprise base package covering 5 users and 1 domain.</li> 787<li><strong>~$9,000/year for 10 users</strong> - a figure reported by a buyer on r/nocode.</li> 788</ul> 789<p>What moves your quote: the number of user seats (Enterprise is aimed at teams of 5+), expected submission volume, whether you need localized data residency, and add-ons like HIPAA, SSO, a custom domain and white-labeling. Nonprofit and educational organizations get <strong>30% off Enterprise</strong>, versus 50% off the standard paid plans.</p> 790<p>The trade-off worth naming: Enterprise is the only way past Jotform's per-tier caps and the only way to add a second user, so teams often land there for seat count rather than volume. FormNX publishes prices for every plan including team and agency tiers - <a href="https://formnx.com/price">see FormNX pricing</a>.</p> 791 </section> 792 793 <section class="pp-deep__item" id="jotform-nonprofit-pricing" > 794 <h2 class="pp-deep__title">Jotform Nonprofit & Education Pricing</h2> 795 <p class="pp-deep__lead">Jotform gives registered nonprofits and educational institutions <strong>50% off the Bronze, Silver and Gold plans and 30% off Enterprise</strong>. The discount is not applied at checkout - you apply through Jotform with proof of your organization's status (such as 501(c)(3) documentation) and it is added to your account once approved.</p> 796<p>At 50% off the annual rate, the effective monthly cost works out to roughly <strong>$17/mo for Bronze, $19.50/mo for Silver and $49.50/mo for Gold</strong>. The plan limits do not change - you still get the same caps on forms, submissions, views, payments and signed documents, and Bronze through Gold remain single-user.</p> 797<p>That last point matters for nonprofits specifically: a discounted Gold plan is still one login. If two people at your organization need access to the same forms and submissions, you are looking at quote-only Enterprise, where the discount drops to 30%.</p> 798<p><strong>FormNX nonprofit pricing:</strong> FormNX offers registered nonprofits a <strong>50% discount on all plans</strong> - and unlike Jotform, every FormNX plan already includes unlimited forms, submissions and views, plus up to 5 team members in your workspace from the entry plan. To claim it, <a href="https://formnx.com/contact">contact FormNX support</a> with your organization's details and the team will apply the discount to your account.</p> 799 </section> 800 801 <section class="pp-deep__item" id="jotform-hipaa-pricing" > 802 <h2 class="pp-deep__title">Jotform HIPAA Pricing</h2> 803 <p class="pp-deep__lead">HIPAA compliance starts on Jotform's <strong>Gold plan at $99/mo billed annually ($129 month-to-month)</strong>, and is also included on Enterprise. The free Starter, Bronze and Silver plans do not include HIPAA features, so any workflow that touches protected health information needs Gold at minimum.</p> 804<p>This is the single biggest price jump in Jotform's lineup. Silver to Gold roughly two-and-a-half times the monthly cost ($39 to $99 on annual billing), and for many healthcare teams the only reason to make that jump is the compliance feature set rather than the higher usage caps that come with it.</p> 805<p>If you need HIPAA specifically, Jotform is a reasonable choice and we say so plainly - FormNX does not currently offer a HIPAA-compliant tier. Where FormNX fits is every other regulated-adjacent workflow: <a href="https://formnx.com/form-features/gdpr-compliance">GDPR-compliant forms</a>, <a href="https://formnx.com/form-features/password-protection">password-protected forms</a> and <a href="https://formnx.com/form-features/email-otp-verification">email OTP verification</a>, without per-tier usage caps.</p> 806 </section> 807 808 <section class="pp-deep__item" id="jotform-sign-pricing" > 809 <h2 class="pp-deep__title">Jotform Sign Pricing</h2> 810 <p class="pp-deep__lead">Jotform Sign has no separate subscription - e-signatures are built into every Jotform plan, including the free Starter tier. What changes by plan is the monthly signed-document cap: <strong>
81010 on Starter, 100 on Bronze, 250 on Silver, 1,000 on Gold, and unlimited only on Enterprise</strong>.</p> 811<p>So "Jotform Sign pricing" is really just your Jotform plan price, and the number to watch is how many documents you expect to get signed each month. A small agency sending 15 contracts a month is already past the free tier on signatures alone, regardless of how few form submissions it collects.</p> 812<p>FormNX includes <strong>unlimited signed documents on every paid plan</strong> with no monthly signature cap - see <a href="https://formnx.com/form-features/e-signature-forms">e-signature forms</a>.</p> 813 </section> 814 815 <section class="pp-deep__item" id="jotform-payment-fees" > 816 <h2 class="pp-deep__title">Jotform Payment Fees & Transaction Costs</h2> 817 <p class="pp-deep__lead">Jotform charges <strong>no platform fee on payments, on any plan</strong> - including the free Starter tier. When someone pays through your form, you pay only the payment processor's own standard rate (Stripe, PayPal or Square), exactly as you would using that processor directly.</p> 818<p>The real cost to watch is not a fee but a cap: <strong>payment submissions are metered per plan</strong>. The free plan accepts 10 payment submissions a month, Bronze 100, Silver 250 and Gold 1,000 - only Enterprise removes the ceiling. A form that sells tickets or collects deposits can hit its payment cap long before its general submission cap, and once it does, the form stops taking payments until the month resets or you upgrade.</p> 819<p>FormNX handles fees the same way on paid plans - no platform surcharge, processor rates only - and adds no cap on payment submissions. (On the FormNX free plan, payments carry a 7.5% Stripe Connect fee, so paid plans are the fair comparison.) See <a href="https://formnx.com/form-features/payment-forms">FormNX payment forms</a>.</p> 820 </section> 821 822 <section class="pp-deep__item" id="jotform-monthly-vs-annual" > 823 <h2 class="pp-deep__title">Jotform Monthly vs Annual Pricing</h2> 824 <p class="pp-deep__lead">Paying month-to-month costs more on every Jotform tier. Bronze is <strong>$39 monthly versus $34/mo billed annually</strong>, Silver <strong>$49 versus $39</strong>, and Gold <strong>$129 versus $99</strong>. Committing to a full year saves $60 on Bronze, $120 on Silver and $360 on Gold.</p> 825<p>In annual terms that is $408/year for Bronze, $468/year for Silver and $1,188/year for Gold, paid upfront. The saving is real, but it is worth weighing against the thing annual billing does not fix: if your submissions or form count grow past your tier mid-year, you still have to upgrade to lift the cap, and you are already locked into twelve months at the lower tier.</p> 826<p>Jotform also runs periodic sales and offers a 30-day money-back guarantee, so the effective price at signup can be lower than list. When Jotform's own marketing says paid plans "start at $19 per month", that is a promotional annual rate on Bronze during a sale - the standard list rates are the ones above.</p> 827 </section> 828 </div> 829 </div> 830 </div> 831 832 833 <div class="space-between-blocks"> 834 <div class="container"> 835 <div class="col-lg-8 mx-auto text-center mb-4"> 836 <h2 class="block__title">Which Jotform plan should you choose?</h2> 837 </div> 838 <div class="pp-panel"> 839 <ul class="pp-choose"> 840 <li><span class="pp-choose__plan">Starter (Free)</span><span class="pp-choose__who">You just want to test Jotform or run one occasional, low-traffic form.</span></li> 841 <li><span class="pp-choose__plan">Bronze</span><span class="pp-choose__who">You are a solo user collecting under ~1,000 submissions a month.</span></li> 842 <li><span class="pp-choose__plan">Silver</span><span class="pp-choose__who">You need more forms and up to 2,500 submissions - the popular middle ground.</span></li> 843 <li><span class="pp-choose__plan">Gold</span><span class="pp-choose__who">You collect high volume or need HIPAA compliance.</span></li> 844 <li><span class="pp-choose__plan">Enterprise</span><span class="pp-choose__who">You need unlimited usage, multiple users, or SSO.</span></li> 845 </ul> 846 </div> 847 </div> 848 </div> 849 850 851 <div class="space-between-blocks bg-light"> 852 <div class="container"> 853 <div class="col-lg-8 mx-auto text-center mb-4"> 854 <h2 class="block__title">Is Jotform worth the cost?</h2> 855 </div> 856 <div class="pp-worth"> 857 <div class="pp-worth__col pp-worth__col--yes"> 858 <h3>Worth it if…</h3> 859 <ul> 860 <li>You are a single user whose volume fits inside one tier's caps</li><li>You need HIPAA compliance and can use the Gold plan</li><li>You rely on Jotform's specific native integrations or its large template library</li> </ul> 861 </div> 862 <div class="pp-worth__col pp-worth__col--no"> 863 <h3>Skip it if…</h3> 864 <ul> 865 <li>Your forms, submissions or views grow month to month (caps force repeated upgrades)</li><li>You need more than one user without paying for Enterprise</li><li>You want unlimited payments or signed documents without a custom quote</li> </ul> 866 </div> 867 </div> 868 </div> 869 </div> 870 871 872 <div class="space-between-blocks"> 873 <div class="container"> 874 <div class="col-lg-8 mx-auto text-center mb-5"> 875 <p class="block__paragraph--big mb-1">What the headline price doesn't show</p> 876 <h2 class="block__title">Jotform's hidden costs</h2> 877 </div> 878 <div class="row g-4 justify-content-center"> 879 <div class="col-lg-3 col-md-6"> 880 <div class="pain-card"> 881 <div class="pain-card__icon"> 882 <svg fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24">
882<path stroke-linecap="round" stroke-linejoin="round" d="M12 9v2m0 4h.01M5.07 19h13.86c1.54 0 2.5-1.67 1.73-3L13.73 4c-.77-1.33-2.69-1.33-3.46 0L3.34 16c-.77 1.33.19 3 1.73 3z"/></svg> 883 </div> 884 <h3 class="pain-card__title">Almost everything is metered</h3> 885 <p class="pain-card__desc">It is not just submissions. Forms, fields per form, monthly views, payments, signed documents and storage all have their own per-tier ceilings - cross any one and you are pushed to upgrade.</p> 886 </div> 887 </div> 888 <div class="col-lg-3 col-md-6"> 889 <div class="pain-card"> 890 <div class="pain-card__icon"> 891 <svg fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" d="M12 9v2m0 4h.01M5.07 19h13.86c1.54 0 2.5-1.67 1.73-3L13.73 4c-.77-1.33-2.69-1.33-3.46 0L3.34 16c-.77 1.33.19 3 1.73 3z"/></svg> 892 </div> 893 <h3 class="pain-card__title">Single user on every plan but Enterprise</h3> 894 <p class="pain-card__desc">Bronze, Silver and Gold are all single-seat. The moment a teammate needs access to your forms or submissions, you jump to custom-priced Enterprise.</p> 895 </div> 896 </div> 897 <div class="col-lg-3 col-md-6"> 898 <div class="pain-card"> 899 <div class="pain-card__icon"> 900 <svg fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" d="M12 9v2m0 4h.01M5.07 19h13.86c1.54 0 2.5-1.67 1.73-3L13.73 4c-.77-1.33-2.69-1.33-3.46 0L3.34 16c-.77 1.33.19 3 1.73 3z"/></svg> 901 </div> 902 <h3 class="pain-card__title">Caps stop your forms mid-month</h3> 903 <p class="pain-card__desc">Hit a submission, payment or signed-document cap partway through the month and that form simply stops collecting until you upgrade or the month resets.</p> 904 </div> 905 </div> 906 <div class="col-lg-3 col-md-6"> 907 <div class="pain-card"> 908 <div class="pain-card__icon"> 909 <svg fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" d="M12 9v2m0 4h.01M5.07 19h13.86c1.54 0 2.5-1.67 1.73-3L13.73 4c-.77-1.33-2.69-1.33-3.46 0L3.34 16c-.77 1.33.19 3 1.73 3z"/></svg> 910 </div> 911 <h3 class="pain-card__title">Enterprise is quote-only</h3> 912 <p class="pain-card__desc">The only uncapped, multi-user plan has no public price. Users on Reddit report Enterprise quotes around $9k/year - you cannot self-serve your way past the limits.</p> 913 </div> 914 </div> 915 </div> 916 </div> 917 </div> 918 919 920 <div class="space-between-blocks bg-light" id="formnx-compare"> 921 <div class="container"> 922 <div class="col-lg-8 mx-auto text-center mb-4"> 923 <p class="block__paragraph--big mb-1">The no-limits alternative</p> 924 <h2 class="block__title">Jotform vs FormNX: limits compared</h2> 925 </div> 926 927 <div class="col-lg-9 mx-auto text-center mb-4"> 928 <p class="hero-subtitle">This is the core difference. Jotform meters usage - forms, fields, views, submissions, payments and signed documents are all capped, and you pay more to lift them. FormNX caps none of those. Instead you scale by workspaces and team members: the entry paid plan gives you one workspace you can invite your whole team into (up to 5 members), with everything else unlimited.</p> 929 </div> 930 931 <div class="row justify-content-center mb-4"> 932 <div class="col-lg-9 text-center"> 933 <img src="https://formnx.com/img/jotform-pricing.png" 934 alt="Jotform pricing vs FormNX pricing comparison" 935 class="img-fluid pp-compare-img" loading="lazy" 936 onerror="this.closest('.row').style.display='none'"> 937 </div> 938 </div> 939 940 <div class="row justify-content-center"> 941 <div class="col-lg-10"> 942 <div class="table-responsive"> 943 <table class="table table-bordered align-middle text-center bg-white alt-comparison-table"> 944 <thead> 945 <tr> 946 <th class="text-start" style="width:30%">Where it counts</th> 947 <th style="width:35%">
948 <span class="col-brand"><img src="https://formnx.com/img/logo.svg" alt="FormNX"><span>FormNX</span></span> 949 </th> 950 <th style="width:35%"> 951 <span class="col-brand"> 952 <span>Jotform</span> 953 </span> 954 </th> 955 </tr> 956 </thead> 957 <tbody> 958 <tr> 959 <td class="text-start fw-semibold">Active forms</td> 960 <td><strong>Unlimited</strong></td> 961 <td>Capped (5 / 25 / 50 / 100)</td> 962 </tr> 963 <tr> 964 <td class="text-start fw-semibold">Fields per form</td> 965 <td><strong>Unlimited</strong></td> 966 <td>Capped (100 / 250 / 500 / 1,000)</td> 967 </tr> 968 <tr> 969 <td class="text-start fw-semibold">Monthly submissions</td> 970 <td><strong>Unlimited</strong></td> 971 <td>Capped (100 / 1,000 / 2,500 / 10,000)</td> 972 </tr> 973 <tr> 974 <td class="text-start fw-semibold">Monthly form views</td> 975 <td><strong>Unlimited</strong></td> 976 <td>Capped (10K / 100K / 1M / 10M)</td> 977 </tr> 978 <tr> 979 <td class="text-start fw-semibold">Payment submissions</td> 980 <td><strong>Unlimited</strong> on paid plans</td> 981 <td>Capped (10 / 100 / 250 / 1,000)</td> 982 </tr> 983 <tr> 984 <td class="text-start fw-semibold">Signed documents</td> 985 <td><strong>Unlimited</strong> on paid plans</td> 986 <td>Capped (10 / 100 / 250 / 1,000)</td> 987 </tr> 988 <tr> 989 <td class="text-start fw-semibold">Storage & file size</td> 990 <td><strong>Unlimited</strong> on paid plans</td> 991 <td>Capped (100 MB / 1 GB / 10 GB / 100 GB)</td> 992 </tr> 993 <tr> 994 <td class="text-start fw-semibold">Team access</td> 995 <td><strong>5 members</strong> in your workspace, from the entry plan</td> 996 <td>Single user until Enterprise</td> 997 </tr> 998 <tr> 999 <td class="text-start fw-semibold">How you scale</td> 1000 <td>Add <strong>workspaces</strong>, not usage caps</td> 1001 <td>Upgrade tiers to lift caps</td> 1002 </tr> 1003 <tr> 1004 <td class="text-start fw-semibold">Entry paid price</td> 1005 <td><strong>$15/mo</strong> ($12 annually)</td> 1006 <td>$34/mo (Bronze, annually)</td> 1007 </tr> 1008 </tbody> 1009 </table> 1010 </div> 1011 </div> 1012 </div> 1013 1014 <div class="pp-two"> 1015 <div class="pp-two__card pp-two__card--formnx"> 1016 <h3>Where FormNX wins</h3> 1017 <ul> 1018 <li>No caps on forms, fields, submissions or views - on any plan, including free</li><li>Invite up to 5 team members into your workspace from the entry plan</li><li>Unlimited payments, signed documents, storage and file-upload size on paid plans</li><li>You scale by adding workspaces, never by paying to lift a usage limit</li> </ul> 1019 </div> 1020 <div class="pp-two__card pp-two__card--competitor"> 1021 <h3>Choose Jotform if…</h3> 1022 <ul> 1023 <li>You need HIPAA compliance today (Jotform includes it on Gold and Enterprise)</li><li>You depend on Jotform's 10,000+ template library or a specific native enterprise connector</li><li>You want their wider widget and app ecosystem (Jotform Tables, Apps, Store)</li> </ul> 1024 </div> 1025 </div> 1026 1027 <div class="text-center mt-4"> 1028 <a href="https://formnx.com/register" class="cta-button">Start free on FormNX 1029 <svg width="20" fill="none" stroke="currentColor" viewBox="0 0 24 24">
1029<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 7l5 5m0 0l-5 5m5-5H6"/></svg> 1030 </a> 1031 <div class="mt-3"><a href="https://formnx.com/jotform-alternative" class="link-secondary">See the full FormNX vs Jotform comparison →</a></div> 1032 <div class="mt-2 small text-muted"> 1033 Explore FormNX: 1034 <a href="/form-features/payment-forms">payment forms</a> · 1035 <a href="/form-features/e-signature-forms">e-signature forms</a> · 1036 <a href="/pdf-builder">PDF builder</a> · 1037 <a href="/form-features/conditional-logic">conditional logic</a> 1038 </div> 1039 </div> 1040 1041 <p class="text-muted text-center small mt-3">FormNX pricing verified at formnx.com/price, October 2026. The entry FormNX plan includes one workspace with up to 5 members; higher plans add more workspaces. Both FormNX and Jotform charge no platform surcharge on payments on paid plans - you pay only Stripe/PayPal standard processing fees.</p> 1042 </div> 1043 </div> 1044 1045 1046 <div class="space-between-blocks"> 1047 <div class="container"> 1048 <div class="col-lg-8 mx-auto"> 1049 1050 <div class="alt-final-review"> 1051 <div class="alt-final-review__stars" aria-label="5 out of 5 stars"> 1052 <svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z"/></svg><svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z"/></svg><svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z"/></svg><svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z"/></svg><svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z"/></svg> </div> 1053 1054 <p class="alt-final-review__text">"I've been looking for an alternative to Jotform - one that would accept payments directly from the form. The learning curve is short, supported by great customer service which never let me down."</p> 1055 1056 <div class="alt-final-review__footer"> 1057 <img src="https://formnx.com/img/testimonial/Evelyn.png" alt="Evelyn Townsend" class="alt-final-review__avatar" loading="lazy"> 1058 1059 <div class="alt-final-review__identity"> 1060 <strong>Evelyn Townsend</strong> 1061 <small>Canada · Switched from Jotform</small> 1062 </div> 1063 1064 <a href="https://trstp.lt/AfrOtH7sr" target="_blank" rel="noopener" class="alt-final-review__verify" title="Verified on Trustpilot"> 1065 <img src="https://formnx.com/img/trustpilot-logo.svg" alt="G2"> Verified on Trustpilot 1066 </a> 1067 </div> 1068</div> 1069 </div> 1070 </div> 1071 </div> 1072 1073 1074 <div class="faq-accordion-block space-between-blocks"> 1075 <div class="container"> 1076 <div class="col-lg-9 mx-auto text-center px-0 mb-4 mk-section-head"> 1077 <span class="block__pre-title">Everything you need to know</span> 1078 <h2 class="block__title--big mb-2">Jotform Pricing FAQs</h2> 1079 </div> 1080 1081 <div class="justify-content-center"> 1082 <div id="faq-accordion-block" class="faq-accordion-block__container"> 1083 <div class="row px-4"> 1084 <div class="col-lg-12"> 1085 <ul class="faq-accordion__list"> 1086 <li class="faq-accordion__section"> 1087 <div class="faq-accordion"> 1088 <h3 class="faq-accordion__title">How much does Jotform cost per month?</h3> 1089 <svg class="faq-accordion__icon" xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="#000000"> 1090 <path d="M24 24H0V0h24v24z" fill="none" opacity=".87"></path> 1091 <path d="M16.59 8.59L12 13.17 7.41 8.59 6 10l6 6 6-6-1.41-1.41z"></path> 1092 </svg> 1093 </div> 1094 <div class="faq-accordion__content"> 1095 <p class="faq-accordion__paragraph">Jotform has a free Starter plan ($0) and four paid tiers: Bronze is $39/mo ($34/mo billed annually), Silver $49/mo ($39 annually), Gold $129/mo ($99 annually), and Enterprise is custom-priced. The annual prices are the effective monthly cost when you pay for a full year upfront.</p> 1096 </div> 1097 </li> 1098 <li class="faq-accordion__section"> 1099 <div class="faq-accordion"> 1100 <h3 class="faq-accordion__title">Is Jotform free?</h3> 1101 <svg class="faq-accordion__icon" xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="#000000"> 1102 <path d="M24 24H0V0h24v24z" fill="none" opacity=".87"></path> 1103 <path d="M16.59 8.59L12 13.17 7.41 8.59 6 10l6 6 6-6-1.41-1.41z"></path> 1104 </svg> 1105 </div> 1106 <div class="faq-accordion__content"> 1107 <p class="faq-accordion__paragraph">Yes. Jotform's Starter plan is free forever and includes 5 forms, 100 submissions per month, 100 MB of storage and 10,000 monthly views, with Jotform branding on your forms. Payments and signed documents are capped at 10 each per month, so most businesses outgrow the free plan quickly.</p> 1108 </div> 1109 </li> 1110 <li class="faq-accordion__section"> 1111 <div class="faq-accordion"> 1112 <h3 class="faq-accordion__title">What is cheaper than Jotform?</h3> 1113 <svg class="faq-accordion__icon" xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="#000000"> 1114 <path d="M24 24H0V0h24v24z" fill="none" opacity=".87"></path> 1115 <path d="M16.59 8.59L12 13.17 7.41 8.59 6 10l6 6 6-6-1.41-1.41z"></path> 1116 </svg> 1117 </div> 1118 <div class="faq-accordion__content"> 1119 <p class="faq-accordion__paragraph">FormNX is cheaper at every comparable volume. Its entry paid plan is $15/mo ($12 billed annually) versus Jotform's $34/mo Bronze, and FormNX gives you unlimited submissions and 5 users where Jotform caps submissions and limits you to a single user until Enterprise.</p> 1120 </div> 1121 </li> 1122 <li class="faq-accordion__section"> 1123 <div class="faq-accordion"> 1124 <h3 class="faq-accordion__title">Does Jotform charge transaction or payment fees?</h3> 1125 <svg class="faq-accordion__icon" xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="#000000"> 1126 <path d="M24 24H0V0h24v24z" fill="none" opacity=".87"></path> 1127 <path d="M16.59 8.59L12 13.17 7.41 8.59 6 10l6 6 6-6-1.41-1.41z"></path> 1128 </svg> 1129 </div> 1130 <div class="faq-accordion__content"> 1131 <p class="faq-accordion__paragraph">Jotform charges no platform surcharge on payments on any plan - you pay only Stripe, PayPal or Square's standard processing fees. However, the number of payment submissions you can collect is capped per tier (10 on free, up to 1,000 on Gold; unlimited only on Enterprise).</p> 1132 </div> 1133 </li> 1134 <li class="faq-accordion__section"> 1135 <div class="faq-accordion"> 1136 <h3 class="faq-accordion__title">Does Jotform offer a nonprofit discount?</h3> 1137 <svg class="faq-accordion__icon" xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="#000000"> 1138 <path d="M24 24H0V0h24v24z" fill="none" opacity=".87"></path> 1139 <path d="M16.59 8.59L12 13.17 7.41 8.59 6 10l6 6 6-6-1.41-1.41z"></path> 1140 </svg> 1141 </div> 1142 <div class="faq-accordion__content"> 1143 <p class="faq-accordion__paragraph">Yes. Nonprofit and educational organizations get 50% off the Bronze, Silver and Gold plans, and 30% off Enterprise. You apply through Jotform with proof of your organization's status. FormNX also offers nonprofits 50% off all plans - <a href="https://formnx.com/contact">
1143contact FormNX support</a> to claim it.</p> 1144 </div> 1145 </li> 1146 <li class="faq-accordion__section"> 1147 <div class="faq-accordion"> 1148 <h3 class="faq-accordion__title">How much is Jotform Enterprise?</h3> 1149 <svg class="faq-accordion__icon" xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="#000000"> 1150 <path d="M24 24H0V0h24v24z" fill="none" opacity=".87"></path> 1151 <path d="M16.59 8.59L12 13.17 7.41 8.59 6 10l6 6 6-6-1.41-1.41z"></path> 1152 </svg> 1153 </div> 1154 <div class="faq-accordion__content"> 1155 <p class="faq-accordion__paragraph">Jotform Enterprise is custom-priced and quote-based - there is no public price. It removes all per-tier caps and adds multi-user access, SSO and dedicated support. Vendr's procurement data puts the median Jotform contract at $9,549 per year (with buyers ranging from $6,772 to $42,974), and the UK Government's G-Cloud framework lists a base package covering 5 users and 1 domain at $8,328. Your own quote depends on seats, submission volume and compliance needs.</p> 1156 </div> 1157 </li> 1158 <li class="faq-accordion__section"> 1159 <div class="faq-accordion"> 1160 <h3 class="faq-accordion__title">Does Jotform have HIPAA compliance?</h3> 1161 <svg class="faq-accordion__icon" xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="#000000"> 1162 <path d="M24 24H0V0h24v24z" fill="none" opacity=".87"></path> 1163 <path d="M16.59 8.59L12 13.17 7.41 8.59 6 10l6 6 6-6-1.41-1.41z"></path> 1164 </svg> 1165 </div> 1166 <div class="faq-accordion__content"> 1167 <p class="faq-accordion__paragraph">Yes, but only on the Gold and Enterprise plans. The free, Bronze and Silver tiers do not include HIPAA features, so healthcare workflows that handle protected health information need at least Gold ($99/mo annually).</p> 1168 </div> 1169 </li> 1170 <li class="faq-accordion__section"> 1171 <div class="faq-accordion"> 1172 <h3 class="faq-accordion__title">How much does Jotform Sign cost?</h3> 1173 <svg class="faq-accordion__icon" xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="#000000"> 1174 <path d="M24 24H0V0h24v24z" fill="none" opacity=".87"></path> 1175 <path d="M16.59 8.59L12 13.17 7.41 8.59 6 10l6 6 6-6-1.41-1.41z"></path> 1176 </svg> 1177 </div> 1178 <div class="faq-accordion__content"> 1179 <p class="faq-accordion__paragraph">Jotform Sign is not a separate subscription - e-signatures are built into every Jotform plan, including the free Starter plan. What changes by tier is how many signed documents you can collect each month: 10 on Starter (free), 100 on Bronze, 250 on Silver, 1,000 on Gold and unlimited only on Enterprise. So "Jotform Sign pricing" is really just your Jotform plan price, with the monthly signed-document cap being the limit to watch. FormNX includes unlimited signed documents on its paid plans - see the <a href="#formnx-compare">comparison below</a>.</p> 1180 </div> 1181 </li> 1182 <li class="faq-accordion__section"> 1183 <div class="faq-accordion"> 1184 <h3 class="faq-accordion__title">What are the disadvantages of Jotform?</h3> 1185 <svg class="faq-accordion__icon" xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="#000000"> 1186 <path d="M24 24H0V0h24v24z" fill="none" opacity=".87"></path> 1187 <path d="M16.59 8.59L12 13.17 7.41 8.59 6 10l6 6 6-6-1.41-1.41z"></path> 1188 </svg> 1189 </div> 1190 <div class="faq-accordion__content"> 1191 <p class="faq-accordion__paragraph">The main drawback is that Jotform meters usage: forms, fields per form, monthly submissions, monthly views, payments and signed documents are all capped per plan, so growing teams have to keep upgrading. Every plan below Enterprise is also single-user, and Enterprise pricing is quote-only. A <a href="https://formnx.com/jotform-alternative">Jotform alternative like FormNX</a> removes those usage caps and lets you invite a team on the entry plan.</p> 1192 </div> 1193 </li> 1194 <li class="faq-accordion__section"> 1195 <div class="faq-accordion"> 1196 <h3 class="faq-accordion__title">Is Google Forms or Jotform better?</h3> 1197 <svg class="faq-accordion__icon" xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="#000000"> 1198 <path d="M24 24H0V0h24v24z" fill="none" opacity=".87"></path> 1199 <path d="M16.59 8.59L12 13.17 7.41 8.59 6 10l6 6 6-6-1.41-1.41z"></path> 1200 </svg> 1201 </div> 1202 <div class="faq-accordion__content"> 1203 <p class="faq-accordion__paragraph">Google Forms is free and great for simple internal surveys, while Jotform is more powerful for payments, e-signatures and workflows but costs more and caps usage. If you want Jotform-level features without the caps, see our <a href="https://formnx.com/detail
1203s/blog/Jotform-Vs-Googleforms/">Jotform vs Google Forms comparison</a>.</p> 1204 </div> 1205 </li> 1206 <li class="faq-accordion__section"> 1207 <div class="faq-accordion"> 1208 <h3 class="faq-accordion__title">What are the limitations of the Jotform free version?</h3> 1209 <svg class="faq-accordion__icon" xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="#000000"> 1210 <path d="M24 24H0V0h24v24z" fill="none" opacity=".87"></path> 1211 <path d="M16.59 8.59L12 13.17 7.41 8.59 6 10l6 6 6-6-1.41-1.41z"></path> 1212 </svg> 1213 </div> 1214 <div class="faq-accordion__content"> 1215 <p class="faq-accordion__paragraph">The Starter (free) plan caps you at 5 active forms, 100 submissions per month, 100 fields per form, 10,000 monthly form views and 100 MB of storage, with Jotform branding on every form. Payments and signed documents are limited to 10 each per month, and a separate lifetime ceiling of 500 total stored submissions applies - once you reach it, new responses stop being stored even if you are under the monthly limit.</p> 1216 </div> 1217 </li> 1218 <li class="faq-accordion__section"> 1219 <div class="faq-accordion"> 1220 <h3 class="faq-accordion__title">Does Jotform have discounts or sales?</h3> 1221 <svg class="faq-accordion__icon" xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="#000000"> 1222 <path d="M24 24H0V0h24v24z" fill="none" opacity=".87"></path> 1223 <path d="M16.59 8.59L12 13.17 7.41 8.59 6 10l6 6 6-6-1.41-1.41z"></path> 1224 </svg> 1225 </div> 1226 <div class="faq-accordion__content"> 1227 <p class="faq-accordion__paragraph">Yes. Nonprofits and educational institutions get 50% off Bronze, Silver and Gold (30% off Enterprise), annual billing is discounted against month-to-month on every tier, and Jotform runs periodic seasonal sales. All paid plans come with a 30-day money-back guarantee.</p> 1228 </div> 1229 </li> 1230 </ul> 1231 </div> 1232 </div> 1233 </div> 1234 </div> 1235 </div> 1236</div> 1237 1238 1239 <div class="cta-section"> 1240 <div class="container"> 1241 <div class="cta-content"> 1242 <div class="row"> 1243 <div class="col-12 text-center"> 1244 <h2 class="cta-title">Get unlimited submissions - without the caps</h2> 1245 <p class="cta-subtitle">Start free with unlimited forms and submissions. Upgrade only to unlock features, never to lift a volume cap.</p> 1246 <a href="https://formnx.com/register" class="cta-button">Get Started Free 1247 <svg width="20" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 7l5 5m0 0l-5 5m5-5H6"/></svg> 1248 </a> 1249 <a href="javascript:void(0)" 1250 class="cta-button cta-button--secondary" 1251 data-cal-link="nikhil-agrawal/formnx-support" 1252 data-cal-namespace="formnx-support" 1253 data-cal-config='{"layout":"month_view","useSlotsViewOnSmallScreen":"true"}'>Book a Demo</a> 1254 <div class="mt-4"><small style="color: rgba(255,255,255,0.7);">No Credit Card Required • Unlimited Forms & Submissions</small></div> 1255 </div> 1256 </div> 1257 </div> 1258 </div> 1259 </div> 1260 1261</div> 1262
1263 <div class="block-41 py-5 border-top"> 1264 <div class="container"> 1265 <div class="row gx-3"> 1266 1267 <div class="col-sm-6 col-lg-2 mb-4 mb-lg-0"> 1268 <img class="block-41__logo mb-3" src="https://formnx.com/img/logo.svg" alt="FormNX" style="height: 48px;"> 1269 1270 <ul class="block-41__links-list list-unstyled p-0 mb-0"> 1271 <li class="block-41__li"> 1272 <a href="https://www.g2.com/products/formnx/reviews" target="_blank" rel="noopener" class="block-41__li-link d-inline-flex align-items-center"> 1273 <img src="https://formnx.com/img/g2-logo.svg" alt="G2" style="height: 18px; margin-right: 6px;"> 1274 Reviews on G2 1275 </a> 1276 </li> 1277 <li class="block-41__li"> 1278 <a href="https://www.trustpilot.com/review/formnx.com" target="_blank" rel="noopener" class="block-41__li-link d-inline-flex align-items-center"> 1279 <img src="https://formnx.com/img/trustpilot-logo.svg" alt="Trustpilot" style="height: 18px; margin-right: 6px;"> 1280 Reviews on Trustpilot 1281 </a> 1282 </li> 1283 <li class="block-41__li"> 1284 <a href="https://status.formnx.com/" target="_blank" rel="noopener" class="block-41__li-link d-inline-flex align-items-center"> 1285 <span class="d-inline-block rounded-circle bg-success" style="height: 9px; width: 9px; margin-right: 8px;"></span> 1286 System Status 1287 </a> 1288 </li> 1289 </ul> 1290 1291 </div> 1292 1293 1294 <div class="col-6 col-md-4 col-lg mb-4 mb-lg-0"> 1295 <ul class="block-41__links-list list-unstyled p-0"> 1296 <li class="block-41__li-heading">Templates</li> 1297 <li class="block-41__li"><a href="https://formnx.com/form-templates/category/registration-forms-7" class="block-41__li-link">Registration Form Templates</a></li> 1298 <li class="block-41__li"><a href="https://formnx.com/form-templates/category/feedback-forms-12" class="block-41__li-link">Feedback Form Templates</a></li> 1299 <li class="block-41__li"><a href="https://formnx.com/form-templates/category/survey-forms-51" class="block-41__li-link">Survey Form Templates</a></li> 1300 <li class="block-41__li"><a href="https://formnx.com/form-templates/category/evaluation-form-58" class="block-41__li-link">Evaluation Form Templates</a></li> 1301 </ul> 1302 </div> 1303 <div class="col-6 col-md-4 col-lg mb-4 mb-lg-0"> 1304 <ul class="block-41__links-list list-unstyled p-0"> 1305 <li class="block-41__li-heading">Alternatives</li> 1306 <li class="block-41__li"><a href="https://formnx.com/jotform-alternative" class="block-41__li-link">Jotform Alternative</a></li> 1307 <li class="block-41__li"><a href="https://formnx.com/typeform-alternative" class="block-41__li-link">Typeform Alternative</a></li> 1308 <li class="block-41__li"><a href="https://formnx.com/google-forms-alternative" class="block-41__li-link">Google Forms Alternative</a></li> 1309 <li class="block-41__li"><a href="https://formnx.com/surveymonkey-alternative" class="block-41__li-link">SurveyMonkey Alternative</a></li> 1310 <li class="block-41__li"><a href="https://formnx.com/contact-form-7-alternative" class="block-41__li-link">Contact Form 7 Alternative</a></li> 1311 <li class="block-41__li"><a href="https://formnx.com/paperform-alternative" class="block-41__li-link">Paperform Alternative</a></li> 1312 <li class="block-41__li"><a href="https://formnx.com/microsoft-forms-alternative" class="block-41__li-link">Microsoft Forms Alternative</a></li> 1313 <li class="block-41__li"><a href="https://formnx.com/fillout-alternative" class="block-41__li-link">Fillout Alternative</a></li> 1314 <li class="block-41__li"><a href="https://formnx.com/tally-alternative" class="block-41__li-link">Tally Forms Alternative</a></li> 1315 <li class="block-41__li"><a href="https://formnx.com/gravity-forms-alternative" class="block-4
13151__li-link">Gravity Forms Alternative</a></li> 1316 <li class="block-41__li"><a href="https://formnx.com/cognito-forms-alternative" class="block-41__li-link">Cognito Forms Alternative</a></li> 1317 <li class="block-41__li"><a href="https://formnx.com/formstack-alternative" class="block-41__li-link">Formstack Alternative</a></li> 1318 <li class="block-41__li"><a href="https://formnx.com/alternatives" class="block-41__li-link">All Alternatives</a></li> 1319 <li class="block-41__li-heading">Pricing Guides</li> 1320 <li class="block-41__li"><a href="https://formnx.com/jotform-pricing" class="block-41__li-link">Jotform Pricing</a></li> 1321 <li class="block-41__li"><a href="https://formnx.com/typeform-pricing" class="block-41__li-link">Typeform Pricing</a></li> 1322 <li class="block-41__li"><a href="https://formnx.com/surveymonkey-pricing" class="block-41__li-link">SurveyMonkey Pricing</a></li> 1323 </ul> 1324 </div> 1325 <div class="col-6 col-md-4 col-lg mb-4 mb-lg-0"> 1326 <ul class="block-41__links-list list-unstyled p-0"> 1327 <li class="block-41__li-heading">Use Cases</li> 1328 <li class="block-41__li"><a href="https://formnx.com/no-code-form-builder" class="block-41__li-link">No-Code Form Builder</a></li> 1329 <li class="block-41__li"><a href="https://formnx.com/online-survey-builder" class="block-41__li-link">Online Survey Builder</a></li> 1330 <li class="block-41__li"><a href="https://formnx.com/ai-form-builder" class="block-41__li-link">AI Form Builder</a></li> 1331 <li class="block-41__li"><a href="https://formnx.com/online-quiz-maker" class="block-41__li-link">Online Quiz Maker</a></li> 1332 <li class="block-41__li"><a href="https://formnx.com/job-application-form-builder" class="block-41__li-link">Job Application Form Builder</a></li> 1333 <li class="block-41__li"><a href="https://formnx.com/order-form-builder" class="block-41__li-link">Order Form Builder</a></li> 1334 <li class="block-41__li"><a href="https://formnx.com/screen-printing-order-form" class="block-41__li-link">Screen Printing Order Form</a></li> 1335 <li class="block-41__li"><a href="https://formnx.com/wholesale-order-form" class="block-41__li-link">Wholesale Order Form</a></li> 1336 <li class="block-41__li"><a href="https://formnx.com/wordpress-form-builder" class="block-41__li-link">WordPress Form Builder</a></li> 1337 <li class="block-41__li"><a href="https://formnx.com/contact-form" class="block-41__li-link">Contact Form</a></li> 1338 <li class="block-41__li"><a href="https://formnx.com/nonprofit-form-builder" class="block-41__li-link">Nonprofit Form Builder</a></li> 1339 <li class="block-41__li"><a href="https://formnx.com/squarespace-form-builder" class="block-41__li-link">Squarespace Form Builder</a></li> 1340 <li class="block-41__li"><a href="https://formnx.com/wix-form-builder" class="block-41__li-link">Wix Form Builder</a></li> 1341 <li class="block-41__li"><a href="https://formnx.com/webflow-form-builder" class="block-41__li-link">Webflow Form Builder</a></li> 1342 <li class="block-41__li"><a href="https://formnx.com/framer-form-builder" class="block-41__li-link">Framer Form Builder</a></li> 1343 </ul> 1344 </div> 1345 <div class="col-6 col-md-4 col-lg mb-4 mb-lg-0"> 1346 <ul class="block-41__links-list list-unstyled p-0"> 1347 <li class="block-41__li-heading">Resources</li> 1348 <li class="block-41__li"><a href="https://formnx.com/form-features" class="block-41__li-link">Form Features</a></li> 1349 <li class="block-41__li"><a href="https://formnx.com/integrations" class="block-41__li-link">Integrations</a></li> 1350 <li class="block-41__li"><a href="https://formnx.com/pdf-builder-features" class="block-41__li-link">PDF Features</a></li> 1351 <li class="block-41__li"><a href="https://formnx.com/details/docs/category/features" class="block-41__li-link">Document</a></li>
1352 <li class="block-41__li"><a href="https://formnx.rightfeature.com/b/feature-requests" class="block-41__li-link">Feature Request</a></li> 1353 <li class="block-41__li"><a href="https://formnx.rightfeature.com/changelogs" class="block-41__li-link">Change Log</a></li> 1354 <li class="block-41__li"><a href="https://formnx.com/faq" class="block-41__li-link">FAQ</a></li> 1355 <li class="block-41__li"><a href="https://formnx.com/tools" class="block-41__li-link">Tools</a></li> 1356 <li class="block-41__li"><a target="_blank" href="https://formnx.com/details/blog" class="block-41__li-link">Blogs</a></li> 1357 <!-- <li class="block-41__li"><a href="https://formnx.com/affiliate" class="block-41__li-link">Affiliate</a></li> --> 1358 </ul> 1359 </div> 1360 <div class="col-6 col-md-4 col-lg mb-4 mb-lg-0"> 1361 <ul class="block-41__links-list list-unstyled p-0"> 1362 <li class="block-41__li-heading">Links</li> 1363 <li class="block-41__li"><a href="javascript:void(0)" 1364 class="block-41__li-link" 1365 data-cal-link="nikhil-agrawal/formnx-support" 1366 data-cal-namespace="formnx-support" 1367 data-cal-config='{"layout":"month_view","useSlotsViewOnSmallScreen":"true"}'>Book a Demo</a> 1368</li> 1369 <li class="block-41__li"><a href="https://formnx.com/form-builder-for-agencies" class="block-41__li-link">FormNX for Agencies</a></li> 1370 <li class="block-41__li"><a href="https://formnx.com/about" class="block-41__li-link">About Us</a></li> 1371 <li class="block-41__li"><a href="https://formnx.com/privacy" class="block-41__li-link">Privacy Policy</a></li> 1372 <li class="block-41__li"><a href="https://formnx.com/terms" class="block-41__li-link">Terms & Conditions</a></li> 1373 <li class="block-41__li"><a href="https://formnx.com/details/docs/resources/gdpr" class="block-41__li-link">GDPR</a></li> 1374 <li class="block-41__li"><a href="https://formnx.com/dpa" class="block-41__li-link">DPA</a></li> 1375 1376 <li class="block-41__li-heading">Other Products</li> 1377 <li class="block-41__li"><a href="https://rightfeature.com/?utm_source=formnx&utm_medium=referral&utm_campaign=footer-other-products" class="block-41__li-link" target="_blank">RightFeature, Customer feedback management platform</a></li> 1378 <li class="block-41__li"><a href="https://shortlisted.tools/?utm_source=formnx&utm_medium=referral&utm_campaign=footer-other-products" class="block-41__li-link" target="_blank">Short Listed Tools</a></li> 1379 </ul> 1380 </div> 1381 1382 </div> 1383 </div> 1384 <hr class="block-41__divider"> 1385 <div class="container"> 1386 <div class="row align-items-center g-3"> 1387 <div class="col-md-6 order-2 order-md-1"> 1388 <p class="block-41__copyrights mb-0 text-center text-md-start">© 2023 - 2026 FormNX, By The Web Fosters.</p> 1389 </div> 1390 <div class="col-md-6 order-1 order-md-2"> 1391 <ul class="block-41__extra-links d-flex list-unstyled p-0 mb-0 justify-content-center justify-content-md-end"> 1392 <li class="mx-2"><a href="https://x.com/FormNX" target="_blank" class="block-41__extra-link m-0"><i class="fab fa-twitter"></i></a></li> 1393 <li class="mx-2"><a href="https://www.linkedin.com/company/formnx" target="_blank" class="block-41__extra-link m-0"><i class="fab fa-linkedin-in"></i></a></li> 1394 <li class="mx-2"><a href="https://www.reddit.com/r/FormNX/" target="_blank" class="block-41__extra-link m-0"><i class="fa-brands fa-reddit"></i></a></li> 1395 <li class="mx-2"><a href="https://discord.gg/G6xEquMCFG" target="_blank" class="block-41__extra-link m-0"><i class="fab fa-discord"></i></a></li> 1396 </ul> 1397 </div> 1398 </div> 1399 </div> 1400 1401 <div class="mk-footer-wordmark" aria-hidden="true">FormNX</div> 1402 </div> 1403 1404 <div class="modal" id="edit_template_info" tabindex="-1" role="dialog"></div> 1405 </main> 1406 1407
1408 <!-- scroll-to-top --> 1409 <div id="back-to-top" style="display: none;"> 1410 <a class="p-0 position-fixed top" id="scroll-to-top-btn" href="#top"> 1411 <svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-circle-arrow-up" width="35" viewBox="0 0 24 24" stroke-width="1.5" stroke="#6c757d" fill="none" stroke-linecap="round" stroke-linejoin="round"> 1412 <path stroke="none" d="M0 0h24v24H0z" fill="none"></path> 1413 <path d="M3 12a9 9 0 1 0 18 0a9 9 0 0 0 -18 0"></path> 1414 <path d="M12 8l-4 4"></path> 1415 <path d="M12 8v8"></path> 1416 <path d="M16 12l-4 -4"></path> 1417 </svg> 1418 </a> 1419 </div> 1420 <!-- /scroll-to-top -->
1421<script>(function(){function c(){var b=a.contentDocument||(a.contentWindow&&a.contentWindow.document);if(b){var d=b.createElement('script');d.innerHTML="window.__CF$cv$params={r:'a440f9e0a98d95c1',t:'MTc5MDkxNTQ3MQ=='};var a=document.createElement('script');a.src='/cdn-cgi/challenge-platform/scripts/jsd/main.js';document.getElementsByTagName('head')[0].appendChild(a);";b.getElementsByTagName('head')[0].appendChild(d)}}if(document.body){var a=document.createElement('iframe');a.height=1;a.width=1;a.style.position='absolute';a.style.top=0;a.style.left=0;a.style.border='none';a.style.visibility='hidden';document.body.appendChild(a);if('loading'!==document.readyState)c();else if(window.addEventListener)document.addEventListener('DOMContentLoaded',c);else{var e=document.onreadystatechange||function(){};document.onreadystatechange=function(b){e(b);'loading'!==document.readyState&&(document.onreadystatechange=e,c())}}}})();</script>
1421<script type="module" src="https://static.cloudflareinsights.com/beacon.min.js/v31edd6df95cf4e85bb4c19e7a9bdbcba1788362987495" integrity="sha512-iIg7k2xntmwu6/uSb5tpc/hySgZc4eoL31yB29W6tJFo2akwjPWcEqnCEdJvGexCL0KEQwVYv5BlowfhVz26hg==" data-cf-beacon='{"version":"2024.11.0","token":"c097d181ceae43a6b55a96ac59cdbf8e","r":1,"spa":2}' crossorigin="anonymous"></script>
1421 1422</body> 1423 <!-- reCaptcha v2 (loaded only when enabled on the form) --> 1424 1425 1426 <!-- Google tag (gtag.js) -->
vendor: 68 bytes, lines 1426-1427
1426 1427 <script async src="https://www.googletagmanager.com/gtag/js?id=
1427G-MYXYE87VGP
vendor: 40 bytes, lines 1427-1428
1427" crossorigin="anonymous"></script> 1428
1428<script> 1429
vendor: 140 bytes, lines 1429-1433
1429window.dataLayer = window.dataLayer || []; 1430 function gtag(){dataLayer.push(arguments);} 1431 gtag('js', new Date()); 1432 1433 gtag('config', '
1433G-MYXYE87VGP
vendor: 8 bytes, lines 1433-1434
1433'); 1434
1434</script>
1434 1435 1436 1437
1437<script type="text/javascript"> 1438 (function(c,l,a,r,i,t,y){ 1439 c[a]=c[a]||function(){(c[a].q=c[a].q||[]).push(arguments)}; 1440 t=l.createElement(r);t.async=1;t.src="https://www.clarity.ms/tag/"+i; 1441 y=l.getElementsByTagName(r)[0];y.parentNode.insertBefore(t,y); 1442 })(window, document, "clarity", "script", "ouvb60hd4u"); 1443 1444 </script>
1444 1445 1446 1447 <!--Start of Crisp Chat Script--> 1448
1448<script type="text/javascript"> 1449 window.$crisp=[];window.CRISP_WEBSITE_ID="ee32b13b-4349-4b99-b798-4d431007623f"; 1450 1451 1452 (function(){d=document;s=d.createElement("script");s.src="https://client.crisp.chat/l.js";s.async=1;d.getElementsByTagName("head")[0].appendChild(s);})(); 1453 </script>
1453 1454 <!--End of Crisp Chat Script--> 1455 1456 <!-- Meta Pixel Code --> 1457
1457<script>
vendor: 435 bytes, lines 1457-1466
1457 1458 !function(f,b,e,v,n,t,s) 1459 {if(f.fbq)return;n=f.fbq=function(){n.callMethod? 1460 n.callMethod.apply(n,arguments):n.queue.push(arguments)}; 1461 if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0'; 1462 n.queue=[];t=b.createElement(e);t.async=!0; 1463 t.src=v;s=b.getElementsByTagName(e)[0]; 1464 s.parentNode.insertBefore(t,s)}(window, document,'script', 1465 'https://connect.facebook.net/en_US/fbevents.js'); 1466 fbq('init', '
14661390151105219055
vendor: 38 bytes, lines 1466-1468
1466'); 1467 fbq('track', 'PageView'); 1468
1468</script>
1468 1469 <noscript><img height="1" width="1" style="display:none" 1470 src="https://www.facebook.com/tr?id=1390151105219055&ev=PageView&noscript=1" 1471 /></noscript> 1472 <!-- End Meta Pixel Code --> 1473 1474 1475
1476<script type="text/javascript"> 1477 window.fnxTrack = function (event, tags) { 1478 tags = tags || {}; 1479 var sent = false; 1480 if (typeof window.clarity === 'function') { 1481 Object.keys(tags).forEach(function (key) { window.clarity('set', key, String(tags[key])); }); 1482 window.clarity('event', event); 1483 sent = true; 1484 } 1485 if (typeof window.gtag === 'function') { 1486 window.gtag('event', event, tags); 1487 sent = true; 1488 } 1489 if (!sent && window.console) { console.debug('[fnxTrack]', event, tags); } 1490 }; 1491 </script>
1491 1492 1493 1494 1495 1496 <!-- NOTE:bundled js files to optimize size --> 1497
1497<script src="https://formnx.com/js/common.js?id=1044ddeb6c11792bf9f8"></script>
1497 1498 1499 <!-- app js values --> 1500
1500<script type="application/javascript"> 1501 var APP = {}; 1502 APP.APP_NAME = "FormNX"; 1503 APP.APP_URL = "https://formnx.com"; 1504 APP.PUBLIC_URL= "https://formnx.com/"; 1505 APP.FORM_URL = "https://fill.formnx.com"; 1506 APP.CURRENCY_SYMBOL = ""; 1507 APP.PDF_PLACEHOLDER = "https://formnx.com/img/pdf_placeholder.png"; 1508 APP.MAX_PDF_UPLOAD_SIZE = "20"; 1509 APP.IS_ENABLED_CUSTOM_JS_CSS = "0"; 1510 APP.IS_ENABLED_COMPANY_BRANDING = "1"; 1511 APP.STATIC_URL = ""; 1512 APP.G_RECAPTCHA_SITE_KEY = "6LfHODUqAAAAAPejHHBBfEpZDNAGA7Xf9YKIH_00"; 1513 APP.OPTION_IMG_PLACEHOLDER = "https://formnx.com/img/option_img_placeholder.png"; 1514 APP.FORM_LOCALES = {"ar":{"name":"Arabic","rtl":true,"tinyMCELangKey":"ar","fpLangKey":"ar","stripeConnect":"en"},"bg":{"name":"Bulgarian","rtl":false,"tinyMCELangKey":"bg-BG","fpLangKey":"bg","stripeConnect":"bg"},"ca":{"name":"Catalan","rtl":false,"tinyMCELangKey":"ca","fpLangKey":"ca","stripeConnect":"en"},"zh-CN":{"name":"Chinese (Simplified)","rtl":false,"tinyMCELangKey":"zh-Hans","fpLangKey":"zhCN","stripeConnect":"zh"},"zh-TW":{"name":"Chinese (Traditional)","rtl":false,"tinyMCELangKey":"zh-Hant","fpLangKey":"zhTw","stripeConnect":"en"},"hr":{"name":"Croatian","rtl":false,"tinyMCELangKey":"hr","fpLangKey":"hr","stripeConnect":"hr"},"cs":{"name":"Czech","rtl":false,"tinyMCELangKey":"cs","fpLangKey":"cs","stripeConnect":"cs"},"da":{"name":"Danish","rtl":false,"tinyMCELangKey":"da","fpLangKey":"da","stripeConnect":"da"},"nl":{"name":"Dutch","rtl":false,"tinyMCELangKey":"nl","fpLangKey":"nl","stripeConnect":"nl"},"en":{"name":"English","rtl":false,"tinyMCELangKey":"en","fpLangKey":"","stripeConnect":"en"},"eu":{"name":"Euskara","rtl":false,"tinyMCELangKey":"en","fpLangKey":"","stripeConnect":"en"},"fa":{"name":"Farsi","rtl":true,"tinyMCELangKey":"en","fpLangKey":"fa","stripeConnect":"en"},"fil":{"name":"Filipino","rtl":false,"tinyMCELangKey":"en","fpLangKey":"","stripeConnect":"fil"},"fi":{"name":"Finnish","rtl":false,"tinyMCELangKey":"fi","fpLangKey":"fi","stripeConnect":"fi"},"fr":{"name":"French","rtl":false,"tinyMCELangKey":"fr_FR","fpLangKey":"fr","stripeConnect":"fr"},"ka":{"name":"Georgian","rtl":false,"tinyMCELangKey":"ka_GE","fpLangKey":"ka","stripeConnect":"en"},"de":{"name":"German","rtl":false,"tinyMCELangKey":"de","fpLangKey":"de","stripeConnect":"de"},"el":{"name":"Greek","rtl":false,"tinyMCELangKey":"el","fpLangKey":"el","stripeConnect":"el"},"he":{"name":"Hebrew","rtl":true,"tinyMCELangKey":"he_IL","fpLangKey":"he","stripeConnect":"en"},"hu":{"name":"Hungarian","rtl":false,"tinyMCELangKey":"hu_HU","fpLangKey":"hu","stripeConnect":"hu"},"id":{"name":"Indonesian","rtl":false,"tinyMCELangKey":"id","fpLangKey":"id","stripeConnect":"id"},"it":{"name":"Italian","rtl":false,"tinyMCELangKey":"it","fpLangKey":"it","stripeConnect":"it"},"ja":{"name":"Japanese","rtl":false,"tinyMCELangKey":"ja","fpLangKey":"ja","stripeConnect":"ja"},"ko":{"name":"Korean","rtl":false,"tinyMCELangKey":"ko_KR","fpLangKey":"ko","stripeConnect":"ko"},"lv":{"name":"Latvian","rtl":false,"tinyMCELangKey":"lv","fpLangKey":"lv","stripeConnect":"lv"},"no":{"name":"Norwegian","rtl":false,"tinyMCELangKey":"nb_NO","fpLangKey":"no","stripeConnect":"en"},"pl":{"name":"Polish","rtl":false,"tinyMCELangKey":"pl","fpLangKey":"pl","stripeConnect":"pl"},"pt":{"name":"Portuguese","rtl":false,"tinyMCELangKey":"pt_BR","fpLangKey":"pt","stripeConnect":"pt"},"pt-BR":{"name":"Portuguese (Brazil)","rtl":false,"tinyMCELangKey":"pt_BR","fpLangKey":"pt","stripeConnect":"en"},"ro":{"name":"Romanian","rtl":false,"tinyMCELangKey":"ro","fpLangKey":"ro","stripeConnect":"ro"},"ru":{"name":"Russian","rtl":false,"tinyMCELangKey":"ru","fpLangKey":"ru","stripeConnect":"ru"},"sr":{"name":"Serbian","rtl":false,"tinyMCELangKey":"sr","fpLangKey":"sr","stripeConnect":"en"},"sk":{"name":"Slovak","rtl":false,"tinyMCELangKey":"sk","fpLangKey":"sk","stripeConnect":"sk"},"sl":{"name":"Slovenian","rtl":false,"tinyMCELangKey":"sl_SI","fpLangKey":"sl","stripeConnect":"sl"},"es":{"name":"Spanish","rtl":false,"tinyMCELangKey":"es","fpLangKey":"es","stripeConnect":"es"},"es-MX":{"name":"Spanish (Mexico)","rtl":false,"tinyMCELangKey":"es_MX","fpLangKey":"","stripeConnect":"en"},"sv":{"name":"Swedish","rtl":false,"tinyMCELangKey":"sv_SE","fpLangKey":"sv","stripeConnect":"sv"},"th":{"name":"Thai","rtl":false,"tinyMCELangKey":"th_TH","fpLangKey":"th","stripeConnect":"th"},"tr":{"name":"Turkish","rtl":false,"tinyMCELangKey":"tr","fpLangKey":"tr","stripeConnect":"tr"},"uk":{"name":"Ukrainian","rtl":false,"tinyMCELangKey":"uk","fpLangKey":"uk","stripeConnect":"en"},"vi":{"name":"Vietnamese","rtl":false,"tinyMCELangKey":"vi","fpLangKey":"vi","stripeConnect":"vi"},"yo":{"name":"Yoruba","rtl":false,"tinyMCELangKey":"en","fpLangKey":"","stripeConnect":"en"}}; 1515 APP.FORM_LOCALE = "en"; 1516 APP.CURRENT_WORKSPACE_NAME = ""; 1517 APP.CURRENT_WORKSPACE_ID = ""; 1518 APP.FONT_FAMILIES = {"Poppins":"https:\/\/fonts.googleapis.com\/css2?family=Poppins:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,100;1,200;1,300;1,400;1,500;1,600;1,700;1,800;1,900&display=swap","Roboto":"https:\/\/fonts.googleapis.com\/css2?family=Roboto:ital,wght@0,100;0,300;0,400;0,500;0,700;0,900;1,100;1,300;1,400;1,500;1,700;1,900&display=swap","Lato":"https:\/\/fonts.googleapis.com\/css2?family=Lato:ital,wght@0,100;0,300;0,400;0,700;0,900;1,100;1,300;1,400;1,700;1,900&display=swap","Open Sans":"https:\/\/fonts.googleapis.com\/css2?family=Open+Sans:ital,wght@0,300;0,400;0,500;0,600;0,700;0,800;1,300;1,400;1,500;1,600;1,700;1,800&display=swap","Oswald":"https:\/\/fonts.googleapis.com\/css2?family=Oswald:wght@200;300;400;500;600;700&display=swap","Raleway":"https:\/\/fonts.googleapis.com\/css2?family=Raleway:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,100;1,200;1,300;1,400;1,500;1,600;1,700;1,800;1,900&display=swap","Nunito":"https:\/\/fonts.googleapis.com\/css2?family=Nunito:ital,wght@0,200;0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,200;1,300;1,400;1,500;1,600;1,700;1,800;1,900&display=swap","Dancing Script":"https:\/\/fonts.googleapis.com\/css2?family=Dancing+Script:wght@400;500;600;700&display=swap","Amiri":"https:\/\/fonts.googleapis.com\/css2?family=Amiri:ital,wght@0,400;0,700;1,400;1,700&display=swap","Saira Condensed":"https:\/\/fonts.googleapis.com\/css2?family=Saira+Condensed:wght@100;200;300;400;500;600;700;800;900&display=swap","Edu VIC WA NT Beginner":"https:\/\/fonts.googleapis.com\/css2?family=Edu+VIC+WA+NT+Beginner:wght@400;500;600;700&display=swap","Elsie Swash Caps":"https:\/\/fonts.googleapis.com\/css2?family=Elsie+Swash+Caps:wght@400;900&display=swap","Edu SA Beginner":"https:\/\/fonts.googleapis.com\/css2?family=Edu+SA+Beginner:wght@400;500;600;700&display=swap","Eater":"https:\/\/fonts.googleapis.com\/css2?family=Eater&display=swap","Aclonica":"https:\/\/fonts.googleapis.com\/css2?family=Aclonica&display=swap","Anonymous Pro":"https:\/\/fonts.googleapis.com\/css2?family=Anonymous+Pro:ital,wght@0,400;0,700;1,400;1,700&display=swap","Montserrat":"https:\/\/fonts.googleapis.com\/css2?family=Montserrat:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;0,800;1,100;1,200;1,300;1,400;1,500;1,600;1,700;1,800;1,900&display=swap","Tangerine":"https:\/\/fonts.googleapis.com\/css2?family=Tangerine:wght@400;700&display=swap","Arimo":"https:\/\/fonts.googleapis.com\/css2?family=Arimo:ital,wght@0,400;0,500;0,600;0,700;1,400;1,500;1,600;1,700&display=swap","Arvo":"https:\/\/fonts.googleapis.com\/css2?family=Arvo:ital,wght@0,400;0,700;1,400;1,700&display=swap","Bentham":"https:\/\/fonts.googleapis.com\/css2?family=Bentham&display=swap","Nixie One":"https:\/\/fonts.googleapis.com\/css2?family=Nixie+One&display=swap","Ubuntu":"https:\/\/fonts.googleapis.com\/css2?family=Ubuntu:ital,wght@0,300;0,400;0,500;0,700;1,300;1,400;1,500;1,700&display=swap","Barlow":"https:\/\/fonts.googleapis.com\/css2?family=Barlow:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,100;1,200;1,300;1,400;1,500;1,600;1,700;1,800;1,900&display=swap","Playfair Display":"https:\/\/fonts.googleapis.com\/css2?family=Playfair+Display:ital,wght@0,400;0,500;0,600;0,700;0,800;0,900;1,400;1,500;1,600;1,700;1,800;1,900&display=swap","Ms Madi":"https:\/\/fonts.googleapis.com\/css2?family=Ms+Madi&display=swap","Source Code Pro":"https:\/\/fonts.googleapis.com\/css2?family=Source+Code+Pro:ital,wght@0,200..900;1,200..900&display=swap","Bitter":"https:\/\/fonts.googleapis.com\/css2?family=Bitter:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,100;1,200;1,300;1,400;1,500;1,600;1,700;1,800;1,900&display=swap","Inter":"https:\/\/fonts.googleapis.com\/css2?family=Inter:wght@100;200;300;400;500;600;700;800;900&display=swap","Nova Script":"https:\/\/fonts.googleapis.com\/css2?family=Nova+Script&display=swap","Orbitron":"https:\/\/fonts.googleapis.com\/css2?family=Orbitron:wght@400;500;600;700;800;900&display=swap","Yellowtail":"https:\/\/fonts.googleapis.com\/css2?family=Yellowtail&display=swap","Cookie":"https:\/\/fonts.googleapis.com\/css2?family=Cookie&display=swap","Patrick Hand":"https:\/\/fonts.googleapis.com\/css2?family=Patrick+Hand&display=swap","Old Standard TT":"https:\/\/fonts.googleapis.com\/css2?family=Old+Standard+TT:ital,wght@0,400;0,700;1,400&display=swap","Almendra Display":"https:\/\/fonts.googleapis.com\/css2?family=Almendra+Display&display=swap","Lateef":"https:\/\/fonts.googleapis.com\/css2?family=Lateef&display=swap","Delius":"https:\/\/fonts.googleapis.com\/css2?family=Delius&display=swap","Chakra Petch":"https:\/\/fonts.googleapis.com\/css2?family=Chakra+Petch:ital,wght@0,300;0,400;0,500;0,600;0,700;1,300;1,400;1,500;1,600;1,700&display=swap","Cairo":"https:\/\/fonts.googleapis.com\/css2?family=Cairo:[email protected]&display=swap","Merriweather":"https:\/\/fonts.googleapis.com\/css2?family=Merriweather:ital,wght@0,300;0,400;0,700;0,900;1,300;1,400;1,700;1,900&display=swap","Rubik":"https:\/\/fonts.googleapis.com\/css2?family=Rubik:ital,wght@0,300..900;1,300..900&display=swap","Titillium Web":"https:\/\/fonts.googleapis.com\/css2?family=Titillium+Web:ital,wght@0,200;0,300;0,400;0,600;0,700;0,900;1,200;1,300;1,400;1,600;1,700&display=swap","Work Sans":"https:\/\/fonts.googleapis.com\/css2?family=Work+Sans:ital,wght@0,100..900;1,100..900&display=swap","Mukta":"https:\/\/fonts.googleapis.com\/css2?family=Mukta:wght@200;300;400;500;600;700;800&display=swap","Noto Serif":"https:\/\/fonts.googleapis.com\/css2?family=Noto+Serif:ital,wght@0,100..900;1,100..900&display=swap","Quicksand":"https:\/\/fonts.googleapis.com\/css2?family=Quicksand:[email protected]&display=swap","Inconsolata":"https:\/\/fonts.googleapis.com\/css2?family=Inconsolata:[email protected]&display=swap","Oxygen":"https:\/\/fonts.googleapis.com\/css2?family=Oxygen:wght@300;400;700&display=swap","Karla":"https:\/\/fonts.googleapis.com\/css2?family=Karla:ital,wght@0,200..800;1,200..800&display=swap","Cabin":"https:\/\/fonts.googleapis.com\/css2?family=Cabin:ital,wght@0,400..700;1,400..700&display=swap","Heebo":"https:\/\/fonts.googleapis.com\/css2?family=Heebo:[email protected]&display=swap","Kanit":"https:\/\/fonts.googleapis.com\/css2?family=Kanit:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,100;1,200;1,300;1,400;1,500;1,600;1,700;1,800;1,900&display=swap","Lobster":"https:\/\/fonts.googleapis.com\/css2?family=Lobster&display=swap","Anton":"https:\/\/fonts.googleapis.com\/css2?family=Anton&display=swap","Hind Siliguri":"https:\/\/fonts.googleapis.com\/css2?family=Hind+Siliguri:wght@300;400;500;600;700&display=swap","Source Sans Pro":"https:\/\/fonts.googleapis.com\/css2?family=Source+Sans+Pro:wght@200;300;400;600;700;900&display=swap","Roboto Condensed":"https:\/\/fonts.googleapis.com\/css2?family=Roboto+Condensed:wght@300;400;700&display=swap","Noto Sans":"https:\/\/fonts.googleapis.com\/css2?family=Noto+Sans:wght@100;300;400;500;700;900&display=swap","PT Sans":"https:\/\/fonts.googleapis.com\/css2?family=PT+Sans:wght@400;700&display=swap","PT Serif":"https:\/\/fonts.googleapis.com\/css2?family=PT+Serif:wght@400;700&display=swap","Lora":"https:\/\/fonts.googleapis.com\/css2?family=Lora:wght@400;500;600;700&display=swap","Fira Sans":"https:\/\/fonts.googleapis.com\/css2?family=Fira+Sans:wght@100;200;300;400;500;600;700;800;900&display=swap","Muli":"https:\/\/fonts.googleapis.com\/css2?family=Muli:wght@200;300;400;600;700;800;900&display=swap","Hind":"https:\/\/fonts.googleapis.com\/css2?family=Hind:wght@300;400;500;600;700&display=swap","Dosis":"https:\/\/fonts.googleapis.com\/css2?family=Dosis:wght@200;300;400;500;600;700;800&display=swap","Nunito Sans":"https:\/\/fonts.googleapis.com\/css2?family=Nunito+Sans:wght@200;300;400;600;700;800;900&display=swap","Libre Baskerville":"https:\/\/fonts.googleapis.com\/css2?family=Libre+Baskerville:wght@400;700&display=swap","Zilla Slab":"https:\/\/fonts.googleapis.com\/css2?family=Zilla+Slab:wght@300;400;500;600;700;900&display=swap","Prompt":"https:\/\/fonts.googleapis.com\/css2?family=Prompt:wght@100;200;300;400;500;600;700;800;900&display=swap","Exo 2":"https:\/\/fonts.googleapis.com\/css2?family=Exo+2:wght@100;200;300;400;500;600;700;800;900&display=swap","Questrial":"https:\/\/fonts.googleapis.com\/css2?family=Questrial&display=swap","Asap":"https:\/\/fonts.googleapis.com\/css2?family=Asap:wght@400;500;600;700&display=swap","Varela Round":"https:\/\/fonts.googleapis.com\/css2?family=Varela+Round&display=swap","Teko":"https:\/\/fonts.googleapis.com\/css2?family=Teko:wght@300;400;500;600;700&display=swap","Josefin Sans":"https:\/\/fonts.googleapis.com\/css2?family=Josefin+Sans:wght@100;200;300;400;500;600;700&display=swap","Abril Fatface":"https:\/\/fonts.googleapis.com\/css2?family=Abril+Fatface&display=swap","Maven Pro":"https:\/\/fonts.googleapis.com\/css2?family=Maven+Pro:wght@400;500;600;700;800;900&display=swap","Crimson Text":"https:\/\/fonts.googleapis.com\/css2?family=Crimson+Text:wght@400;600;700&display=swap","Signika":"https:\/\/fonts.googleapis.com\/css2?family=Signika:wght@300;400;600;700&display=swap","Rokkitt":"https:\/\/fonts.googleapis.com\/css2?family=Rokkitt:wght@100;200;300;400;500;600;700;800;900&display=swap","Fjalla One":"https:\/\/fonts.googleapis.com\/css2?family=Fjalla+One&display=swap","Catamaran":"https:\/\/fonts.googleapis.com\/css2?family=Catamaran:wght@100;200;300;400;500;600;700;800;900&display=swap","Yanone Kaffeesatz":"https:\/\/fonts.googleapis.com\/css2?family=Yanone+Kaffeesatz:wght@200;300;400;500;600;700&display=swap","Assistant":"https:\/\/fonts.googleapis.com\/css2?family=Assistant:wght@200;300;400;600;700;800&display=swap","IBM Plex Sans":"https:\/\/fonts.googleapis.com\/css2?family=IBM+Plex+Sans:wght@100;200;300;400;500;600;700&display=swap","Tajawal":"https:\/\/fonts.googleapis.com\/css2?family=Tajawal:wght@200;300;400;500;700;800;900&display=swap","Rajdhani":"https:\/\/fonts.googleapis.com\/css2?family=Rajdhani:wght@300;400;500;600;700&display=swap","Amatic SC":"https:\/\/fonts.googleapis.com\/css2?family=Amatic+SC:wght@400;700&display=swap","Archivo":"https:\/\/fonts.googleapis.com\/css2?family=Archivo:wght@100;200;300;400;500;600;700;800;900&display=swap","Fira Sans Condensed":"https:\/\/fonts.googleapis.com\/css2?family=Fira+Sans+Condensed:wght@100;200;300;400;500;600;700;800;900&display=swap","Balsamiq Sans":"https:\/\/fonts.googleapis.com\/css2?family=Balsamiq+Sans:wght@400;700&display=swap","Yantramanav":"https:\/\/fonts.googleapis.com\/css2?family=Yantramanav:wght@100;300;400;500;700&display=swap","Kalam":"https:\/\/fonts.googleapis.com\/css2?family=Kalam:wght@300;400;700&display=swap","Nanum Gothic":"https:\/\/fonts.googleapis.com\/css2?family=Nanum+Gothic:wght@400;700;800&display=swap","Red Hat Display":"https:\/\/fonts.googleapis.com\/css2?family=Red+Hat+Display:wght@400;500;600;700;900&display=swap","PT Sans Narrow":"https:\/\/fonts.googleapis.com\/css2?family=PT+Sans+Narrow:wght@400;700&display=swap","Overpass":"https:\/\/fonts.googleapis.com\/css2?family=Overpass:wght@100;200;300;400;600;700;800;900&display=swap","Concert One":"https:\/\/fonts.googleapis.com\/css2?family=Concert+One&display=swap","Permanent Marker":"https:\/\/fonts.googleapis.com\/css2?family=Permanent+Marker&display=swap","Cuprum":"https:\/\/fonts.googleapis.com\/css2?family=Cuprum:wght@400;500;600;700&display=
1518swap","Archivo Narrow":"https:\/\/fonts.googleapis.com\/css2?family=Archivo+Narrow:wght@400;500;600;700&display=swap","Ropa Sans":"https:\/\/fonts.googleapis.com\/css2?family=Ropa+Sans:wght@400;700&display=swap","Cabin Condensed":"https:\/\/fonts.googleapis.com\/css2?family=Cabin+Condensed:wght@400;500;600;700&display=swap","Manrope":"https:\/\/fonts.googleapis.com\/css2?family=Manrope:wght@200;300;400;500;600;700;800&display=swap","Noto Sans TC":"https:\/\/fonts.googleapis.com\/css2?family=Noto+Sans+TC:wght@100;300;400;500;700;900&display=swap","Spectral":"https:\/\/fonts.googleapis.com\/css2?family=Spectral:wght@200;300;400;500;600;700;800;900&display=swap","Public Sans":"https:\/\/fonts.googleapis.com\/css2?family=Public+Sans:wght@100;200;300;400;500;600;700;800;900&display=swap","Cormorant Garamond":"https:\/\/fonts.googleapis.com\/css2?family=Cormorant+Garamond:wght@300;400;500;600;700&display=swap","Do Hyeon":"https:\/\/fonts.googleapis.com\/css2?family=Do+Hyeon&display=swap","Sarabun":"https:\/\/fonts.googleapis.com\/css2?family=Sarabun:wght@100;200;300;400;500;600;700;800&display=swap","Noto Sans SC":"https:\/\/fonts.googleapis.com\/css2?family=Noto+Sans+SC:wght@100;300;400;500;700;900&display=swap","M PLUS Rounded 1c":"https:\/\/fonts.googleapis.com\/css2?family=M+PLUS+Rounded+1c:wght@100;300;400;500;700;800;900&display=swap"}; 1519 APP.BUILDER_TYPE = "jotform-pricing"; 1520 1521 APP.PDF_FILENAME_TAGGABLE_FIELD_TYPES = ["text","number","hidden"]; 1522 APP.IS_LOCAL_ENV = "0"; 1523 APP.DISABLE_RECAPTCHA_GLOBAL = ""; 1524 Object.freeze(APP); 1525 1526 $.ajaxSetup({ 1527 beforeSend: function(jqXHR, settings) { 1528 if (settings.url.indexOf('http') === -1) { 1529 settings.url = APP.APP_URL + settings.url; 1530 } 1531 }, 1532 }); 1533 </script>
1533 1534 1535 <!-- localization --> 1536
1536<script src="https://formnx.com/js/en/lang.js?v=231"></script>
1536 1537 1538 <!-- include tinymce assets if viewing form & it contains editor or current action is not show form --> 1539
1539<script src="https://formnx.com/js/tinymceEditor.js?id=936a5c16a3ddd2108c13" defer></script>
1539 1540 1541
1541<script src="https://formnx.com/js/app.js?id=51d0d953d4c6e4d9c9f0" defer></script>
1541 1542 <!-- NOTE:bundled js files to optimize size --> 1543 <!--
1543<script src="https://formnx.com/js/common.js?id=1044ddeb6c11792bf9f8"></script>
1543 --> 1544 1545 1546 <!-- intro.js --> 1547 1548 1549
1549<script src="https://formnx.com/js/confetti.js?id=3ed1d70766cb04bc1528"></script>
vendor: 1 bytes, line 1549
1549
1550<script type="text/javascript"> 1551 /* 1552 * print page 1553 */ 1554 function printElement(elem) { 1555 var domClone = elem.cloneNode(true); 1556 var printSection = document.getElementById("printSection"); 1557 1558 if (!printSection) { 1559 var printSection = document.createElement("div"); 1560 printSection.id = "printSection"; 1561 document.body.appendChild(printSection); 1562 } 1563 1564 printSection.innerHTML = ""; 1565 printSection.appendChild(domClone); 1566 window.print(); 1567 } 1568 1569 /* 1570 *Prevent Bootstrap dialog from blocking focusin 1571 */ 1572 document.addEventListener('focusin', (e) => { 1573 if (e.target.closest(".tox-tinymce-aux, .moxman-window, .tam-assetmanager-root") !== null) { 1574 e.stopImmediatePropagation(); 1575 } 1576 }); 1577 1578 var elScrollTimerId = null; 1579 jQuery.validator.setDefaults({ 1580 errorPlacement: function(error, element) { 1581 if (element.hasClass('select2') && element.parent().hasClass('input-group')) { 1582 error.insertAfter(element.parent()); 1583 } else if (element.hasClass('select2')) { 1584 error.insertAfter(element.next('span.select2-container')); 1585 } else if(element.hasClass('input-table-field')) { 1586 element.closest('table').parent().parent().find('div.error-msg').html(error); 1587 } else if (element.parent().hasClass('input-group')) { 1588 error.insertAfter(element.parent()); 1589 } else if (element.parent().hasClass('multi-input')) { 1590 error.insertAfter(element.closest('.multi-input')); 1591 } else if (element.hasClass('tinyMce_editor') || element.hasClass('text_editor')) { 1592 error.insertAfter(element.closest('div').find('div.tox-tinymce')); 1593 } else if (element.hasClass('star_rating')) { 1594 error.insertAfter(element.parent().parent()); 1595 } else if (element.hasClass('switch')) { 1596 error.insertAfter(element.parent().parent()); 1597 } else if (element.hasClass('signature')) { 1598 error.insertAfter(element.parent()); 1599 } else if(element.hasClass('form-check-input')) { 1600 if(element.hasClass('tnc')) error.insertAfter(element.parent()); 1601 else error.insertAfter(element.closest('.row')); 1602 } else if(element.hasClass('scale-rating')) { 1603 error.insertAfter(element.parent().parent()); 1604 } else if(element.hasClass('vs__search')) { 1605 error.insertAfter(element.parent().parent()); 1606 } else if(element.hasClass('image-capture')) { 1607 element.parent().parent().closest('div').find('.capture_img_error').html(error); 1608 } else if(element.hasClass('iti__tel-input')) { 1609 element.closest('.form-group').find('.phone_format_output').html(error); 1610 } else { 1611 error.insertAfter(element); 1612 } 1613 }, 1614 invalidHandler: function(e, validator) { 1615 /* 1616 * scroll to given 1617 * element if form is embedded 1618 * using iframe 1619 */ 1620 let searchParams = new URLSearchParams(window.location.search); 1621 if (searchParams.has('iframe') && validator?.errorList?.length > 0) { 1622 let firstErrorElement = validator?.errorList[0]?.element; 1623 if(elScrollTimerId) { 1624 clearTimeout(elScrollTimerId); 1625 } 1626 elScrollTimerId = setTimeout(() => { 1627 scrollToElement($(firstErrorElement)?.closest('div')?.parent('div')[0]); 1628 elScrollTimerId = null; 1629 }, 500); 1630 } 1631 1632 toastr.error("Errors in one or more input fields, Please check."); 1633 } 1634 }); 1635 1636 $(document).ready(function() { 1637 1638 if ($.fn.dataTable) { 1639 jQuery.extend($.fn.dataTable.defaults, { 1640 fixedHeader: false, 1641 aLengthMenu: [ 1642 [25, 50, 100, 200, 500, 1000, -1], 1643 [25, 50, 100, 200, 500, 1000, "All"] 1644 ], 1645 iDisplayLength: 25, 1646 dom: 'lBfrtip', 1647 buttons: [{ 1648 extend: 'copy', 1649 text: "Copy", 1650 exportOptions: { 1651 columns: ':visible', 1652 } 1653 }, 1654 { 1655 extend: 'excel', 1656 text: "Excel", 1657 exportOptions: { 1658 columns: ':visible', 1659 } 1660 }, 1661 { 1662 extend: 'csv', 1663 text: "CSV", 1664 exportOptions: { 1665 columns: ':visible', 1666 } 1667 }, 1668 { 1669 extend: 'colvis', 1670 text: "Column visibility", 1671 }, 1672 ], 1673 "language": { 1674 "emptyTable": "No data available in table", 1675 "info": "Showing _START_ to _END_ of _TOTAL_ entries", 1676 "infoEmpty": "Showing 0 to 0 of 0 entries", 1677 "infoFiltered": "(filtered from _MAX_ total entries)", 1678 "lengthMenu": "Show _MENU_ entries", 1679 "loadingRecords": "Loading...", 1680 "processing": "Processing...", 1681 "search": "Search", 1682 "zeroRecords": "No matching records foun
1682d", 1683 "paginate": { 1684 "first": "First", 1685 "last": "Last", 1686 "next": "Next", 1687 "previous": "Previous" 1688 }, 1689 buttons: { 1690 copyTitle: "Copy to clipboard", 1691 copySuccess: { 1692 _: "Copied %d rows to clipboard" 1693 } 1694 } 1695 } 1696 }); 1697 } 1698 1699 $.ajaxSetup({ 1700 headers: { 1701 'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content') 1702 } 1703 }); 1704 }); 1705 1706 function initialize_text_editor(element_name, placeholder, height, type="form") { 1707 element_name = $.escapeSelector(element_name); 1708 if(tinymce.get(`${element_name}`)) tinymce.get(`${element_name}`).remove(); 1709 setTimeout(() => { 1710 tinymce.init({ 1711 selector: `#${element_name}`, 1712 placeholder: placeholder, 1713 min_height: height || 300, 1714 promotion: false, 1715 branding: false, 1716 plugins: 'link lists anchor autoresize image', 1717 toolbar: 'undo redo | blocks fontsize | bold italic underline strikethrough | forecolor backcolor alignleft aligncenter alignright al
1717ignjustify | link image lineheight | bullist numlist outdent indent | superscript subscript | hr removeformat', 1718 toolbar_mode: 'wrap', 1719 menubar: false, 1720 relative_urls : false, 1721 document_base_url: APP.APP_URL+'/', 1722 images_upload_handler: function (blobInfo, success, failure) { 1723 return new Promise(function (resolve, reject) { 1724 let __form_id = $("#__form_id").val() || ''; 1725 let data = new FormData(); 1726 data.append('file', blobInfo.blob(), blobInfo.filename()); 1727 data.append('type', type); 1728 data.append('form_id', __form_id); 1729 $.ajax({ 1730 data: data, 1731 type: "POST", 1732 url: "https://formnx.com/file-upload", 1733 processData: false, 1734 contentType: false, 1735 success: function(response) { 1736 if(response.success) { 1737 resolve(response.url); 1738 } else { 1739 toastr.error(response.msg); 1740 reject('File upload failed: ' + error); 1741 } 1742 }, 1743 error: function (xhr, status, error) { 1744 reject('File upload failed: ' + error); 1745 } 1746 }); 1747 }); 1748 } 1749 }); 1750 },100); 1751 } 1752 1753 function initialize_star_rating(element_name) { 1754 $("#" + $.escapeSelector(element_name)).rating({ 1755 theme: 'krajee-fas', 1756 filledStar: '<i class="fas fa-star"></i>', 1757 emptyStar: '<i class="fas fa-star"></i>', 1758 rtl: APP.FORM_LOCALES[APP.FORM_LOCALE]['rtl'] || false, 1759 language: APP.FORM_LOCALE 1760 }); 1761 } 1762 1763 function initializeToastrSettingsForForm(position) { 1764 var toastr_position = 'toast-top-right'; 1765 if (position) { 1766 toastr_position = position; 1767 } 1768 toastr.options = { 1769 "positionClass": toastr_position 1770 } 1771 } 1772 1773 function showAuthAlert(msg = '', template_slug = '', template_name = '') { 1774 let route_name = 'https://formnx.com/register'; 1775 if(template_slug) { 1776 route_name = route_name + '?template=' + template_slug;
1777 } 1778 1779 // ====== A/B TEST: Modal vs Direct ====== 1780 // Get or assign variant (50% modal, 50% direct) 1781 let abVariant = localStorage.getItem('ab_auth_modal_test'); 1782 if (!abVariant) { 1783 abVariant = Math.random() < 0.5 ? 'modal' : 'direct'; 1784 localStorage.setItem('ab_auth_modal_test', abVariant); 1785 } 1786 1787 // VARIANT B: Direct Redirect (no modal) 1788 if (abVariant === 'direct') { 1789 window.location.href = route_name; 1790 return; 1791 } 1792 1793 // VARIANT A: Show Modal 1794 let title = template_name 1795 ? 'Use the <strong>' + template_name + '</strong> template â it\'s free' 1796 : 'Create your free account'; 1797 1798 let ctaText = template_name ? 'Use This Template Free' : 'Register'; 1799 1800 let loginUrl = 'https://formnx.com/login'; 1801 1802 Swal.fire({ 1803 title: '<span class="lh-sm fs-5">' + title + '</span>', 1804 html: '<div class="mt-3">' + 1805 '<a id="registerButton" class="btn btn-success btn-lg mx-2 mb-2 col-md-8" href="' + route_name + '">' + ctaText + ' â</a>' + 1806 '<div class="mt-2 mb-2 text-center"><small>' + 1807 '<i class="fas fa-check-circle me-1 text-success"></i><small>Unlimited Forms</small>' + 1808 '<i class="fas fa-check-circle ms-2 me-1 text-success"></i><small>Unlimited Responses</small>' + 1809 '<i class="fas fa-check-circle ms-2 me-1 text-success"></i><small>Free Forever</small>' + 1810 '</small></div>' + 1811 '<div class="text-center mt-1"><small class="text-muted">â 4.5/5 · 12,271+ users</small></div>' + 1812 '<div class="text-center mt-2"><small class="text-muted">Already have an account? <a href="' + loginUrl + '">Sign in</a></small></div>' + 1813 '</div>', 1814 showCloseButton: true,
1815 showConfirmButton: false, 1816 focusCancel: false, 1817 allowOutsideClick: true, 1818 customClass: { 1819 popup: 'animated tada', 1820 }, 1821 didOpen: () => { 1822 document.getElementById('registerButton').focus(); 1823 } 1824 }) 1825 } 1826 1827 function initializeConfettiAnimation() { 1828 const count = 200, 1829 defaults = { 1830 origin: { y: 0.7 }, 1831 }; 1832 1833 function fire(particleRatio, opts) { 1834 confetti( 1835 Object.assign({}, defaults, opts, { 1836 particleCount: Math.floor(count * particleRatio), 1837 }) 1838 ); 1839 } 1840 1841 fire(0.25, { 1842 spread: 26, 1843 startVelocity: 55, 1844 }); 1845 1846 fire(0.2, { 1847 spread: 60, 1848 }); 1849 1850 fire(0.35, { 1851 spread: 100, 1852 decay: 0.91, 1853 scalar: 0.8, 1854 }); 1855 1856 fire(0.1, { 1857 spread: 120, 1858 startVelocity: 25, 1859 decay: 0.92, 1860 scalar: 1.2, 1861 }); 1862 1863 fire(0.1, { 1864 spread: 120, 1865 startVelocity: 45, 1866 }); 1867 } 1868 1869 function getStyles(config, inline=false) { 1870 let triggerType = config.triggerType || 'button'; 1871 let buttonPosition = config.buttonPosition || 'auto'; 1872 if(buttonPosition && !inline) { 1873 let popupPositionStyles = { 1874 topLeft: `.topLeft::before {margin: 0;}.topLeft .fancybox__content {align-self: flex-start;}`, 1875 topRight: `.topRight::before {margin: 0;}.topRight .fancybox__content {align-self: flex-end;}`, 1876 bottomLeft: `.bottomLeft::after {margin: 0;}.bottomLeft .fancybox__content {align-self: flex-start;}`, 1877 bottomRight: `.bottomRight::after {margin: 0;}.bottomRight .fancybox__content {align-self: flex-end;}` 1878 } 1879 return popupPositionStyles[buttonPosition] || ''; 1880 } 1881 1882 if(triggerType == 'button' && inline) { 1883 // Shared modern look for every trigger button. `border:0` removes the 1884 // default <button> border (the old square/black outline), with comfy 1885 // padding, rounded corners, a medium weight and a subtle shadow. 1886 let base = `font-family: inherit;font-size: 1rem;font-weight: 600;line-height: 1.2;color: ${config.buttonTextColor};background: ${config.buttonColor};border: 0;cursor: pointer;text-align: center;text-decoration: none;text-shadow: none;`; 1887 let floatShadow = `box-shadow: 0 4px 14px rgba(0,0,0,0.18);`; 1888 let buttonPositionStyles = { 1889 leftCenter: `${base}transform: rotate(-90deg);transform-origin: top left;padding: 12px 18px;position: fixed;left: 0px;z-index: 999;border-radius: 0 0 8px 8px;top: 50%;margin-top: -16px;`, 1890 rightCenter: `${base}transform: rotate(90deg);transform-origin: right top;padding: 12px 18px;position: fixed;right: 0px;z-index: 999;border-radius: 0 0 8px 8px;top: 50%;margin-top: -16px;`, 1891 auto: `${base}padding: 12px 24px;border-radius: 8px;box-shadow: 0 1px 2px rgba(0,0,0,0.08);`, 1892 bottomLeft: `${base}${floatShadow}padding: 12px 24px;position: fixed;left: 16px;z-index: 999;border-radius: 8px;bottom: 16px;`, 1893 bottomRight: `${base}${floatShadow}padding: 12px 24px;position: fixed;right: 16px;z-index: 999;border-radius: 8px;bottom: 16px;`, 1894 topLeft: `${base}${floatShadow}padding: 12px 24px;position: fixed;left: 16px;z-index: 999;border-radius: 8px;top: 16px;`, 1895 topRight: `${base}${floatShadow}padding: 12px 24px;position: fixed;right: 16px;z-index: 999;border-radius: 8px;top: 16px;`, 1896 } 1897 return buttonPositionStyles[buttonPosition] || ''; 1898 } 1899 } 1900 1901 /* 1902 * Build the popup embed snippet. Emits a trigger element carrying the popup 1903 * behaviour as data-* attributes plus a single hosted formnx-popup.js script 1904 * tag â no inline event handlers (CSP-safe) and no external lightbox library. 1905 * Older embeds use their own frozen self-contained code and are unaffected. 1906 */ 1907 function generateFormPublishCodes(link, config) { 1908 let triggers = config.popupTrigger || []; 1909 let hasButton = triggers.includes('button'); 1910 1911 // Minimal by design: the only required attribute is data-formnx="<url>". 1912 // Everything else is emitted only when it differs from the defaults
1913 // (click trigger, close button on). This also makes "add it to your own 1914 // element" a single copy-pasteable attribute. 1915 let attrs = [`data-formnx="${link}"`]; 1916 if(!(triggers.length === 1 && triggers[0] === 'button')) { 1917 attrs.push(`data-formnx-trigger="${triggers.join(',')}"`); 1918 } 1919 if(triggers.includes('delayed')) attrs.push(`data-formnx-delay="${config.delayBy || 4}"`); 1920 if(triggers.includes('scroll')) attrs.push(`data-formnx-scroll="${config.scrollPercent || 60}"`); 1921 if(!config.popupClose) attrs.push('data-formnx-close="false"'); 1922 if(config.fullscreen) attrs.push('data-formnx-fullscreen="true"'); 1923 1924 let scriptTag = `<script src="${APP.PUBLIC_URL}js/formnx-popup.js" async></script>`; 1925 1926 let triggerEl; 1927 if(hasButton) { 1928 // getStyles(config, true) returns the button's colour + position styles 1929 // (click is wired by formnx-popup.js; hover is left to the user's own CSS). 1930 triggerEl = `<button ${attrs.join(' ')} style="${getStyles(config, true)}">${config.buttonText || 'Open form'}</button>`; 1931 } else { 1932 // Auto-trigger only (delayed / scroll / exit): a hidden element carries the config. 1933 triggerEl = `<div ${attrs.join(' ')} style="display:none"></div>`; 1934 } 1935 1936 return `${triggerEl}\n${scriptTag}`; 1937 } 1938 1939 function initialize_camera(config) { 1940 const {name, captured_notification="Photo captured successfully."} = config; 1941 let isFrontCamera = true; 1942 let videoStream = null; 1943 function openCamera() { 1944 navigator.mediaDevices.getUserMedia({ video: { facingMode: isFrontCamera ? 'user' : 'environment' } }) 1945 .then(function(stream) { 1946 const video = document.getElementById(`camera_${$.escapeSelector(name)}`); 1947 video.srcObject = stream; 1948 videoStream = stream; 1949 $(`#start_camera_${$.escapeSelector(name)}`).addClass('d-none'); 1950 showActiveCameraButtons($.escapeSelector(name)); 1951 showMessage($.escapeSelector(name)); 1952 }) 1953 .catch(function(error) { 1954 showMessage($.escapeSelector(name), `<span class='text-danger'>Permission denied: Check your browser's privacy settings to use camera.</span>`); 1955 setCameraToInitialState($.escapeSelector(name)); 1956 }); 1957 } 1958 1959 function showMessage(name, msg='') { 1960 $(`#${name}`).parent().parent() 1961 .find(".capture_img_error") 1962 .html(`${msg}`); 1963 } 1964 1965 function flipCamera() { 1966 isFrontCamera = !isFrontCamera; 1967 if (videoStream) { 1968 videoStream.getTracks().forEach(track => track.stop()); 1969 } 1970 openCamera(); 1971 } 1972 1973 function setCameraToInitialState(name) { 1974 $(`#camera_${name}`).addClass('d-none'); 1975 $(`#canvas_${name}`).addClass('d-none'); 1976 $(`#capture_img_${name}`).addClass('d-none'); 1977 $(`#flip_camera_${name}`).addClass('d-none'); 1978 $(`#start_camera_${name}`).removeClass('d-none'); 1979 } 1980 1981 function takeSnapshot() { 1982 const video = document.getElementById(`camera_${$.escapeSelector(name)}`); 1983 const canvas = document.getElementById(`canvas_${$.escapeSelector(name)}`); 1984 const context = canvas.getContext('2d'); 1985 1986 // Cap the captured resolution so the (PNG) data URL submitted inline 1987 // with the form stays a reasonable size. Scale the longest side down 1988 // to MAX_DIMENSION, preserving aspect ratio; never upscale. 1989 const MAX_DIMENSION = 1280; 1990 const srcW = video.videoWidth || MAX_DIMENSION; 1991 const srcH = video.videoHeight || MAX_DIMENSION; 1992 const scale = Math.min(1, MAX_DIMENSION / Math.max(srcW, srcH)); 1993 canvas.width = Math.round(srcW * scale); 1994 canvas.height = Math.round(srcH * scale); 1995 1996 context.drawImage(video, 0, 0, canvas.width, canvas.height); 1997 $(`#${$.escapeSelector(name)}`).val(canvas.toDataURL()).trigger('change'); 1998 showInactiveCameraButtons($.escapeSelector(name)); 1999 if (videoStream) {
2000 videoStream.getTracks().forEach(track => track.stop()); 2001 videoStream = null; 2002 } 2003 showMessage($.escapeSelector(name), `<span class='text-success'>${captured_notification}</span>`); 2004 } 2005 2006 function showInactiveCameraButtons(name) { 2007 $(`#canvas_${name}`).removeClass('d-none'); 2008 $(`#camera_${name}`).addClass('d-none'); 2009 $(`#capture_img_${name}`).addClass('d-none'); 2010 $(`#flip_camera_${name}`).addClass('d-none'); 2011 $(`#recapture_img_${name}`).removeClass('d-none'); 2012 $(`#start_camera_${name}`).addClass('d-none'); 2013 } 2014 2015 function showActiveCameraButtons(name) { 2016 $(`#canvas_${name}`).addClass('d-none'); 2017 $(`#camera_${name}`).removeClass('d-none'); 2018 $(`#capture_img_${name}`).removeClass('d-none'); 2019 $(`#flip_camera_${name}`).removeClass('d-none'); 2020 } 2021 2022 function drawImageOnCanvasFromUrl(imageUrl, name) { 2023 const img = new Image(); 2024 img.crossOrigin = 'Anonymous'; //to avoid CORS issues 2025 img.src = imageUrl; 2026 2027 /* 2028 * when image is loaded, 2029 * draw it on a canvas and convert it to base64 2030 */ 2031 img.onload = function() { 2032 try { 2033 const canvas = document.getElementById(`canvas_${$.escapeSelector(name)}`); 2034 const ctx = canvas.getContext('2d'); 2035 canvas.width = img.width; 2036 canvas.height = img.height; 2037 ctx.drawImage(img, 0, 0); //Draw the image on the canvas 2038 const base64Data = canvas.toDataURL('image/png'); //Get the base64-encoded data URL 2039 $(`#${$.escapeSelector(name)}`).val(base64Data); 2040 showInactiveCameraButtons($.escapeSelector(name)); 2041 } catch (error) { 2042 $(`#${$.escapeSelector(name)}`).val(''); 2043 console.error('Error drawing image:', error.message); 2044 setCameraToInitialState($.escapeSelector(name)); 2045 } 2046 }; 2047 2048 /* 2049 * Handle image loading errors 2050 */ 2051 img.onerror = function(error) { 2052 console.error('Error loading image:', error); 2053 }; 2054 } 2055 2056 $(`#start_camera_${$.escapeSelector(name)}`).click(function() { 2057 openCamera(); 2058 }); 2059 2060 $(`#capture_img_${$.escapeSelector(name)}`).click(function() { 2061 takeSnapshot(); 2062 }); 2063 2064 $(`#flip_camera_${$.escapeSelector(name)}`).click(function() { 2065 flipCamera(); 2066 }); 2067 2068 $(`#recapture_img_${$.escapeSelector(name)}`).click(function() { 2069 $(`#${$.escapeSelector(name)}`).val('').trigger('change'); 2070 showMessage($.escapeSelector(name)); 2071 showActiveCameraButtons($.escapeSelector(name)); 2072 $(`#recapture_img_${$.escapeSelector(name)}`).addClass('d-none'); 2073 openCamera(); 2074 }); 2075 2076 /* 2077 * Draw image to canvas if 2078 * image exist 2079 */ 2080 let existingImg = $(`#${$.escapeSelector(name)}`).val() || ''; 2081 if(existingImg?.length > 0) { 2082 let imageUrl = `${APP.STATIC_URL}/${existingImg}`; 2083 drawImageOnCanvasFromUrl(imageUrl, name); 2084 } 2085 } 2086 2087 /* 2088 * scroll to given 2089 * element if element is 2090 * not visible in viewport 2091 */ 2092 function scrollToElement(el) { 2093 const rect = el?.getBoundingClientRect(); 2094 const isElementInViewport = (rect.top >= 0 && rect.top < (window.innerHeight || document.documentElement.clientHeight)); 2095 if(!isElementInViewport) { 2096 el?.scrollIntoView({ behavior: "smooth", block: "start", inline: "start"}); 2097 } 2098 } 2099 2100 /* 2101 * reCAPTCHA v2 token expiry handler. 2102 * 2103 * Google fires this once the token's 120-second lifetime elapses. We reset the 2104 * widget (so the user can re-verify), tell the user clearly what happened, and 2105 * scroll the widget into view in case they were filling other fields and missed 2106 * the change. Silent reset alone is the dominant cause of "reCAPTCHA error" 2107 * false rejects on long forms / file-upload forms. 2108 */
2109 function grecaptchaExpiryHandler() { 2110 const captchaEl = document.querySelector('.g-recaptcha-v2'); 2111 if(window.grecaptcha && captchaEl) { 2112 window.grecaptcha.reset(); 2113 2114 if (typeof toastr !== 'undefined') { 2115 const msg = _.get(window.i18n, 'form.recaptcha_expired') 2116 || 'Verification expired. Please check the "I\'m not a robot" box again before submitting.'; 2117 toastr.error(msg); 2118 } 2119 2120 // Bring the widget on-screen so the user sees they need to act on it 2121 captchaEl.scrollIntoView({ behavior: 'smooth', block: 'center' }); 2122 } 2123 } 2124 2125 /* 2126 * reCAPTCHA v2 API onload handler. 2127 * Called by Google's api.js once it has finished loading. Dispatches a global 2128 * event so the form component can render the widget without polling for grecaptcha. 2129 */ 2130 window.onRecaptchaApiLoad = function() { 2131 window.dispatchEvent(new Event('recaptcha-api-loaded')); 2132 }; 2133 2134</script>
2134 2135
2136<script type="text/javascript"> 2137 $(document).ready(function() { 2138 2139 2140 2141 2142 $('.prevent_space_and_symbol').on('input', function() { 2143 let value = $(this).val(); 2144 $(this).val(value.replace(/[\s~`!@#$%^&*()_\-+=\[\]{};:'"\\|,.<>\/?]/g, '')); 2145 }); 2146 2147 if($(".edit_template").length > 0) { 2148 $(document).on('click', '.edit_template', function() { 2149 let url = $(this).data('href'); 2150 $.ajax({ 2151 method: "GET", 2152 url: url, 2153 dataType: "html", 2154 success: function(response) { 2155 $("#edit_template_info").html(response).modal('show'); 2156 } 2157 }); 2158 }); 2159 2160 $('#edit_template_info').on('shown.bs.modal', function () { 2161 $(".select2").select2({ 2162 multiple: true, 2163 allowClear: true, 2164 dropdownParent: $('#edit_template_info'), 2165 placeholder: 'Select categories', 2166 theme: "bootstrap-5", 2167 }); 2168 $('form#edit_template_details_form').validate({ 2169 submitHandler: function(form, e) { 2170 e.preventDefault(); 2171 let data = $('form#edit_template_details_form').serialize(); 2172 let url = $('form#edit_template_details_form').attr('action'); 2173 if ($('form#edit_template_details_form').valid()) { 2174 let ladda = Ladda.create(document.querySelector('.update-template-details-btn')); 2175 ladda.start(); 2176 $.ajax({ 2177 method:"PUT", 2178 url: url, 2179 data: data, 2180 dataType: "json", 2181 success:function(response) { 2182 ladda.stop(); 2183 if(response.success == true){ 2184 toastr.success(response.msg); 2185 $("#edit_template_info").modal('hide'); 2186 } else { 2187 toastr.error(response.msg); 2188 } 2189 } 2190 }); 2191 } 2192 } 2193 }); 2194 }) 2195 } 2196 2197 /** 2198 * Opens the subscription packages modal via AJAX. 2199 * Optionally accepts a feature key to show a context-aware headline. 2200 * @param {string|null} feature - e.g. 'csv_export', 'ai_fields', 'integrations' 2201 */ 2202 window.triggerSubscriptionModal = function(feature) { 2203 const params = feature ? '?feature=' + encodeURIComponent(feature) : ''; 2204 $.ajax({ 2205 method: "GET", 2206 url: "https://formnx.com/show-subscription-packages" + params, 2207 dataType: "html", 2208 success: function(response) { 2209 $("#modal_div").html(response).modal('show'); 2210 // Funnel tracking: which locked feature opened the upgrade modal 2211 window.lastUpgradeFeature = feature || 'generic'; 2212 window.fnxTrack('upgrade_modal_shown', { upgrade_feature: window.lastUpgradeFeature }); 2213 setTimeout(() => { 2214 initializeFilterFunctions(); 2215 // Tooltips are normally initialised by the Vue mixin in functions.vue on 2216 // mounted/updated. This modal is injected with jQuery .html() over AJAX, 2217 // so Vue never sees it and its tooltips stayed dead. Initialise them here. 2218 initializeModalTooltips(); 2219 }, 0); 2220 } 2221 }); 2222 }; 2223 2224 /** 2225 * Bootstrap tooltips for markup injected into #modal_div after page load. 2226 * 2227 * `container: 'body'` keeps the tooltip out of the modal'
2227s own stacking/overflow 2228 * context, and disposing on hide stops instances leaking each time the modal reopens. 2229 */ 2230 function initializeModalTooltips() { 2231 var triggers = document.querySelectorAll('#modal_div [data-bs-toggle="tooltip"]'); 2232 [].forEach.call(triggers, function(el) { 2233 if (!el._bootstrapTooltip) { 2234 new bootstrap.Tooltip(el, { container: 'body' }); 2235 el._bootstrapTooltip = true; 2236 } 2237 }); 2238 2239 $('#modal_div').off('hidden.bs.modal.tips').on('hidden.bs.modal.tips', function() { 2240 [].forEach.call(this.querySelectorAll('[data-bs-toggle="tooltip"]'), function(el) { 2241 var tip = bootstrap.Tooltip.getInstance(el); 2242 if (tip) { tip.dispose(); } 2243 el._bootstrapTooltip = false; 2244 }); 2245 }); 2246 } 2247 2248 /** 2249 * Checkout from the upgrade modal, without the browser's "Leave site?" prompt. 2250 * 2251 * The builder arms window.onbeforeunload when the form has unsaved edits, so 2252 * navigating to Stripe triggers the native warning - and answering it discards the 2253 * user's work while they pay for the feature that unblocks it. Instead: save first 2254 * (the builder saves over AJAX and resets window.initialFormData, which is what the 2255 * guard compares), then let CreateForm redirect once the save succeeds. 2256 * 2257 * Falls straight through to normal navigation when there is no guard, no builder on 2258 * the page, or nothing unsaved. 2259 */ 2260 $(document).on('click', '.pkg-checkout-cta', function(e) { 2261 // Funnel tracking: checkout started, attributed to the feature that opened the modal. 2262 // Skip the Stripe billing-portal button (existing subscribers managing billing, not a new checkout). 2263 if (!/billing\.stripe\.com/.test(this.href || '')) { 2264 window.fnxTrack('checkout_started', { upgrade_feature: window.lastUpgradeFeature || 'direct' }); 2265 } 2266 2267 // No unsaved-changes guard armed - nothing to work around. 2268 if (typeof window.onbeforeunload !== 'function') { 2269 return; 2270 } 2271 2272 var $builderForm = $('form#create_form').not('#modal_div form#create_form'); 2273 var $saveBtn = $('button.ladda-form-save-btn').filter(':visible').first(); 2274 2275 // Not the builder, or nothing to save with: just disable the guard and navigate. 2276 if (!$builderForm.length || !$saveBtn.length) { 2277 window.onbeforeunload = null; 2278 return; 2279 } 2280 2281 // Guard returns a string only when the form is actually dirty. 2282 var isDirty = typeof window.onbeforeunload() === 'string'; 2283 if (!isDirty) { 2284 window.onbeforeunload = null; 2285 return; 2286 } 2287 2288 // Unsaveable (validation errors) - warn rather than trap them on a dead button. 2289 if ($builderForm.length && typeof $builderForm.valid === 'function' && !$builderForm.valid()) { 2290 toastr.error('Please fix the highlighted fields, then upgrade.'); 2291 e.preventDefault(); 2292 return; 2293 } 2294 2295 e.preventDefault(); 2296 window.pendingCheckoutUrl = this.href; 2297 $saveBtn.trigger('click'); 2298 }); 2299 2300 setTimeout(() => { 2301 if($('.subscription_alert').length > 0) { 2302 $(document).on('click', '.subscription_alert', function() { 2303 // Read data-feature from the clicked element (or its closest parent with one) 2304 const feature = $(this).data('feature') || $(this).closest('[data-feature]').data('feature') || null; 2305 window.triggerSubscriptionModal(feature); 2306 }); 2307 } 2308 },300); 2309 2310 function initializeFilterFunctions() { 2311 // The pricing partial ships its own combined interval + workspace filter when a 2312 // Monthly/Yearly toggle is on screen. Defer to it so the two never disagree. 2313 if (typeof window.applyPackageFilters === 'function') { 2314 window.applyPackageFilters(); 2315 return; 2316 } 2317 2318 const filterPackagesBasedOnWorkspace = () => { 2319 if($("#filter_by_workspace").length > 0) { 2320 const workspace = $("#filter_by_workspace").val(); 2321 $('.package').hide(); 2322 $(`.workspace_${workspace}`).fadeIn(); 2323 } 2324 }; 2325 2326 //initial filter on page load 2327 filterPackagesBasedOnWorkspace(); 2328 2329 //re-filter when workspace is changed 2330 $(document).on('change', '#filter_by_workspace', filterPackagesBasedOnWorkspace); 2331 } 2332 2333 initializeFilterFunctions(); 2334 2335 const popoverTriggerList = document.querySelectorAll('[data-bs-toggle="popover"]'); 2336 const popoverList = [...popoverTriggerList].map(popoverTriggerEl => new bootstrap.Popover(popoverTriggerEl)); 2337 }); 2338</script>
2338<script> 2339 (function () { 2340 // ----- Sticky CTA (appears once the hero scrolls out of view) ----- 2341 var sticky = document.getElementById('pp-sticky'); 2342 var hero = document.getElementById('pp-hero'); 2343 if (sticky && hero) { 2344 window.addEventListener('scroll', function () { 2345 sticky.classList.toggle('is-visible', hero.getBoundingClientRect().bottom < 0); 2346 }, { passive: true }); 2347 } 2348 2349 // ----- FAQ accordion (same behaviour as alternative pages) ----- 2350 function showFaqAccordion(e) { e.setAttribute("style", "max-height: " + e.scrollHeight + "px"); } 2351 if (document.querySelectorAll("#faq-accordion-block").length > 0) { 2352 document.querySelector("#faq-accordion-block").addEventListener("click", function (e) { 2353 var o, c = document.querySelector(".faq-accordion__section--open"), 2354 t = e.target.closest(".faq-accordion__section"); 2355 if (!t) return; 2356 var n = t.querySelector(".faq-accordion__content"); 2357 t && t !== c ? c ? (o = function (e) { 2358 t.classList.add("faq-accordion__section--open"); showFaqAccordion(n); c.removeEventListener("transitionend", o); 2359 }, c.addEventListener("transitionend", o), c.querySelector(".faq-accordion__content").removeAttribute("style"), c.classList.remove("faq-accordion__section--open")) : (t.classList.add("faq-accordion__section--open"), showFaqAccordion(n)) : (t.querySelector(".faq-accordion__content").removeAttribute("style"), t.classList.remove("faq-accordion__section--open")); 2360 }); 2361 } 2362 })(); 2363</script>
2363 2364 2365<!-- Cal.com element-click embed (Book a Demo popup). embed.js is injected async on first Cal() call. -->
2366<script type="text/javascript"> 2367 (function (C, A, L) { let p = function (a, ar) { a.q.push(ar); }; let d = C.document; C.Cal = C.Cal || function () { let cal = C.Cal; let ar = arguments; if (!cal.loaded) { cal.ns = {}; cal.q = cal.q || []; d.head.appendChild(d.createElement("script")).src = A; cal.loaded = true; } if (ar[0] === L) { const api = function () { p(api, arguments); }; const namespace = ar[1]; api.q = api.q || []; if(typeof namespace === "string"){cal.ns[namespace] = cal.ns[namespace] || api;p(cal.ns[namespace], ar);p(cal, ["initNamespace", namespace]);} else p(cal, ar); return;} p(cal, ar); }; })(window, "https://app.cal.com/embed/embed.js", "init"); 2368 Cal("init", "formnx-support", {origin:"https://app.cal.com"}); 2369 Cal.ns["formnx-support"]("ui", {"hideEventTypeDetails":false,"layout":"month_view"}); 2370</script>
2370 2371<!-- Cal.com embed ends --> 2372
2373<script> 2374/* Review carousel (shared partial: partials/reviews_carousel.blade.php). 2375 Lives in the layout so ANY page that includes the partial gets working 2376 controls - it self-guards on #reviews-track and exits on pages without it. 2377 Everything is DELEGATED on document and re-queries the DOM at use time: 2378 Vue re-renders #app and replaces nodes, so direct listeners and JS-built 2379 children can be silently lost. The dots are therefore self-healing. */ 2380(function () { 2381 if (!document.getElementById('reviews-track')) return; 2382 var AUTOPLAY_MS = 5000; 2383 var RESUME_AFTER_MS = 12000; 2384 var reduceMotion = window.matchMedia && window.matchMedia('(prefers-reduced-motion: reduce)').matches; 2385 var userPaused = false; 2386 var hoverPaused = false; 2387 var resumeTimer; 2388 2389 function track() { return document.getElementById('reviews-track'); } 2390 /* The carousel advances ONE card at a time (conveyor style): card 2 2391 slides into slot 1, card 3 into slot 2, a new card enters slot 3, 2392 and the spotlight passes to whichever card is now centered. */ 2393 function cardStep() { 2394 var t = track(); 2395 if (!t || !t.children.length) return 1; 2396 var gap = parseFloat(getComputedStyle(t).columnGap) || 20; 2397 return t.children[0].offsetWidth + gap; 2398 } 2399 function pageCount() { 2400 var t = track(); 2401 if (!t) return 1; 2402 return Math.max(1, Math.round((t.scrollWidth - t.clientWidth) / cardStep()) + 1); 2403 } 2404 function pageIndex() { 2405 var t = track(); 2406 return t ? Math.round(t.scrollLeft / cardStep()) : 0; 2407 } 2408 function goTo(i) { 2409 var t = track(); 2410 if (!t) return; 2411 var n = pageCount(); 2412 i = ((i % n) + n) % n; // wrap both directions 2413 var left = Math.min(i * cardStep(), t.scrollWidth - t.clientWidth); 2414 t.scrollTo({ left: left, behavior: reduceMotion ? 'auto' : 'smooth' }); 2415 } 2416 function pauseForUser() { 2417 userPaused = true; 2418 clearTimeout(resumeTimer); 2419 resumeTimer = setTimeout(function () { userPaused = false; }, RESUME_AFTER_MS); 2420 } 2421 2422 /* Pagination dots: rebuilt whenever the count is wrong (initial 2423 render, resize breakpoint change, or a Vue re-render wiped them) */ 2424 function ensureDots() { 2425 var wrap = document.querySelector('[data-reviews-dots]'); 2426 var t = track(); 2427 if (!wrap || !t) return; 2428 var n = pageCount(); 2429 if (wrap.children.length !== n) { 2430 var html = ''; 2431 for (var i = 0; i < n; i++) { 2432 html += '<button type="button" class="mk-review-dot" data-reviews-dot="' + i + '" aria-label="Go to reviews page ' + (i + 1) + '"></button>'; 2433 } 2434 wrap.innerHTML = html; 2435 } 2436 var active = pageIndex(); 2437 for (var j = 0; j < wrap.children.length; j++) { 2438 wrap.children[j].classList.toggle('is-active', j === active); 2439 } 2440 } 2441 2442 /* Spotlight: the card closest to the visible center gets the ring */ 2443 function spotlight() { 2444 var t = track(); 2445 if (!t) return; 2446 var center = t.scrollLeft + t.clientWidth / 2; 2447 var best = null, bestDist = Infinity; 2448 for (var i = 0; i < t.children.length; i++) { 2449 var c = t.children[i]; 2450 var d = Math.abs((c.offsetLeft + c.offsetWidth / 2) - center); 2451 c.classList.remove('is-spotlight'); 2452 if (d < bestDist) { bestDist = d; best = c; } 2453 } 2454 if (best) best.classList.add('is-spotlight'); 2455 } 2456 2457 function sync() { ensureDots(); spotlight(); } 2458 2459 document.addEventListener('click', function (e) { 2460 var el = e.target.closest ? e.target.closest('[data-reviews-prev],[data-reviews-next],[data-reviews-dot]') : null; 2461 if (!el) return; 2462 e.preventDefault(); 2463 pauseForUser(); 2464 if (el.hasAttribute('data-reviews-dot')) { 2465 goTo(parseInt(el.getAttribute('data-reviews-dot'), 10)); 2466 } else { 2467 goTo(pageIndex() + (el.hasAttribute('data-reviews-prev') ? -1 : 1)); 2468 } 2469 }); 2470 document.addEventListener('pointerdown', function (e) { 2471 if (e.target.closest && e.target.closest('.mk-review-carousel')) pauseForUser(); 2472 }, true); 2473 document.addEventListener('pointerover', function (e) { 2474 hoverPaused = !!(e.target.closest && e.target.closest('.mk-review-track')); 2475 }); 2476 /* scroll does not bubble; capture it at document level */ 2477 document.addEventListener('scroll', function (e) { 2478 if (e.target && e.target.id === 'reviews-track') sync(); 2479 }, true); 2480 window.addEventListener('resize', sync); 2481 2482 setInterval(function () { 2483 sync(); // self-heal dots/spotlight even without user scrolling 2484 if (reduceMotion || document.hidden || userPaused || hoverPaused) return; 2485 goTo(pageIndex() + 1); 2486 }, AUTOPLAY_MS); 2487 2488 setTimeout(sync, 800); // first paint after Vue settles 2489 })(); 2490 2491/* Scroll reveal (2026 redesign, lp2.css section 15).
2492 Fail-safe by design: elements are hidden only AFTER this script tags the 2493 below-fold ones with .mk-reveal, so no-JS/crawlers/script errors always 2494 see the full page. Classes are removed after each reveal finishes, so 2495 hover transitions return to their normal component styling. */ 2496(function () { 2497 if (!('IntersectionObserver' in window)) return; 2498 if (window.matchMedia && window.matchMedia('(prefers-reduced-motion: reduce)').matches) return; 2499 2500 var SELECTOR = [ 2501 '.mk-section-head', 2502 '.icon-card', '.card-2', '.card-3', '.enhanced-card', 2503 '.pain-card', '.problem', '.what-is-step', '.the-step', 2504 '.mk-review-carousel', '.mini-testimonial-card', '.alt-final-review', 2505 '.mk-guarantee', '.guarantee-card', '.mk-privacy-fact', 2506 '.block-10__card', '.cta-card', 2507 '.faq-accordion__section', 2508 '.mk-stats-band > div', 2509 '.vs-card', '.cost-stack', 2510 '.feature-block-video .row > [class*="col-lg-"]', 2511 '.mk-cta-band .col-lg-8' 2512 ].join(','); 2513 2514 function init() { 2515 var all = document.querySelectorAll(SELECTOR); 2516 var targets = []; 2517 var foldLine = window.innerHeight * 0.88; 2518 2519 for (var i = 0; i < all.length; i++) { 2520 /* Only elements strictly below the fold take part; anything already 2521 visible (or above the current scroll position) is left untouched, 2522 so there is no flash on load and late init cannot hide content. */ 2523 if (all[i].getBoundingClientRect().top > foldLine) { 2524 all[i].classList.add('mk-reveal'); 2525 targets.push(all[i]); 2526 } 2527 } 2528 if (!targets.length) return; 2529 2530 document.documentElement.classList.add('mk-reveal-on'); 2531 2532 var io = new IntersectionObserver(function (entries) { 2533 var batchIndex = 0; 2534 entries.forEach(function (entry) { 2535 if (!entry.isIntersecting) return; 2536 var el = entry.target; 2537 io.unobserve(el); 2538 2539 /* Elements entering in the same batch stagger by 60ms, capped 2540 so a fast scroll never queues long waits. */ 2541 var delay = Math.min(batchIndex, 7) * 60; 2542 batchIndex++; 2543 el.style.transitionDelay = delay + 'ms'; 2544 el.classList.add('mk-reveal--in'); 2545 2546 /* Cleanup: once the rise (and any checkmark draw) is done the 2547 element goes back to 100% stock styling. */ 2548 setTimeout(function () { 2549 el.classList.remove('mk-reveal', 'mk-reveal--in'); 2550 el.style.transitionDelay = ''; 2551 }, delay + 1500); 2552 }); 2553 }, { rootMargin: '0px 0px -8% 0px', threshold: 0.06 }); 2554 2555 for (var j = 0; j < targets.length; j++) io.observe(targets[j]); 2556 } 2557 2558 /* This script sits at the end of the body, so the DOM above is fully 2559 parsed; init synchronously (rAF can be deferred for seconds in 2560 background/throttled tabs, which would arm the reveals too late). */ 2561 if (document.readyState === 'loading') { 2562 document.addEventListener('DOMContentLoaded', init); 2563 } else { 2564 init(); 2565 } 2566})(); 2567</script>
vendor: 1 bytes, line 2567
2567
2568<script src="https://unpkg.com/tua-body-scroll-lock" crossorigin="anonymous"></script>
vendor: 1 bytes, line 2568
2568
2569<script> 2570 $(document).ready(function(){ 2571 2572 $('.stats_show').click(function(){ 2573 var statsDetailsDiv = $('.stats_details'); 2574 statsDetailsDiv.slideToggle(); 2575 }); 2576 2577 function showFaqAccordion(e) { 2578 var o = e.scrollHeight; 2579 e.setAttribute("style", "max-height: " + o + "px") 2580 } 2581 2582 if (document.querySelectorAll("#faq-accordion-block").length > 0) { 2583 2584 document.querySelector("#faq-accordion-block").addEventListener("click", function(e) { 2585 var o, c = document.querySelector(".faq-accordion__section--open"), 2586 t = e.target.closest(".faq-accordion__section"), 2587 n = t.querySelector(".faq-accordion__content"); 2588 t && t !== c ? c ? (o = function(e) { 2589 t.classList.add("faq-accordion__section--open"), showFaqAccordion(n), c.removeEventListener("transitionend", o) 2590 }, c.addEventListener("transitionend", o), c.querySelector(".faq-accordion__content").removeAttribute("style"), c.classList.remove("faq-accordion__section--open")) : (t.classList.add("faq-accordion__section--open"), showFaqAccordion(n)) : (t.querySelector(".faq-accordion__content").removeAttribute("style"), t.classList.remove("faq-accordion__section--open")) 2591 }) 2592 } 2593 2594 /* Hero Menu & Dropdown's JavaScript */ 2595 var showDropdown = function(e) { 2596 e.currentTarget.classList.add("hero-nav__item--show-dropdown"); 2597 }; 2598 2599 var hideDropdown = function(e) { 2600 e.currentTarget.classList.remove("hero-nav__item--show-dropdown"); 2601 }; 2602 2603 var toggleDropdown = function(e) { 2604 e.currentTarget.classList.toggle("hero-nav__item--show-dropdown"); 2605 }; 2606 2607 function setupDropdowns(mediaQuery) { 2608 document 2609 .querySelectorAll(".hero-nav__item--with-dropdown") 2610 .forEach(function(liElement) { 2611 if (mediaQuery.matches) { 2612 var liElclassList = liElement.classList; 2613 if ( 2614 !liElclassList.contains("hero-nav__item--dropdown-left") || 2615 !liElclassList.contains("hero-nav__item--dropdown-right") 2616 ) { 2617 var linkWidth = liElement.getBoundingClientRect().width; 2618 liElement.querySelector(".dropdown").style.transform = 2619 "translateX(calc(-15% + " + linkWidth / 2 + "px))"; 2620 } 2621 2622 liElement.addEventListener("mouseenter", showDropdown); 2623 liElement.addEventListener("mouseleave", hideDropdown); 2624 2625 /* If someone resize his browser to small screen */ 2626 var heroNavLink = liElement.querySelector(".hero-nav__link"); 2627 heroNavLink.removeEventListener("click", toggleDropdown); 2628 } else { 2629 /* if someone resize his browser to large screen */ 2630 liElement.removeEventListener("mouseenter", showDropdown); 2631 liElement.removeEventListener("mouseleave", hideDropdown); 2632 liElement.querySelector(".dropdown").style.transform = ""; 2633 2634 liElement.addEventListener("click", toggleDropdown); 2635 } 2636 }); 2637 } 2638 2639 var mediaQuery = window.matchMedia("(min-width: 992px)"); 2640 /* setup dropdowns on page load */ 2641 setupDropdowns(mediaQuery); 2642 mediaQuery.addListener(function(mediaQuery) { 2643 setupDropdowns(mediaQuery); 2644 2645 if (mediaQuery.matches) { 2646 var heroMenu = document.querySelector("#hero-menu"); 2647 heroMenu.style.height = ""; 2648 bodyScrollLock.unlock(heroMenu); 2649 } 2650 }); 2651 2652 /* Toggle Menu on mobile */ 2653 var heroMenu = document.querySelector("#hero-menu"); 2654 document.querySelector("[close-nav-menu]").onclick = function(e) { 2655 heroMenu.classList.toggle("ft-menu--js-show"); 2656 bodyScrollLock.unlock(heroMenu); 2657 }; 2658 2659 document.querySelector("[open-nav-menu]").onclick = function(e) { 2660 heroMenu.classList.toggle("ft-menu--js-show"); 2661 heroMenu.style.height = window.innerHeight + "px"; 2662 bodyScrollLock.lock(heroMenu); 2663 }; 2664 /* Close mobile Menu & scroll smoothly */ 2665 function closeMenuAndGoTo(query) { 2666 // Guard against bare href="#" placeholders (e.g. dropdown toggles)
2667 // which would make querySelector("#") throw a SyntaxError. 2668 if (!query || query === "#" || query.length < 2) { 2669 document.querySelector("#hero-menu").classList.toggle("ft-menu--js-show"); 2670 return; 2671 } 2672 document.querySelector("#hero-menu").classList.toggle("ft-menu--js-show"); 2673 setTimeout(() => { 2674 const element = document.querySelector(query); 2675 if (!element) return; 2676 window.scrollTo({ 2677 top: element.getBoundingClientRect().top, 2678 behavior: "smooth", 2679 }); 2680 }, 250); 2681 } 2682 2683 document 2684 .querySelector("#hero-menu") 2685 .querySelectorAll("[href*='#']:not(.dropdown-toggle)") 2686 .forEach(function(link) { 2687 link.onclick = function(event) { 2688 event.preventDefault(); 2689 closeMenuAndGoTo(link.getAttribute("href")); 2690 }; 2691 }); 2692 2693 /* Make the navigation sticky */ 2694 var nav = document.querySelector(".hero-nav"); 2695 window.onscroll = function(e) { 2696 var logoElement = document.querySelector("[change-src-onscroll]"); 2697 if (window.scrollY > nav.getBoundingClientRect().height) { 2698 if (!nav.classList.contains("hero-nav--is-sticky")) { 2699 window.logoSrc = logoElement.getAttribute("src"); 2700 logoElement.setAttribute( 2701 "src", 2702 logoElement.getAttribute("change-src-onscroll") 2703 ); 2704 logoElement.setAttribute("change-src-onscroll", logoSrc); 2705 } 2706 2707 nav.classList.add("hero-nav--is-sticky"); 2708 } else if (window.scrollY === 0) { 2709 if (nav.classList.contains("hero-nav--is-sticky")) { 2710 window.logoSrc = logoElement.getAttribute("src"); 2711 logoElement.setAttribute( 2712 "src", 2713 logoElement.getAttribute("change-src-onscroll") 2714 ); 2715 logoElement.setAttribute("change-src-onscroll", logoSrc); 2716 } 2717 2718 nav.classList.remove("hero-nav--is-sticky"); 2719 } 2720 }; 2721 2722 //Toggle template category nested menu 2723$(document).on('click', '.category-menu', function() { 2724 const $icon = $(this); 2725 const $nestedMenu = $('#' + $icon.data('menu-id')); 2726 $nestedMenu.slideToggle(); 2727 $icon.toggleClass('active'); 2728}); }); 2729</script>
2729 2730</html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.