A context provider wrapping the blog and feature-page chrome, exposing an open() call to every CTA underneath it. The modal collects name, company, email and phone, carries the two consent checkboxes with their exact filed wording, posts to the same endpoint as the main marketing site, and shows a confirmation that changes depending on whether SMS consent was given.
Also called: demo modal · in-page form · book a demo popup
- 1DemoModalProvider holds the form state and renders the overlay; useDemoModal() gives any child an open() call.
- 2DemoButton takes an event name so every CTA is tracked separately by the analytics beacon.
- 3Email is validated client-side before submission with a plain-English message.
- 4The submission posts the same payload shape as the marketing site form, including the verbatim consent text and the page URL.
- 5A failure tells the reader the direct email address rather than swallowing the error.
Stated in the component: "'Book a demo' on a blog page opens the actual form right here — it must never dump the reader on the homepage." The consent detail is not cosmetic: it posts "with the SAME verbatim consent wording (that text is the A2P consent record; it has to match what we filed)." A second, subtly different consent string on the blog would break the messaging compliance record.
- CTAs on content pages navigated away from the content.
- A second form risks a second, non-matching consent wording.
See it on your own jobs
Twenty minutes, your numbers, no slide deck. We’ll build one of your real buildings in front of you and send you the estimate link at the end — yours to keep either way.
or keep browsing features →