1<!DOCTYPE html><html lang="en"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><link rel="icon" type="image/png" href="/fyp-logo.png"><!-- Apple Smart App Banner --><meta name="apple-itunes-app" content="app-id=6479432180"><!-- Primary --><title>Pricing | Fix Your Period</title><meta name="description" content="Fix Your Period is free to start. Premium unlocks your personalized protocol, Nicole's Period Pillars, 29+ symptom-specific protocols, and NicoleNow."><link rel="canonical" href="https://fixyourperiod.com/pricing"><!-- Open Graph --><meta property="og:title" content="Pricing | Fix Your Period"><meta property="og:description" content="Fix Your Period is free to start. Premium unlocks your personalized protocol, Nicole's Period Pillars, 29+ symptom-specific protocols, and NicoleNow."><meta property="og:image" content="https://fixyourperiod.com/og/pricing.png"><meta property="og:url" content="https://fixyourperiod.com/pricing"><meta property="og:type" content="website"><meta property="og:site_name" content="Fix Your Period"><!-- Twitter Card --><meta name="twitter:card" content="summary_large_image"><meta name="twitter:title" content="Pricing | Fix Your Period"><meta name="twitter:description" content="Fix Your Period is free to start. Premium unlocks your personalized protocol, Nicole's Period Pillars, 29+ symptom-specific protocols, and NicoleNow."><meta name="twitter:image" content="https://fixyourperiod.com/og/pricing.png"><!-- Google Analytics -->
vendor: 63 bytes, line 1
1<script async src="https://www.googletagmanager.com/gtag/js?id=
1G-V19QLKV3WP
vendor: 11 bytes, line 1
1"></script>
1<script> 2
vendor: 145 bytes, lines 2-5
2window.dataLayer = window.dataLayer || []; 3 function gtag(){dataLayer.push(arguments);} 4 gtag('js', new Date()); 5 gtag('config', '
5G-V19QLKV3WP
vendor: 8 bytes, lines 5-6
5'); 6
6</script>
6<!-- Meta Pixel -->
6<script>
vendor: 425 bytes, lines 6-12
6 7 !function(f,b,e,v,n,t,s){if(f.fbq)return;n=f.fbq=function(){n.callMethod? 8 n.callMethod.apply(n,arguments):n.queue.push(arguments)};if(!f._fbq)f._fbq=n; 9 n.push=n;n.loaded=!0;n.version='2.0';n.queue=[];t=b.createElement(e);t.async=!0; 10 t.src=v;s=b.getElementsByTagName(e)[0];s.parentNode.insertBefore(t,s)}(window, 11 document,'script','//connect.facebook.net/en_US/fbevents.js'); 12 fbq('init', '
12899562896795772
vendor: 40 bytes, lines 12-14
12'); 13 fbq('track', 'PageView'); 14
14</script>
14<link rel="stylesheet" href="/_astro/BaseLayout.AxOZyoKl.css"></head> <body> <noscript><img height="1" width="1" style="display:none" src="https://www.facebook.com/tr?id=899562896795772&ev=PageView&noscript=1"></noscript> <header class="sticky top-0 z-50 bg-white/95 backdrop-blur-sm border-b border-pink-100 shadow-sm"> <div class="px-4 sm:px-6 h-16 flex items-center justify-between gap-4"> <!-- Logo. Styled to match the in-app Header.tsx exactly: flush left, 15 object-contain on the logo (no rounded crop), rose-600 brand text 16 in text-base/sm:text-lg, always visible (not hidden on mobile). 17 This keeps the visual transition between the marketing site and 18 the app seamless for returning users. --> <a href="/" class="flex items-center gap-2 hover:opacity-80 transition-opacity shrink-0"> <img src="/fyp-logo.png" alt="Fix Your Period" class="w-8 h-8 object-contain flex-shrink-0"> <span class="text-base sm:text-lg font-bold text-rose-600">Fix Your Period</span> </a> <!-- Nav â hidden on mobile, shown on sm+ --> <nav class="hidden sm:flex items-center gap-1 text-sm font-medium text-gray-600"> <a href="/features" class="px-3 py-2 rounded-lg hover:text-rose-600 hover:bg-rose-50 transition-colors"> 19Features 20</a> <a href="/pricing" class="px-3 py-2 rounded-lg hover:text-rose-600 hover:bg-rose-50 transition-colors"> 21Pricing 22</a> <a href="/articles" class="px-3 py-2 rounded-lg hover:text-rose-600 hover:bg-rose-50 transition-colors"> 23Articles 24</a> <a href="/podcasts" class="px-3 py-2 rounded-lg hover:text-rose-600 hover:bg-rose-50 transition-colors"> 25Podcast 26</a> <a href="/book" class="px-3 py-2 rounded-lg hover:text-rose-600 hover:bg-rose-50 transition-colors"> 27Book 28</a> <a href="/about" class="px-3 py-2 rounded-lg hover:text-rose-600 hover:bg-rose-50 transition-colors"> 29About 30</a> </nav> <!-- Right side --> <div class="flex items-center gap-2 shrink-0"> <!-- Log in / Dashboard â shown/hidden by JS based on auth state --> <a id="header-login" href="https://fixyourperiod.app/login" class="text-sm font-medium text-gray-500 hover:text-rose-600 transition-colors"> 31Log in 32</a> <a id="header-dashboard" href="https://fixyourperiod.app/dashboard" class="text-sm font-medium text-gray-500 hover:text-rose-600 transition-colors hidden"> 33Your Dashboard 34</a> <!-- CTA â hidden on mobile to give room to hamburger --> <a id="header-quiz" href="https://fixyourperiod.app/quiz" class="hidden sm:inline-flex bg-gradient-to-r from-rose-500 to-pink-500 hover:from-rose-600 hover:to-pink-600 text-white font-semibold text-sm px-4 py-2 rounded-xl shadow-sm hover:shadow-md transition-all whitespace-nowrap"> 35Take the Assessment â 36</a> <!-- Hamburger â mobile only --> <button id="mobile-menu-btn" class="sm:hidden flex items-center justify-center w-9 h-9 rounded-lg text-gray-600 hover:text-rose-600 hover:bg-rose-50 transition-colors" aria-label="Open menu" aria-expanded="false"> <svg id="hamburger-icon" xmlns="http://www.w3.org/2000/svg" class="w-5 h-5" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"> <path stroke-linecap="round" stroke-linejoin="round" d="M4 6h16M4 12h16M4 18h16"></path> </svg> <svg id="close-icon" xmlns="http://www.w3.org/2000/svg" class="w-5 h-5 hidden" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"> <path stroke-linecap="round" stroke-linejoin="round" d="M6 18L18 6M6 6l12 12"></path> </svg> </button> </div> </div> <!-- Mobile dropdown menu --> <div id="mobile-menu" class="hidden sm:hidden border-t border-pink-100 bg-white/98 backdrop-blur-sm"> <nav class="max-w-5xl mx-auto px-4 py-3 flex flex-col gap-1 text-sm font-medium text-gray-600"> <a href="/features" class="px-3 py-2.5 rounded-lg hover:text-rose-600 hover:bg-rose-50 transition-colors">Features</a> <a href="/pricing" class="px-3 py-2.5 rounded-lg hover:text-rose-600 hover:bg-rose-50 transition-colors">Pricing</a> <a href="/articles" class="px-3 py-2.5 rounded-lg hover:text-rose-600 hover:bg-rose-50 transition-colors">Articles</a> <a href="/podcasts" class="px-3 py-2.5 rounded-lg hover:text-rose-600 hover:bg-rose-50 transition-colors">Podcast</a> <a href="/book" class="px-3 py-2.5 rounded-lg hover:text-rose-600 hover:bg-rose-50 transition-colors">
36Book</a> <a href="/about" class="px-3 py-2.5 rounded-lg hover:text-rose-600 hover:bg-rose-50 transition-colors">About</a> <div class="pt-2 pb-1"> <a id="mobile-menu-quiz" href="https://fixyourperiod.app/quiz" class="block w-full text-center bg-gradient-to-r from-rose-500 to-pink-500 hover:from-rose-600 hover:to-pink-600 text-white font-semibold px-4 py-3 rounded-xl shadow-sm transition-all"> 37Take the Assessment â 38</a> </div> </nav> </div> </header>
38<script type="module">const a=document.cookie.split(";").some(e=>e.trim().startsWith("fyp_logged_in=1")),i=document.getElementById("header-login"),t=document.getElementById("header-quiz"),n=document.getElementById("mobile-menu-quiz");if(a){i&&i.classList.add("hidden");const e="https://fixyourperiod.app/dashboard",o="Your Dashboard";t&&(t.textContent=o,t.setAttribute("href",e)),n&&(n.textContent=o,n.setAttribute("href",e))}const d=document.getElementById("mobile-menu-btn"),s=document.getElementById("mobile-menu"),c=document.getElementById("hamburger-icon"),l=document.getElementById("close-icon");d?.addEventListener("click",()=>{const e=s?.classList.toggle("hidden")===!1;d.setAttribute("aria-expanded",String(e)),c?.classList.toggle("hidden",e),l?.classList.toggle("hidden",!e)});s?.querySelectorAll("a").forEach(e=>{e.addEventListener("click",()=>{s.classList.add("hidden"),d?.setAttribute("aria-expanded","false"),c?.classList.remove("hidden"),l?.classList.add("hidden")})});</script>
38 <div class="bg-gradient-to-b from-rose-50 to-white border-b border-rose-100"> <div class="max-w-3xl mx-auto px-4 py-16 text-center"> <p class="text-xs font-bold text-rose-500 uppercase tracking-widest mb-3">Pricing</p> <h1 class="text-3xl sm:text-4xl font-extrabold text-gray-900 leading-tight mb-4"> 39Free to start.<br> <span class="text-rose-500">Upgrade when you're ready.</span> </h1> <p class="text-base text-gray-500 max-w-xl mx-auto leading-relaxed"> 40Take Nicole's free Hormone Health Assessment, see your personalized results, and track your cycle â all at no cost. Upgrade to Premium to unlock your full protocol, expert education, and NicoleNow. 41</p> </div> </div> <div class="max-w-4xl mx-auto px-4 py-16"> <div class="grid grid-cols-1 sm:grid-cols-2 gap-6 mb-16"> <!-- Free --> <div class="bg-white border border-gray-200 rounded-2xl p-8 flex flex-col shadow-sm"> <div class="mb-6"> <span class="inline-block bg-gray-100 text-gray-600 text-xs font-bold uppercase tracking-widest px-3 py-1.5 rounded-full mb-4">Free</span> <div class="flex items-end gap-1 mb-1"> <span class="text-4xl font-extrabold text-gray-900">$0</span> </div> <p class="text-sm text-gray-400">Free forever. No credit card required.</p> </div> <ul class="space-y-3 flex-1 mb-8"> <li class="flex items-start gap-3"> <span class="w-5 h-5 rounded-full bg-gray-100 flex items-center justify-center shrink-0 mt-0.5"> <svg class="w-3 h-3 text-gray-500" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="3" d="M5 13l4 4L19 7"></path></svg> </span> <span class="text-sm text-gray-600">Nicole's free Hormone Health Assessment</span> </li><li class="flex items-start gap-3"> <span class="w-5 h-5 rounded-full bg-gray-100 flex items-center justify-center shrink-0 mt-0.5"> <svg class="w-3 h-3 text-gray-500" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="3" d="M5 13l4 4L19 7"></path></svg> </span> <span class="text-sm text-gray-600">Cycle & symptom tracking</span> </li><li class="flex items-start gap-3"> <span class="w-5 h-5 rounded-full bg-gray-100 flex items-center justify-center shrink-0 mt-0.5"> <svg class="w-3 h-3 text-gray-500" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="3" d="M5 13l4 4L19 7"></path></svg> </span> <span class="text-sm text-gray-600">Personalized period score & results</span> </li><li class="flex items-start gap-3"> <span class="w-5 h-5 rounded-full bg-gray-100 flex items-center justify-center shrink-0 mt-0.5"> <svg class="w-3 h-3 text-gray-500" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="3" d="M5 13l4 4L19 7"></path></svg> </span> <span class="text-sm text-gray-600">Symptom & condition insights</span> </li><li class="flex items-start gap-3"> <span class="w-5 h-5 rounded-full bg-gray-100 flex items-center justify-center shrink-0 mt-0.5"> <svg class="w-3 h-3 text-gray-500" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="3" d="M5 13l4 4L19 7"></path></svg> </span> <span class="text-sm text-gray-600">Access to Nicole's resource library</span> </li> </ul> <a href="https://fixyourperiod.app/quiz" class="block text-center border border-rose-200 text-rose-600 hover:bg-rose-50 font-semibold px-6 py-3 rounded-xl text-sm transition-all"> 42Start with the Free Assessment â 43</a> </div> <!-- Premium --> <div class="bg-gradient-to-br from-rose-500 to-pink-500 rounded-2xl p-8 flex flex-col shadow-lg text-white relative overflow-hidden"> <div class="absolute top-0 right-0 w-48 h-48 bg-white/10 rounded-full blur-2xl -translate-y-1/2 translate-x-1/4" aria-hidden="true"></div> <div class="mb-6 relative"> <span class="inline-block bg-white/20 text-white text-xs font-bold uppercase tracking-widest px-3 py-1.5 rounded-full mb-4">Premium</span> <!-- Billing toggle --> <div class="flex items-center gap-3 mb-4" id="billing-toggle"> <button id="btn-monthly" onclick="setBilling('monthly')" class="text-xs font-bold px-3 py-1.5 rounded-lg bg-white/20 text-white transition-all"> 44Monthly 45</button> <button id="btn-annual" onclick="setBilling('annual')" class="text-xs font-bold px-3 py-1.5 rounded-lg bg-white text-rose-600 transition-all"> 46Annual 47<span class="ml-1 bg-rose-100 text-rose-500 text-[10px] font-bold px-1.5 py-0.5 rounded-full">Save 58%</span> </button> </div> <div id="price-monthly" class="hidden"> <div class="flex items-end gap-1 mb-1"> <span class="text-4xl font-extrabold">$9.99</span> <span class="text-rose-200 text-sm mb-1.5">/ month</span> </div> <p class="text-rose-100 text-sm">Billed monthly. Cancel anytime.</p> </div> <div id="price-annual"> <div class="flex items-end gap-1 mb-1"> <span class="text-4xl font-extrabold">$4.17</span> <span class="text-rose-200 text-sm mb-1.5">/ month</span> </div> <p class="text-rose-100 text-sm">$49.99 billed annually. Cancel anytime.</p> </div> </div> <ul class="space-y-3 flex-1 mb-8 relative"> <li class="flex items-start gap-3"> <span class="w-5 h-5 rounded-full bg-white/20 flex items-center justify-center shrink-0 mt-0.5"> <svg class="w-3 h-3 text-white" fill="none" stroke="currentColor" viewBox="0 0 24 24">
47<path stroke-linecap="round" stroke-linejoin="round" stroke-width="3" d="M5 13l4 4L19 7"></path></svg> </span> <span class="text-sm text-rose-100">Everything in Free</span> </li><li class="flex items-start gap-3"> <span class="w-5 h-5 rounded-full bg-white/20 flex items-center justify-center shrink-0 mt-0.5"> <svg class="w-3 h-3 text-white" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="3" d="M5 13l4 4L19 7"></path></svg> </span> <span class="text-sm text-white font-medium">Personalized Protocol â your step-by-step action plan</span> </li><li class="flex items-start gap-3"> <span class="w-5 h-5 rounded-full bg-white/20 flex items-center justify-center shrink-0 mt-0.5"> <svg class="w-3 h-3 text-white" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="3" d="M5 13l4 4L19 7"></path></svg> </span> <span class="text-sm text-white font-medium">Nicole's Period Pillars â 6-part video education series</span> </li><li class="flex items-start gap-3"> <span class="w-5 h-5 rounded-full bg-white/20 flex items-center justify-center shrink-0 mt-0.5"> <svg class="w-3 h-3 text-white" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="3" d="M5 13l4 4L19 7"></path></svg> </span> <span class="text-sm text-white font-medium">29+ symptom-specific protocols (PMOS (formerly PCOS), endo, low progesterone & more)</span> </li><li class="flex items-start gap-3"> <span class="w-5 h-5 rounded-full bg-white/20 flex items-center justify-center shrink-0 mt-0.5"> <svg class="w-3 h-3 text-white" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="3" d="M5 13l4 4L19 7"></path></svg> </span> <span class="text-sm text-white font-medium">NicoleNow â AI trained on Nicole's complete methodology</span> </li> </ul> <a href="https://fixyourperiod.app/quiz" class="relative block text-center bg-white text-rose-600 hover:bg-rose-50 font-bold px-6 py-3 rounded-xl text-sm transition-all shadow-sm"> 48Start with the Free Assessment â 49</a> <p class="text-center text-rose-200 text-xs mt-3">Take the assessment first â subscribe inside the app</p> </div> </div> <!-- ââ WHAT'S INCLUDED DETAIL âââââââââââââââââââââââââââââââââââââââââââ --> <div class="mb-16 bg-gray-50 rounded-2xl p-8 border border-gray-100"> <h2 class="text-lg font-extrabold text-gray-900 mb-6 text-center">What's included in Premium</h2> <div class="grid grid-cols-1 sm:grid-cols-2 gap-5"> <div class="flex gap-4"> <span class="w-10 h-10 rounded-xl flex items-center justify-center shrink-0 bg-rose-50 text-rose-500 "><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect width="8" height="4" x="8" y="2" rx="1" ry="1" /><path d="M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2" /><path d="M12 11h4" /><path d="M12 16h4" /><path d="M8 11h.01" /><path d="M8 16h.01" /></svg></span> <div> <p class="text-sm font-bold text-gray-900 mb-1">Personalized Protocol</p> <p class="text-xs text-gray-500 leading-relaxed">Built from your assessment results â a targeted, step-by-step starting point for addressing the specific hormonal imbalances driving your symptoms.</p> </div> </div><div class="flex gap-4"> <span class="w-10 h-10 rounded-xl flex items-center justify-center shrink-0 bg-rose-50 text-rose-500 "><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21.42 10.922a1 1 0 0 0-.019-1.838L12.83 5.18a2 2 0 0 0-1.66 0L2.6 9.08a1 1 0 0 0 0 1.832l8.57 3.908a2 2 0 0 0 1.66 0z" /><path d="M22 10v6" /><path d="M6 12.5V16a6 3 0 0 0 12 0v-3.5" /></svg></span> <div> <p class="text-sm font-bold text-gray-900 mb-1">Nicole's Period Pillars</p> <p class="text-xs text-gray-500 leading-relaxed">Nicole's six-part video education series covering nutrition, blood sugar, gut health, stress, liver health, and cycle literacy.</p> </div> </div><div class="flex gap-4"> <span class="w-10 h-10 rounded-xl flex items-center justify-center shrink-0 bg-rose-50 text-rose-500 "><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m6 14 1.5-2.9A2 2 0 0 1 9.24 10H20a2 2 0 0 1 1.94 2.5l-1.54 6a2 2 0 0 1-1.95 1.5H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h3.9a2 2 0 0 1 1.69.9l.81 1.2a2 2 0 0 0 1.67.9H18a2 2 0 0 1 2 2v2" /></svg></span> <div> <p class="text-sm font-bold text-gray-900 mb-1">29+ Symptom Protocols</p> <p class="text-xs text-gray-500 leading-relaxed">Step-by-step protocols for every major hormonal condition â PMOS (formerly PCOS), endometriosis, low progesterone, perimenopause, heavy periods, and more.</p> </div> </div><div class="flex gap-4"> <span class="w-10 h-10 rounded-xl flex items-center justify-center shrink-0 bg-rose-50 text-rose-500 "><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 8V4H8" /><rect width="16" height="12" x="4" y="8" rx="2" /><path d="M2 14h2" /><path d="M20 14h2" /><path d="M15 13v2" /><path d="M9 13v2" /></svg></span> <div> <p class="text-sm font-bold text-gray-900 mb-1">NicoleNow</p> <p class="text-xs text-gray-500 leading-relaxed">An AI trained exclusively on Nicole's methodology. Ask anything about your symptoms, assessment results, or protocol â available any time.</p> </div> </div> </div> </div> <!-- ââ FAQ ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ --> <div class="mb-16"> <h2 class="text-2xl font-extrabold text-gray-900 mb-6 text-center">Questions</h2> <div class="divide-y divide-gray-100 border border-gray-100 rounded-2xl overflow-hidden"> <details class="group"> <summary class="flex items-center justify-between gap-4 px-5 py-4 cursor-pointer list-none hover:bg-rose-50/50 transition-colors"> <span class="text-sm font-semibold text-gray-800">
49Do I need to subscribe to use Fix Your Period?</span> <svg class="w-4 h-4 text-rose-400 shrink-0 transition-transform group-open:rotate-180" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2.5" d="M19 9l-7 7-7-7"></path></svg> </summary> <div class="px-5 pb-4 text-sm text-gray-600 leading-relaxed">No. The app is free to download and use. Nicole's Hormone Health Assessment, your personalized results, and cycle & symptom tracking are all included at no cost. A Premium subscription unlocks your full personalized protocol, the Period Pillars video series, 29+ symptom-specific protocols, and NicoleNow.</div> </details><details class="group"> <summary class="flex items-center justify-between gap-4 px-5 py-4 cursor-pointer list-none hover:bg-rose-50/50 transition-colors"> <span class="text-sm font-semibold text-gray-800">Why start with the assessment?</span> <svg class="w-4 h-4 text-rose-400 shrink-0 transition-transform group-open:rotate-180" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2.5" d="M19 9l-7 7-7-7"></path></svg> </summary> <div class="px-5 pb-4 text-sm text-gray-600 leading-relaxed">The assessment is how Fix Your Period personalizes everything in the app to you. Your results determine your protocol, inform NicoleNow's responses, and shape the recommendations you receive. Starting with the assessment means you get the full experience from day one â not a generic dashboard.</div> </details><details class="group"> <summary class="flex items-center justify-between gap-4 px-5 py-4 cursor-pointer list-none hover:bg-rose-50/50 transition-colors"> <span class="text-sm font-semibold text-gray-800">Can I cancel anytime?</span> <svg class="w-4 h-4 text-rose-400 shrink-0 transition-transform group-open:rotate-180" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2.5" d="M19 9l-7 7-7-7"></path></svg> </summary> <div class="px-5 pb-4 text-sm text-gray-600 leading-relaxed">Yes. You can cancel your Premium subscription at any time. You'll keep access until the end of your current billing period.</div> </details><details class="group"> <summary class="flex items-center justify-between gap-4 px-5 py-4 cursor-pointer list-none hover:bg-rose-50/50 transition-colors"> <span class="text-sm font-semibold text-gray-800">Is the annual plan better value?</span> <svg class="w-4 h-4 text-rose-400 shrink-0 transition-transform group-open:rotate-180" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2.5" d="M19 9l-7 7-7-7"></path></svg> </summary> <div class="px-5 pb-4 text-sm text-gray-600 leading-relaxed">The annual plan works out to $4.17 per month â compared to $9.99 per month on the monthly plan. That's a saving of 58% over the year.</div> </details> </div> </div> <!-- ââ FINAL CTA ââââââââââââââââââââââââââââââââââââââââââââââââââââââââ --> <div class="text-center bg-gradient-to-r from-rose-500 to-pink-500 rounded-2xl p-10 shadow-md"> <h2 class="text-2xl font-extrabold text-white mb-3">Start with the free Hormone Health Assessment</h2> <p class="text-rose-100 text-sm leading-relaxed mb-6 max-w-md mx-auto"> 505 minutes. Personalized results. No credit card required. See exactly what's driving your symptoms before you decide anything. 51</p> <a href="https://fixyourperiod.app/quiz" class="inline-flex items-center gap-2 bg-white text-rose-600 hover:bg-rose-50 font-bold px-7 py-3 rounded-xl shadow-sm hover:shadow-md transition-all text-sm"> 52Take the Free Assessment â 53</a> </div> </div> <footer class="bg-gray-50 border-t border-pink-100 mt-24"> <div class="max-w-5xl mx-auto px-4 py-12"> <div class="flex flex-col sm:flex-row justify-between items-start gap-8"> <!-- Brand --> <div class="max-w-xs"> <a href="/" class="flex items-center gap-2.5 mb-3"> <img src="/fyp-logo.png" alt="Fix Your Period" class="h-8 w-8 rounded-full"> <span class="font-bold text-gray-900">Fix Your Period</span> </a> <p class="text-sm text-gray-500 leading-relaxed"> 54Evidence-based hormonal health guidance by Nicole Jardim â Certified Women's Health Coach and author of <em>Fix Your Period</em>. 55</p> </div> <!-- Links --> <div class="flex flex-wrap gap-12 text-sm"> <div class="space-y-2"> <p class="font-semibold text-gray-700 mb-3">Learn</p> <a href="/articles" class="block text-gray-500 hover:text-rose-600 transition-colors">Articles</a> <a href="/podcasts" class="block text-gray-500 hover:text-rose-600 transition-colors">Podcast</a> <a href="/about" class="block text-gray-500 hover:text-rose-600 transition-colors">About Nicole</a> </div> <div class="space-y-2"> <p class="font-semibold text-gray-700 mb-3">App</p> <a href="https://fixyourperiod.app/quiz" class="block text-gray-500 hover:text-rose-600 transition-colors">Free Assessment</a> <a href="https://fixyourperiod.app" class="block text-gray-500 hover:text-rose-600 transition-colors">Sign In</a> <a href="https://apps.apple.com/app/id6479432180" target="_blank" rel="noopener" aria-label="Download Fix Your Period on the App Store" class="inline-flex items-center gap-1.5 text-gray-500 hover:text-rose-600 transition-colors block"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512" fill="currentColor" aria-hidden="true" class="w-3.5 h-3.5"> <path d="M318.7 268.7c-.2-36.7 16.4-64.4 50-84.8-18.8-26.9-47.2-41.7-84.7-44.6-35.5-2.8-74.3 20.7-88.5 20.7-15 0-49.4-19.7-76.4-19.7C63.3 141.2 4 184.8 4 273.5q0 39.3 14.4 81.2c12.8 36.7 59 126.7 107.2 125.2 25.2-.6 43-17.9 75.8-17.9 31.8 0 48.3 17.9 76.4 17.9 48.6-.7 90.4-82.5 102.6-119.3-65.2-30.7-61.7-90-61.7-91.9zm-56.6-164.2c27.3-32.4 24.8-61.9 24-72.5-24.1 1.4-52 16.4-67.9 34.9-17.5 19.8-27.8 44.3-25.6 71.9 26.1 2 49.9-11.4 69.5-34.3z"></path> </svg> <span>Download for iPhone</span> </a> <a href="https://play.google.com/store/apps/details?id=com.nicolejardim.fixyourperiod" target="_blank" rel="noopener" aria-label="Download Fix Your Period on Google Play" class="inline-flex items-center gap-1.5 text-gray-500 hover:text-rose-600 transition-colors block"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" class="w-3.5 h-3.5"> <path d="M5 3.5v17c0 .77.83 1.25 1.5.87l14.5-8.5a1 1 0 000-1.74L6.5 2.63A1 1 0 005 3.5z"></path> </svg> <span>Download for Android</span> </a> </div> <div class="space-y-2"> <p class="font-semibold text-gray-700 mb-3">Privacy & Terms</p> <a href="/privacy" class="block text-gray-500 hover:text-rose-600 transition-colors">Privacy Policy</a> <a href="/terms" class="block text-gray-500 hover:text-rose-600 transition-colors">Terms of Service</a> </div> </div> </div> <div class="border-t border-gray-200 mt-10 pt-6 flex flex-col sm:flex-row justify-between items-center gap-3 text-xs text-gray-400"> <p>© 2026 Fix Your Period. All rights reserved.</p> <p class="text-center">For educational purposes only. Not medical advice.</p> </div> </div> </footer> <!-- ââ CUSTOMER SUPPORT CHAT WIDGET âââââââââââââââââââââââââââââââââââââ --> <div id="fyp-support-widget"> <!-- Bubble trigger button --> <button id="fyp-chat-btn" aria-label="Open customer support chat" onclick="fypC
55hatToggle()"> <svg id="fyp-chat-icon" xmlns="http://www.w3.org/2000/svg" width="26" height="26" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"></path></svg> <svg id="fyp-close-icon" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" style="display:none"><line x1="18" y1="6" x2="6" y2="18"></line><line x1="6" y1="6" x2="18" y2="18"></line></svg> </button> <!-- Chat panel --> <div id="fyp-chat-panel" role="dialog" aria-label="Customer Support Chat" style="display:none"> <div id="fyp-chat-header"> <div style="display:flex;align-items:center;gap:10px;"> <div style="width:36px;height:36px;background:#fff2;border-radius:50%;display:flex;align-items:center;justify-content:center;"> <svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"></path></svg> </div> <div> <div style="font-weight:700;font-size:15px;">Customer Support</div> <div style="font-size:11px;opacity:0.85;">Fix Your Period</div> </div> </div> <button onclick="fypChatToggle()" aria-label="Close chat" style="background:none;border:none;color:white;cursor:pointer;padding:4px;"> <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><line x1="18" y1="6" x2="6" y2="18"></line><line x1="6" y1="6" x2="18" y2="18"></line></svg> </button> </div> <div id="fyp-chat-messages"></div> <div id="fyp-chat-input-area"> <textarea id="fyp-chat-input" placeholder="Ask us anything..." rows="1" onkeydown="fypChatKeydown(event)"></textarea> <button id="fyp-send-btn" onclick="fypChatSend()" aria-label="Send message"> <svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><line x1="22" y1="2" x2="11" y2="13"></line><polygon points="22 2 15 22 11 13 2 9 22 2"></polygon></svg> </button> </div> <p id="fyp-chat-privacy">Conversations are stored to help us improve support.</p> </div> </div>
55<script> 56 var fypMessages = []; 57 var fypOpen = false; 58 var fypGreeted = false; 59 60 function fypChatToggle() { 61 fypOpen = !fypOpen; 62 var panel = document.getElementById('fyp-chat-panel'); 63 var chatIcon = document.getElementById('fyp-chat-icon'); 64 var closeIcon = document.getElementById('fyp-close-icon'); 65 if (fypOpen) { 66 panel.style.display = 'flex'; 67 chatIcon.style.display = 'none'; 68 closeIcon.style.display = 'block'; 69 if (!fypGreeted) { 70 fypGreeted = true; 71 fypAppendMessage('assistant', "Hi there! ð I'm the Fix Your Period Customer Support assistant. I can help you learn about the app, our features, pricing, and how to get started. What would you like to know?"); 72 } 73 setTimeout(function() { document.getElementById('fyp-chat-input').focus(); }, 50); 74 } else { 75 panel.style.display = 'none'; 76 chatIcon.style.display = 'block'; 77 closeIcon.style.display = 'none'; 78 } 79 } 80 81 function fypAppendMessage(role, text) { 82 var messages = document.getElementById('fyp-chat-messages'); 83 var div = document.createElement('div'); 84 div.className = 'fyp-msg fyp-msg-' + role; 85 div.textContent = text; 86 messages.appendChild(div); 87 messages.scrollTop = messages.scrollHeight; 88 return div; 89 } 90 91 function fypShowTyping() { 92 var messages = document.getElementById('fyp-chat-messages'); 93 var div = document.createElement('div'); 94 div.className = 'fyp-typing'; 95 div.id = 'fyp-typing-indicator'; 96 div.innerHTML = '<span></span><span></span><span></span>'; 97 messages.appendChild(div); 98 messages.scrollTop = messages.scrollHeight; 99 } 100 101 function fypHideTyping() { 102 var el = document.getElementById('fyp-typing-indicator'); 103 if (el) el.remove(); 104 } 105 106 function fypChatKeydown(e) { 107 if (e.key === 'Enter' && !e.shiftKey) { 108 e.preventDefault(); 109 fypChatSend(); 110 } 111 } 112 113 async function fypChatSend() { 114 var input = document.getElementById('fyp-chat-input'); 115 var sendBtn = document.getElementById('fyp-send-btn'); 116 var text = input.value.trim(); 117 if (!text) return; 118 119 input.value = ''; 120 input.style.height = 'auto'; 121 sendBtn.disabled = true; 122 123 fypAppendMessage('user', text); 124 fypMessages.push({ role: 'user', content: text }); 125 126 fypShowTyping(); 127 128 try { 129 // Include any prior session token so the server groups multi-turn 130 // conversations into one session in the admin Chatbot view. The 131 // server returns a fresh token if none was sent (or the prior one 132 // expired); we store it for the next message. 133 var savedToken = null; 134 try { savedToken = localStorage.getItem('fyp_widget_session_token'); } catch (e) {} 135 var response = await fetch('https://fixyourperiod.app/api/support-chat', { 136 method: 'POST', 137 headers: { 'Content-Type': 'application/json' }, 138 body: JSON.stringify({ 139 messages: fypMessages, 140 sessionToken: savedToken || undefined 141 }) 142 }); 143 144 fypHideTyping(); 145 146 if (!response.ok) { 147 var err = await response.json().catch(function() { return {}; }); 148 if (response.status === 429) { 149 fypAppendMessage('assistant', "You've reached the message limit for this hour. Please try again later or email us at [email protected]."); 150 } else { 151 fypAppendMessage('assistant', "Sorry, something went wrong. Please try again or email [email protected]."); 152 } 153 sendBtn.disabled = false; 154 return; 155 } 156 157 var data = await response.json(); 158 var reply = data.reply || "Sorry, I didn't get a response. Please try again."; 159 fypMessages.push({ role: 'assistant', content: reply }); 160 fypAppendMessage('assistant', reply); 161 if (data.sessionToken) { 162 try { localStorage.setItem('fyp_widget_session_token', data.sessionToken); } catch (e) {} 163 } 164 } catch (e) { 165 fypHideTyping(); 166 fypAppendMessage('assistant', "Sorry, something went wrong. Please check your connection or email us at [email protected]."); 167 } 168 169 sendBtn.disabled = false;
170 input.focus(); 171 } 172 </script>
172
172<script> 173 (function() { 174 var UTM_KEYS = ['utm_source','utm_medium','utm_campaign','utm_content','utm_term']; 175 var COOKIE_NAME = 'fyp_first_touch'; 176 var MAX_AGE_SEC = 30 * 24 * 60 * 60; 177 var SELF_HOSTS = /(?:^|\.)fixyourperiod\.com$|(?:^|\.)fixyourperiod\.app$|(?:^|\.)fixmyperiod\.com$|(?:^|\.)nicolejardim\.(?:com|app)$/; 178 179 function readCookie() { 180 var m = document.cookie.match(new RegExp('(?:^|;\\s*)' + COOKIE_NAME + '=([^;]+)')); 181 if (!m) return null; 182 try { return JSON.parse(decodeURIComponent(m[1])); } catch (e) { return null; } 183 } 184 185 function writeCookie(obj) { 186 document.cookie = COOKIE_NAME + '=' + encodeURIComponent(JSON.stringify(obj)) 187 + '; domain=.fixyourperiod.com' 188 + '; path=/' 189 + '; max-age=' + MAX_AGE_SEC 190 + '; SameSite=Lax'; 191 } 192 193 function externalReferrerHost() { 194 if (!document.referrer) return null; 195 try { 196 var h = new URL(document.referrer).hostname.toLowerCase(); 197 return SELF_HOSTS.test(h) ? null : h; 198 } catch (e) { return null; } 199 } 200 201 try { 202 var params = new URLSearchParams(window.location.search); 203 var touch = readCookie() || {}; 204 205 // 1. First-touch capture â only write if this is truly the first visit 206 // (no cookie yet). Otherwise the original source is preserved. 207 if (!touch || Object.keys(touch).length === 0) { 208 touch = {}; 209 UTM_KEYS.forEach(function(k){ 210 var v = params.get(k); 211 if (v) touch[k] = v; 212 }); 213 var ext = externalReferrerHost(); 214 if (ext) touch.ext_referrer = ext; 215 touch.marketing_landing_page = window.location.origin + window.location.pathname; 216 writeCookie(touch); 217 } 218 219 // 2. Rewrite outbound app links to carry the first-touch data forward. 220 // Runs on every page load so late CTAs also benefit. 221 var carry = {}; 222 UTM_KEYS.forEach(function(k){ if (touch[k]) carry[k] = touch[k]; }); 223 if (touch.ext_referrer) carry.fyp_ext_referrer = touch.ext_referrer; 224 if (touch.marketing_landing_page) carry.fyp_marketing_page = touch.marketing_landing_page; 225 226 if (Object.keys(carry).length > 0) { 227 var anchors = document.querySelectorAll('a[href*="fixyourperiod.app"]'); 228 anchors.forEach(function(a){ 229 try { 230 var href = a.getAttribute('href'); 231 if (!href) return; 232 var url = new URL(href, window.location.origin); 233 if (!url.hostname.endsWith('fixyourperiod.app')) return; 234 Object.keys(carry).forEach(function(k){ 235 if (!url.searchParams.has(k)) url.searchParams.set(k, carry[k]); 236 }); 237 a.setAttribute('href', url.toString()); 238 } catch (e) { /* skip malformed href */ } 239 }); 240 } 241 } catch (e) { /* attribution is non-essential; never break the page */ } 242 })(); 243 </script>
243
243<script> 244 (function() { 245 try { 246 // First-party visitor cookie â same domain scope as the attribution 247 // cookie above so both live/die together. UUID lets the server 248 // aggregate uniques (COUNT DISTINCT visitor_id) without an IP. 249 var VISITOR_COOKIE = 'fyp_visitor'; 250 var YEAR_SEC = 365 * 24 * 60 * 60; 251 var vm = document.cookie.match(new RegExp('(?:^|;\\s*)' + VISITOR_COOKIE + '=([^;]+)')); 252 var visitorId = vm ? vm[1] : null; 253 if (!visitorId) { 254 var uuid = (crypto && crypto.randomUUID) 255 ? crypto.randomUUID() 256 : 'v' + Date.now().toString(36) + Math.random().toString(36).slice(2, 12); 257 visitorId = uuid; 258 document.cookie = VISITOR_COOKIE + '=' + uuid 259 + '; domain=.fixyourperiod.com' 260 + '; path=/' 261 + '; max-age=' + YEAR_SEC 262 + '; SameSite=Lax'; 263 } 264 265 var body = JSON.stringify({ 266 path: window.location.pathname, 267 full_url: window.location.href, 268 referrer: document.referrer || null, 269 visitor_id: visitorId, 270 }); 271 fetch('https://fixyourperiod.app/api/track/pageview', { 272 method: 'POST', 273 headers: { 'Content-Type': 'application/json' }, 274 body: body, 275 keepalive: true, 276 credentials: 'omit', 277 }).catch(function(){ /* beacon is fire-and-forget */ }); 278 } catch (e) { /* never break the page */ } 279 })(); 280 </script>
280 </body> </html>
280<script type="module">function l(i){const s=document.getElementById("price-monthly"),n=document.getElementById("price-annual"),e=document.getElementById("btn-monthly"),t=document.getElementById("btn-annual");!s||!n||!e||!t||(i==="annual"?(s.classList.add("hidden"),n.classList.remove("hidden"),t.classList.replace("bg-white/20","bg-white"),t.classList.replace("text-white","text-rose-600"),e.classList.replace("bg-white","bg-white/20"),e.classList.replace("text-rose-600","text-white")):(n.classList.add("hidden"),s.classList.remove("hidden"),e.classList.replace("bg-white/20","bg-white"),e.classList.replace("text-white","text-rose-600"),t.classList.replace("bg-white","bg-white/20"),t.classList.replace("text-rose-600","text-white")))}window.setBilling=l;</script>
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.