Start your 30-day free trial.

No credit card required.
We'll email you an activation code.

Success! Check your email for the activation code.
To start using Enfacta, you'll need to download and install the app, then enter the activation code we've just emailed you.
  • Download and install the Enfacta app
  • Launch Enfacta once install is complete
  • Enter your activation code into the app
Can't find the code in your inbox?
Check your junk or spam folder. If it's not there,  ensure your email is entered correctly above and try again.
Oops! Something went wrong, please try again.

Need help getting started with Enfacta?

Watch the Quick Start Guide →

What happens after your trial?

  • Choose number of seats (save with 5+)
  • Monthly billing, or save with yearly plans
  • Cancel your subscription anytime

Your trial includes full Pro features.

View plans →

/** * Enfacta — Get Activation Code (Webflow) * * Sends the activation request directly to the Supabase `web-start` Edge Function. * Uses the current Supabase publishable key via `apikey` only. */ (() => { const API_URL = "https://fjhpjthyaytdsfylrggs.supabase.co/functions/v1/web-start"; const SUPABASE_PUBLISHABLE_KEY = "sb_publishable_jUNRt6jhUQvXtlss0aojiw_xm2EkrU3"; const PRODUCT = "enfacta"; function isValidEmail(email: string) { return /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email); } function normalizeTeamCode(code: string) { return String(code || "") .toUpperCase() .replace(/[^A-Z0-9]/g, ""); } function setBtn( btn: HTMLInputElement | HTMLButtonElement | null, label: string, disabled: boolean, ) { if (!btn) return; btn.disabled = !!disabled; const tag = btn.tagName.toLowerCase(); if (tag === "input") { (btn as HTMLInputElement).value = label; } else { btn.textContent = label; } } function showFail(fail: HTMLElement | null, msg: string) { if (!fail) return; fail.style.display = "block"; fail.textContent = msg; } function hideFail(fail: HTMLElement | null) { if (!fail) return; fail.style.display = "none"; fail.textContent = ""; } window.addEventListener("DOMContentLoaded", () => { const form = document.getElementById("wf-form-activation-form") as HTMLFormElement | null || document.getElementById("activation-form") as HTMLFormElement | null || document.querySelector('form[name="activation-form"]'); if (!form) { console.error( "Activation form not found. Ensure Webflow Form Name is 'activation-form'.", ); return; } const emailInput = form.querySelector('input[type="email"]') || form.querySelector('input[name="email"]') || form.querySelector('input[name="Email"]') || form.querySelector("#email"); const teamCodeInput = form.querySelector('input[name="team_code"]') || form.querySelector('input[name="Team_code"]') || form.querySelector('input[name="teamCode"]') || form.querySelector("#team_code"); const submitBtn = form.querySelector( 'input[type="submit"], button[type="submit"]', ); const formBlock = form.closest(".w-form"); const done = formBlock ? formBlock.querySelector(".w-form-done") : null; const fail = formBlock ? formBlock.querySelector(".w-form-fail") : null; if (done) done.style.display = "none"; if (fail) fail.style.display = "none"; if (form.dataset.activationBound === "1") return; form.dataset.activationBound = "1"; form.addEventListener( "submit", async (e) => { e.preventDefault(); e.stopPropagation(); if (e.stopImmediatePropagation) { e.stopImmediatePropagation(); } const email = String(emailInput?.value || "") .trim() .toLowerCase(); const teamCodeRaw = String( teamCodeInput?.value || "", ).trim(); const team_code = normalizeTeamCode(teamCodeRaw); if (!email || !isValidEmail(email)) { showFail( fail, "Please enter a valid email address.", ); return; } hideFail(fail); setBtn(submitBtn, "Sending…", true); try { const body: { email: string; product_id: typeof PRODUCT; team_code?: string; } = { email, product_id: PRODUCT, }; if (team_code) { body.team_code = team_code; } const res = await fetch(API_URL, { method: "POST", mode: "cors", headers: { "Content-Type": "application/json", "apikey": SUPABASE_PUBLISHABLE_KEY, }, body: JSON.stringify(body), }); const raw = await res.text().catch(() => ""); let payload: any = null; try { payload = raw ? JSON.parse(raw) : null; } catch { payload = { raw }; } if (!res.ok) { console.error( "web-start failed:", res.status, payload, ); const msg = (payload && (payload.message || payload.detail || payload.error)) || "Request failed"; throw new Error(msg); } if (done) { done.style.display = "block"; } hideFail(fail); form.style.display = "none"; } catch (err: any) { console.error( "Activation request error:", err, ); const msg = String( err?.message || err || "", ); const lower = msg.toLowerCase(); if ( lower.includes("team code") || lower.includes("seat") || lower.includes("trial") || lower.includes("subscription") || lower.includes("purchase") || lower.includes("renew") ) { showFail(fail, msg); } else { showFail( fail, "Something went wrong. Please try again in a moment.", ); } } finally { setBtn( submitBtn, "Get activation code", false, ); } }, true, ); }); })();