PageSourceSearch

https://fixyourperiod.com/pricing

html fixyourperiod.com collected 2026-09-24 12:36:31 UTC 40,068 bytes, 280 lines download raw bytes

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&#39;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 &amp; 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 &amp; 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 &amp; 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&#39;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&#39;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 &amp; 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&#39;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&#39;s Period Pillars</p> <p class="text-xs text-gray-500 leading-relaxed">Nicole&#39;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&#39;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&#39;s Hormone Health Assessment, your personalized results, and cycle &amp; 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&#39;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&#39;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&#39;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.