PageSourceSearch

https://www.atobase.app/pricing

html atobase.app collected 2026-10-02 01:12:37 UTC 56,125 bytes, 632 lines download raw bytes

1<!DOCTYPE html><html lang="en"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width"><link rel="icon" type="image/png" href="/icon.png"><link rel="apple-touch-icon" href="/128_128.jpeg"><meta name="generator" content="Astro v5.18.2"><!-- <link rel="preload" as="image" href={src} alt="Hero" /> --><title>Pricing | ATO - AI Tab Organizer</title><link rel="canonical" href="https://atobase.app/pricing"><meta name="description" content="ATO pricing: start free with 30 monthly AI tokens, or go unlimited with ATO Pro. Simple, predictable plans for the AI tab organizer Chrome extension."><meta name="robots" content="index, follow"><meta property="og:title" content="Pricing | ATO - AI Tab Organizer"><meta property="og:type" content="website"><meta property="og:image" content="https://atobase.app/icon.png"><meta property="og:url" content="https://localhost/pricing"><meta property="og:description" content="ATO pricing: start free with 30 monthly AI tokens, or go unlimited with ATO Pro. Simple, predictable plans for the AI tab organizer Chrome extension."><link rel="stylesheet" href="/_astro/_slug_.D_EyEDyL.css">
2<style>@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/_astro/inter-cyrillic-ext-wght-normal.BOeWTOD4.woff2) format("woff2-variations");unicode-range:U+0460-052F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/_astro/inter-cyrillic-wght-normal.DqGufNeO.woff2) format("woff2-variations");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/_astro/inter-greek-ext-wght-normal.DlzME5K_.woff2) format("woff2-variations");unicode-range:U+1F00-1FFF}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/_astro/inter-greek-wght-normal.CkhJZR-_.woff2) format("woff2-variations");unicode-range:U+0370-0377,U+037A-037F,U+0384-038A,U+038C,U+038E-03A1,U+03A3-03FF}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/_astro/inter-vietnamese-wght-normal.CBcvBZtf.woff2) format("woff2-variations");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/_astro/inter-latin-ext-wght-normal.DO1Apj_S.woff2) format("woff2-variations");unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/_astro/inter-latin-wght-normal.Dx4kXJAl.woff2) format("woff2-variations");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Bricolage Grotesque Variable;font-style:normal;font-display:swap;font-weight:200 800;src:url(/_astro/bricolage-grotesque-vietnamese-wght-normal.BUzh504Q.woff2) format("woff2-variations");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Bricolage Grotesque Variable;font-style:normal;font-display:swap;font-weight:200 800;src:url(/_astro/bricolage-grotesque-latin-ext-wght-normal.CcLUaPy7.woff2) format("woff2-variations");unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Bricolage Grotesque Variable;font-style:normal;font-display:swap;font-weight:200 800;src:url(/_astro/bricolage-grotesque-latin-wght-normal.DLoelf7F.woff2) format("woff2-variations");
2unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}img{content-visibility:auto}
3</style></head> <body> <div class="max-w-screen-xl mx-auto px-5">  <header class="flex flex-col lg:flex-row justify-between items-center my-5">  <div class="flex w-full lg:w-auto items-center justify-between"> <a href="/" class="text-lg flex items-center gap-3"> <picture> <source srcset="/_vercel/image?url=_astro%2Fato-icon.CoguPjZg.png&#38;w=640&#38;q=100 640w" type="image/webp" sizes="40px">  <img src="/_vercel/image?url=_astro%2Fato-icon.CoguPjZg.png&#38;w=640&#38;q=100" srcset="/_vercel/image?url=_astro%2Fato-icon.CoguPjZg.png&#38;w=640&#38;q=100 640w" alt="ATO Logo" sizes="40px" loading="eager" decoding="async" fetchpriority="auto" inputtedWidth="500" width="500" height="500" class="w-10 h-10 rounded-lg"> </picture> <div class="flex flex-col"> <span class="font-bold text-gray-900 text-xl leading-tight">ATO</span> <span class="text-xs text-gray-600">AI Tab Organizer</span> </div> </a> <div class="block lg:hidden"> <button id="astronav-menu" aria-label="Toggle Menu">  <svg fill="currentColor" class="w-4 h-4 text-gray-800" width="24" height="24" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"> <title>Toggle Menu</title> <path class="astronav-close-icon astronav-toggle hidden" fill-rule="evenodd" clip-rule="evenodd" d="M18.278 16.864a1 1 0 01-1.414 1.414l-4.829-4.828-4.828 4.828a1 1 0 01-1.414-1.414l4.828-4.829-4.828-4.828a1 1 0 011.414-1.414l4.829 4.828 4.828-4.828a1 1 0 111.414 1.414l-4.828 4.829 4.828 4.828z"></path> <path class="astronav-open-icon astronav-toggle" fill-rule="evenodd" d="M4 5h16a1 1 0 010 2H4a1 1 0 110-2zm0 6h16a1 1 0 010 2H4a1 1 0 010-2zm0 6h16a1 1 0 010 2H4a1 1 0 010-2z"></path> </svg>  </button> </div> </div> <nav class="astronav-items astronav-toggle hidden w-full lg:w-auto mt-2 lg:flex lg:mt-0">  <ul class="flex flex-col lg:flex-row lg:gap-3"> <li> <a href="/" class="flex lg:px-3 py-2 items-center text-gray-600 hover:text-purple-600 transition-colors"> <span> Features</span> </a> </li><li> <a href="/tab-observer" class="flex lg:px-3 py-2 items-center text-gray-600 hover:text-purple-600 transition-colors"> <span> Tab Observer</span> </a> </li><li> <a href="/pricing" class="flex lg:px-3 py-2 items-center text-gray-600 hover:text-purple-600 transition-colors"> <span> Pricing</span> </a> </li><li> <a href="/blog" class="flex lg:px-3 py-2 items-center text-gray-600 hover:text-purple-600 transition-colors"> <span> Blog</span> </a> </li><li> <a href="/contact" class="flex lg:px-3 py-2 items-center text-gray-600 hover:text-purple-600 transition-colors"> <span> Contact</span> </a> </li> </ul> <div class="lg:hidden flex items-center mt-3 gap-4 w-full"> <style>astro-island,astro-slot,astro-static-slot{display:contents}</style>
3<script>(()=>{var e=async t=>{await(await t())()};(self.Astro||(self.Astro={})).load=e;window.dispatchEvent(new Event("astro:load"));})();</script>
3<script>(()=>{var A=Object.defineProperty;var g=(i,o,a)=>o in i?A(i,o,{enumerable:!0,configurable:!0,writable:!0,value:a}):i[o]=a;var d=(i,o,a)=>g(i,typeof o!="symbol"?o+"":o,a);{let i={0:t=>m(t),1:t=>a(t),2:t=>new RegExp(t),3:t=>new Date(t),4:t=>new Map(a(t)),5:t=>new Set(a(t)),6:t=>BigInt(t),7:t=>new URL(t),8:t=>new Uint8Array(t),9:t=>new Uint16Array(t),10:t=>new Uint32Array(t),11:t=>1/0*t},o=t=>{let[l,e]=t;return l in i?i[l](e):void 0},a=t=>t.map(o),m=t=>typeof t!="object"||t===null?t:Object.fromEntries(Object.entries(t).map(([l,e])=>[l,o(e)]));class y extends HTMLElement{constructor(){super(...arguments);d(this,"Component");d(this,"hydrator");d(this,"hydrate",async()=>{var b;if(!this.hydrator||!this.isConnected)return;let e=(b=this.parentElement)==null?void 0:b.closest("astro-island[ssr]");if(e){e.addEventListener("astro:hydrate",this.hydrate,{once:!0});return}let c=this.querySelectorAll("astro-slot"),n={},h=this.querySelectorAll("template[data-astro-template]");for(let r of h){let s=r.closest(this.tagName);s!=null&&s.isSameNode(this)&&(n[r.getAttribute("data-astro-template")||"default"]=r.innerHTML,r.remove())}for(let r of c){let s=r.closest(this.tagName);s!=null&&s.isSameNode(this)&&(n[r.getAttribute("name")||"default"]=r.innerHTML)}let p;try{p=this.hasAttribute("props")?m(JSON.parse(this.getAttribute("props"))):{}}catch(r){let s=this.getAttribute("component-url")||"<unknown>",v=this.getAttribute("component-export");throw v&&(s+=` (export ${v})`),console.error(`[hydrate] Error parsing props for component ${s}`,this.getAttribute("props"),r),r}let u;await this.hydrator(this)(this.Component,p,n,{client:this.getAttribute("client")}),this.removeAttribute("ssr"),this.dispatchEvent(new CustomEvent("astro:hydrate"))});d(this,"unmount",()=>{this.isConnected||this.dispatchEvent(new CustomEvent("astro:unmount"))})}disconnectedCallback(){document.removeEventListener("astro:after-swap",this.unmount),document.addEventListener("astro:after-swap",this.unmount,{once:!0})}connectedCallback(){if(!this.hasAttribute("await-children")||document.readyState==="interactive"||document.readyState==="complete")this.childrenConnectedCallback();else{let e=()=>{document.removeEventListener("DOMContentLoaded",e),c.disconnect(),this.childrenConnectedCallback()},c=new MutationObserver(()=>{var n;((n=this.lastChild)==null?void 0:n.nodeType)===Node.COMMENT_NODE&&this.lastChild.nodeValue==="astro:end"&&(this.lastChild.remove(),e())});c.observe(this,{childList:!0}),document.addEventListener("DOMContentLoaded",e)}}async childrenConnectedCallback(){let e=this.getAttribute("before-hydration-url");e&&await import(e),this.start()}async start(){let e=JSON.parse(this.getAttribute("opts")),c=this.getAttribute("client");if(Astro[c]===void 0){window.addEventListener(`astro:${c}`,()=>this.start(),{once:!0});return}try{await Astro[c](async()=>{let n=this.getAttribute("renderer-url"),[h,{default:p}]=await Promise.all([import(this.getAttribute("component-url")),n?import(n):()=>()=>{}]),u=this.getAttribute("component-export")||"default";if(!u.includes("."))this.Component=h[u];else{this.Component=h;for(let f of u.split("."))this.Component=this.Component[f]}return this.hydrator=p,this.hydrate},e,this)}catch(n){console.error(`[astro-island] Error hydrating ${this.getAttribute("component-url")}`,n)}}attributeChangedCallback(){this.hydrate()}}d(y,"observedAttributes",["props"]),customElements.get("astro-island")||customElements.define("astro-island",y)}})();</script>
3<astro-island uid="Z23NkVU" prefix="r2" component-url="/_astro/Auth.Q9e5f5oZ.js" component-export="default" renderer-url="/_astro/client.nFz3bvDj.js" props="{}" ssr client="load" opts="{&quot;name&quot;:&quot;Auth&quot;,&quot;value&quot;:true}" await-children><div class="flex items-center gap-4"><div class="w-8 h-8 border-2 border-purple-200 border-t-purple-600 rounded-full animate-spin"></div></div><!--astro:end--></astro-island> </div>  </nav>  
3<script>(function(){const closeOnClick = false;
4
5["DOMContentLoaded", "astro:after-swap"].forEach((event) => {
6  document.addEventListener(event, addListeners);
7});
8
9// Function to clone and replace elements
10function cloneAndReplace(element) {
11  const clone = element.cloneNode(true);
12  element.parentNode.replaceChild(clone, element);
13}
14
15function addListeners() {
16  // Clean up existing listeners
17  const oldMenuButton = document.getElementById("astronav-menu");
18  if (oldMenuButton) {
19    cloneAndReplace(oldMenuButton);
20  }
21
22  const oldDropdownMenus = document.querySelectorAll(".astronav-dropdown");
23  oldDropdownMenus.forEach((menu) => {
24    cloneAndReplace(menu);
25  });
26
27  // Mobile nav toggle
28  const menuButton = document.getElementById("astronav-menu");
29  menuButton && menuButton.addEventListener("click", toggleMobileNav);
30
31  // Dropdown menus
32  const dropdownMenus = document.querySelectorAll(".astronav-dropdown");
33  dropdownMenus.forEach((menu) => {
34    const button = menu.querySelector("button");
35    button &&
36      button.addEventListener("click", (event) =>
37        toggleDropdownMenu(event, menu, dropdownMenus)
38      );
39
40    // Handle Submenu Dropdowns
41    const dropDownSubmenus = menu.querySelectorAll(
42      ".astronav-dropdown-submenu"
43    );
44
45    dropDownSubmenus.forEach((submenu) => {
46      const submenuButton = submenu.querySelector("button");
47      submenuButton &&
48        submenuButton.addEventListener("click", (event) => {
49          event.stopImmediatePropagation();
50          toggleSubmenuDropdown(event, submenu);
51        });
52    });
53  });
54
55  // Clicking away from dropdown will remove the dropdown class
56  document.addEventListener("click", closeAllDropdowns);
57
58  if (closeOnClick) {
59    handleCloseOnClick();
60  }
61}
62
63function toggleMobileNav() {
64  [...document.querySelectorAll(".astronav-toggle")].forEach((el) => {
65    el.classList.toggle("hidden");
66  });
67}
68
69function toggleDropdownMenu(event, menu, dropdownMenus) {
70  toggleMenu(menu);
71
72  // Close one dropdown when selecting another
73  Array.from(dropdownMenus)
74    .filter((el) => el !== menu && !menu.contains(el))
75    .forEach(closeMenu);
76
77  event.stopPropagation();
78}
79
80function toggleSubmenuDropdown(event, submenu) {
81  event.stopPropagation();
82  toggleMenu(submenu);
83
84  // Close sibling submenus at the same nesting level
85  const siblingSubmenus = submenu
86    .closest(".astronav-dropdown")
87    .querySelectorAll(".astronav-dropdown-submenu");
88  Array.from(siblingSubmenus)
89    .filter((el) => el !== submenu && !submenu.contains(el))
90    .forEach(closeMenu);
91}
92
93function closeAllDropdowns(event) {
94  const dropdownMenus = document.querySelectorAll(".dropdown-toggle");
95  const dropdownParent = document.querySelectorAll(
96    ".astronav-dropdown, .astronav-dropdown-submenu"
97  );
98  const isButtonInsideDropdown = [
99    ...document.querySelectorAll(
100      `.astronav-dropdown button, .astronav-dropdown label, .astronav-dropdown input,
101	  .astronav-dropdown-submenu button, .astronav-dropdown-submenu label, .astronav-dropdown-submenu input,
102	  #astronav-menu`
103    ),
104  ].some((button) => button.contains(event.target));
105  if (!isButtonInsideDropdown) {
106    dropdownMenus.forEach((d) => {
107      // console.log("I ran", d);
108      // if (!d.contains(event.target)) {
109      d.classList.remove("open");
110      d.removeAttribute("open");
111      d.classList.add("hidden");
112      // }
113    });
114    dropdownParent.forEach((d) => {
115      d.classList.remove("open");
116      d.removeAttribute("open");
117      d.setAttribute("aria-expanded", "false");
118    });
119  }
120}
121
122function toggleMenu(menu) {
123  menu.classList.toggle("open");
124  const expanded = menu.getAttribute("aria-expanded") === "true";
125  menu.setAttribute("aria-expanded", expanded ? "false" : "true");
126  menu.hasAttribute("open")
127    ? menu.removeAttribute("open")
128    : menu.setAttribute("open", "");
129
130  const dropdownToggle = menu.querySelector(".dropdown-toggle");
131  const dropdownExpanded = dropdownToggle.getAttribute("aria-expanded");
132  dropdownToggle.classList.toggle("hidden");
133  dropdownToggle.setAttribute(
134    "aria-expanded",
135    dropdownExpanded === "true" ? "false" : "true"
136  );
137}
138
139function closeMenu(menu) {
140  // console.log("closing", menu);
141  menu.classList.remove("open");
142  menu.removeAttribute("open");
143  menu.setAttribute("aria-expanded", "false");
144  const dropdownToggles = menu.querySelectorAll(".dropdown-toggle");
145  dropdownToggles.forEach((toggle) => {
146    toggle.classList.add("hidden");
147    toggle.setAttribute("aria-expanded", "false");
148  });
149}
150
151function handleCloseOnClick() {
152  const navMenuItems = document.querySelector(".astronav-items");
153  const navToggle = document.getElementById("astronav-menu");
154  const navLink = navMenuItems && navMenuItems.querySelectorAll("a");
155
156  const MenuIcons = navToggle.querySelectorAll(".astronav-toggle");
157
158  navLink &&
159    navLink.forEach((item) => {
160      item.addEventListener("click", () => {
161        navMenuItems?.classList.add("hidden");
162        MenuIcons.forEach((el) => {
163          el.classList.toggle("hidden");
164        });
165      });
166    });
167}
168})();</script>
168 <div class="hidden lg:flex items-center gap-4"> <astro-island uid="Z23NkVU" prefix="r3" component-url="/_astro/Auth.Q9e5f5oZ.js" component-export="default" renderer-url="/_astro/client.nFz3bvDj.js" props="{}" ssr client="load" opts="{&quot;name&quot;:&quot;Auth&quot;,&quot;value&quot;:true}" await-children><div class="flex items-center gap-4"><div class="w-8 h-8 border-2 border-purple-200 border-t-purple-600 rounded-full animate-spin"></div></div><!--astro:end--></astro-island> </div> </header>  </div>  
168<script type="application/ld+json">{"@context":"https://schema.org","@type":"Product","name":"ATO - AI Tab Organizer","description":"AI-powered Chrome extension that automatically organizes browser tabs by category, last access, relevance, A-Z, or custom topics.","image":"https://atobase.app/icon_white_bg.png","url":"https://atobase.app/pricing","brand":{"@type":"Brand","name":"ATO"},"offers":[{"@type":"Offer","priceCurrency":"USD","availability":"https://schema.org/InStock","url":"https://atobase.app/pricing","shippingDetails":{"@type":"OfferShippingDetails","shippingRate":{"@type":"MonetaryAmount","value":"0","currency":"USD"},"shippingDestination":{"@type":"DefinedRegion","addressCountry":"US"},"deliveryTime":{"@type":"ShippingDeliveryTime","handlingTime":{"@type":"QuantitativeValue","minValue":0,"maxValue":0,"unitCode":"DAY"},"transitTime":{"@type":"QuantitativeValue","minValue":0,"maxValue":0,"unitCode":"DAY"}}},"hasMerchantReturnPolicy":{"@type":"MerchantReturnPolicy","applicableCountry":"US","returnPolicyCategory":"https://schema.org/MerchantReturnFiniteReturnWindow","merchantReturnDays":14,"returnFees":"https://schema.org/FreeReturn","refundType":"https://schema.org/FullRefund","merchantReturnLink":"https://atobase.app/refund-policy"},"name":"Basic Plan","price":"0","description":"30 monthly AI tokens with auto-refill, all organization methods and tab management tools."},{"@type":"Offer","priceCurrency":"USD","availability":"https://schema.org/InStock","url":"https://atobase.app/pricing","shippingDetails":{"@type":"OfferShippingDetails","shippingRate":{"@type":"MonetaryAmount","value":"0","currency":"USD"},"shippingDestination":{"@type":"DefinedRegion","addressCountry":"US"},"deliveryTime":{"@type":"ShippingDeliveryTime","handlingTime":{"@type":"QuantitativeValue","minValue":0,"maxValue":0,"unitCode":"DAY"},"transitTime":{"@type":"QuantitativeValue","minValue":0,"maxValue":0,"unitCode":"DAY"}}},"hasMerchantReturnPolicy":{"@type":"MerchantReturnPolicy","applicableCountry":"US","returnPolicyCategory":"https://schema.org/MerchantReturnFiniteReturnWindow","merchantReturnDays":14,"returnFees":"https://schema.org/FreeReturn","refundType":"https://schema.org/FullRefund","merchantReturnLink":"https://atobase.app/refund-policy"},"name":"Pro Plan","price":"9.99","description":"Unlimited AI tokens, full feature access, billed monthly."},{"@type":"Offer","priceCurrency":"USD","availability":"https://schema.org/InStock","url":"https://atobase.app/pricing","shippingDetails":{"@type":"OfferShippingDetails","shippingRate":{"@type":"MonetaryAmount","value":"0","currency":"USD"},"shippingDestination":{"@type":"DefinedRegion","addressCountry":"US"},"deliveryTime":{"@type":"ShippingDeliveryTime","handlingTime":{"@type":"QuantitativeValue","minValue":0,"maxValue":0,"unitCode":"DAY"},"transitTime":{"@type":"QuantitativeValue","minValue":0,"maxValue":0,"unitCode":"DAY"}}},"hasMerchantReturnPolicy":{"@type":"MerchantReturnPolicy","applicableCountry":"US","returnPolicyCategory":"https://schema.org/MerchantReturnFiniteReturnWindow","merchantReturnDays":14,"returnFees":"https://schema.org/FreeReturn","refundType":"https://schema.org/FullRefund","merchantReturnLink":"https://atobase.app/refund-policy"},"name":"Pro Plan (Yearly)","price":"95.99","description":"Unlimited AI tokens, full feature access, billed yearly."}]}</script>
168 <div class="max-w-screen-xl mx-auto px-5">  <div class="mt-16 text-center"> <h1 class="text-4xl lg:text-5xl font-bold lg:tracking-tight"> Pricing </h1> <p class="text-lg mt-4 text-slate-600"> 
169Start free with 30 AI tokens a month. Upgrade to Pro whenever you want unlimited.
170 </p> </div>  <div class="max-w-4xl mx-auto mt-8 mb-4"> <div class="relative overflow-hidden bg-gradient-to-r from-purple-700 via-fuchsia-600 to-indigo-700 rounded-2xl shadow-2xl p-6 md:p-8 ato-promo-banner"> <div class="absolute inset-0 opacity-20 bg-[radial-gradient(circle_at_top_left,white,transparent_55%),radial-gradient(circle_at_bottom_right,white,transparent_55%)]"></div> <div class="relative z-10 flex flex-col md:flex-row items-center justify-between gap-6"> <div class="flex-1 text-center md:text-left"> <div class="inline-flex items-center gap-2 mb-3 px-4 py-1 bg-white/20 backdrop-blur-sm rounded-full"> <span class="text-white font-bold text-sm md:text-base tracking-wider">LIMITED TIME ONLY</span> </div> <h3 class="text-3xl md:text-4xl font-extrabold text-white mb-2 leading-tight"> <span class="text-yellow-300">HUGE 15% OFF</span> ATO PRO!
171</h3> <p class="text-white/90 text-base md:text-lg">
172Use code <span class="font-mono font-bold bg-white/20 px-2 py-0.5 rounded">welcome15</span> — works on monthly and yearly (yearly saves 20% more).
173</p> </div> <div class="flex-shrink-0 flex flex-col items-center gap-3"> <div class="bg-white rounded-xl px-6 py-4 shadow-lg text-center"> <span class="block text-3xl md:text-4xl font-extrabold text-purple-700">15%</span> <span class="block text-lg font-extrabold text-purple-700">OFF!</span> </div> <a id="promo-apply-btn" data-coupon="welcome15" href="#" class="inline-block px-8 py-3 bg-yellow-300 text-purple-900 font-extrabold rounded-xl hover:bg-yellow-200 transition-all duration-200 shadow-lg whitespace-nowrap">
174Grab the deal →
175</a> </div> </div> <div class="absolute -top-10 -right-10 w-40 h-40 bg-white/10 rounded-full"></div> <div class="absolute -bottom-10 -left-10 w-32 h-32 bg-white/10 rounded-full"></div> </div> </div>  <div class="grid md:grid-cols-2 gap-10 mx-auto max-w-3xl mt-12 items-stretch"> <div class="h-full flex"> <div class="w-full h-full"> <div class="flex flex-col h-full w-full order-first lg:order-none pt-8 pb-5 px-6 rounded-md relative bg-white border-2 border-[#D8DEE9] border-opacity-50">  <div class="text-center min-h-[210px] flex flex-col items-center"> <h4 class="text-lg font-medium text-gray-400">Basic Plan</h4> <div class="mt-3 flex flex-col items-center"> <span class="text-4xl md:text-4xl font-bold text-black"> $0<span class="font-semibold" style="font-size: 2rem;">/mo</span> </span> </div> <p class="mt-1 text-sm font-medium text-gray-500"> free of charge </p> </div> <ul class="grid mt-8 text-left gap-y-4 flex-grow"> <li class="flex items-start gap-3 text-gray-800"> <svg class="w-6 h-6 " viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"><circle cx="12" cy="12" r="9" fill="currentColor" fill-opacity=".16"></circle><path fill-rule="evenodd" clip-rule="evenodd" d="M3.75 12a8.25 8.25 0 0 1 11.916-7.393.75.75 0 1 0 .668-1.343A9.713 9.713 0 0 0 12 2.25c-5.385 0-9.75 4.365-9.75 9.75s4.365 9.75 9.75 9.75 9.75-4.365 9.75-9.75c0-.366-.02-.727-.06-1.082a.75.75 0 1 0-1.49.164A8.25 8.25 0 1 1 3.75 12Zm17.78-6.47a.75.75 0 0 0-1.06-1.06L12 12.94l-2.47-2.47a.75.75 0 0 0-1.06 1.06l3 3a.75.75 0 0 0 1.06 0l9-9Z" fill="currentColor"></path> </svg> <span>All organization methods</span> </li><li class="flex items-start gap-3 text-gray-800"> <svg class="w-6 h-6 " viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"><circle cx="12" cy="12" r="9" fill="currentColor" fill-opacity=".16"></circle><path fill-rule="evenodd" clip-rule="evenodd" d="M3.75 12a8.25 8.25 0 0 1 11.916-7.393.75.75 0 1 0 .668-1.343A9.713 9.713 0 0 0 12 2.25c-5.385 0-9.75 4.365-9.75 9.75s4.365 9.75 9.75 9.75 9.75-4.365 9.75-9.75c0-.366-.02-.727-.06-1.082a.75.75 0 1 0-1.49.164A8.25 8.25 0 1 1 3.75 12Zm17.78-6.47a.75.75 0 0 0-1.06-1.06L12 12.94l-2.47-2.47a.75.75 0 0 0-1.06 1.06l3 3a.75.75 0 0 0 1.06 0l9-9Z" fill="currentColor"></path> </svg> <span>All tab management tools</span> </li><li class="flex items-start gap-3 text-gray-800"> <svg class="w-6 h-6 " viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"><circle cx="12" cy="12" r="9" fill="currentColor" fill-opacity=".16"></circle><path fill-rule="evenodd" clip-rule="evenodd" d="M3.75 12a8.25 8.25 0 0 1 11.916-7.393.75.75 0 1 0 .668-1.343A9.713 9.713 0 0 0 12 2.25c-5.385 0-9.75 4.365-9.75 9.75s4.365 9.75 9.75 9.75 9.75-4.365 9.75-9.75c0-.366-.02-.727-.06-1.082a.75.75 0 1 0-1.49.164A8.25 8.25 0 1 1 3.75 12Zm17.78-6.47a.75.75 0 0 0-1.06-1.06L12 12.94l-2.47-2.47a.75.75 0 0 0-1.06 1.06l3 3a.75.75 0 0 0 1.06 0l9-9Z" fill="currentColor"></path> </svg> <span><strong>30 tokens</strong> monthly</span> </li><li class="flex items-start gap-3 text-gray-800"> <svg class="w-6 h-6 " viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"><circle cx="12" cy="12" r="9" fill="currentColor" fill-opacity=".16"></circle><path fill-rule="evenodd" clip-rule="evenodd" d="M3.75 12a8.25 8.25 0 0 1 11.916-7.393.75.75 0 1 0 .668-1.343A9.713 9.713 0 0 0 12 2.25c-5.385 0-9.75 4.365-9.75 9.75s4.365 9.75 9.75 9.75 9.75-4.365 9.75-9.75c0-.366-.02-.727-.06-1.082a.75.75 0 1 0-1.49.164A8.25 8.25 0 1 1 3.75 12Zm17.78-6.47a.75.75 0 0 0-1.06-1.06L12 12.94l-2.47-2.47a.75.75 0 0 0-1.06 1.06l3 3a.75.75 0 0 0 1.06 0l9-9Z" fill="currentColor"></path> </svg> <span>Auto-refills to 30 every month</span> </li><li class="flex items-start gap-3 text-gray-800"> <svg class="w-6 h-6 " viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"><circle cx="12" cy="12" r="9" fill="currentColor" fill-opacity=".16"></circle><path fill-rule="evenodd" clip-rule="evenodd" d="M3.75 12a8.25 8.25 0 0 1 11.916-7.393.75.75 0 1 0 .668-1.343A9.713 9.713 0 0 0 12 2.25c-5.385 0-9.75 4.365-9.75 9.75s4.365 9.75 9.75 9.75 9.75-4.365 9.75-9.75c0-.366-.02-.727-.06-1.082a.75.75 0 1 0-1.49.164A8.25 8.25 0 1 1 3.75 12Zm17.78-6.47a.75.75 0 0 0-1.06-1.06L12 12.94l-2.47-2.47a.75.75 0 0 0-1.06 1.06l3 3a.75.75 0 0 0 1.06 0l9-9Z" fill="currentColor"></path> </svg> <span>On demand organization</span> </li> </ul> <div class="flex flex-col gap-2 mt-8">  <a href="https://chromewebstore.google.com/detail/ato-ai-tab-organizer/dhljacmljbbiihhjfjcjaebajabeedfg" class="rounded text-center transition focus-visible:ring-2 ring-offset-2 ring-gray-200 w-full px-5 py-2.5 bg-white border-2 border-black hover:bg-gray-100 text-black ">Get Started Free </a>  </div> </div> </div> </div><div class="h-full flex"> <div class="w-full h-full p-[2px] rounded-md bg-gradient-to-r from-purple-500 via-fuchsia-500 to-indigo-500"> <div class="flex flex-col h-full w-full order-first lg:order-none pt-8 pb-5 px-6 rounded-md relative bg-white border-0"> <div class="absolute -top-8 left-1/2 transform -translate-x-1/2 z-10"> <span class="bg-gradient-to-r from-purple-500 to-pink-500 text-white text-xs font-bold px-4 py-1 rounded-full uppercase tracking-wider shadow-lg animate-pulse"> 7 DAYS FREE TRIAL </span> </div> <div class="text-center min-h-[210px] flex flex-col items-center"> <div class="flex flex-col items-center gap-0.5"> <div class="flex items-center gap-1.5">
175  <svg class="w-6 h-6 flex-shrink-0" viewBox="0 0 24 24" fill="none" stroke="#a855f7" stroke-width="2.2" stroke-linecap="round" xmlns="http://www.w3.org/2000/svg"> <path d="M12 12c-2-2.5-4-4-6-4a4 4 0 0 0 0 8c2 0 4-1.5 6-4z"></path> <path d="M12 12c2 2.5 4 4 6 4a4 4 0 0 0 0-8c-2 0-4 1.5-6 4z"></path> </svg> <h4 class="text-xl font-extrabold text-purple-500" style="letter-spacing: -0.01em;"> ATO Pro </h4> </div> <span class="text-sm font-medium text-gray-400"> (unlimited) </span> </div> <div class="mt-3 flex flex-col items-center"> <div class="flex items-baseline justify-center gap-x-2" data-billing-show="monthly"> <span class="text-4xl md:text-4xl font-bold text-black" data-billing-show="monthly" data-price-display="pro"> $9.99<span class="font-semibold" style="font-size: 2rem;">/mo</span> </span> <span data-billing-show="monthly" data-price-original="pro" class="text-base md:text-lg font-semibold text-gray-400 line-through" style="display: none;"> <span style="font-size: 0.9em;">/mo</span> </span> </div> <div data-badge-container="monthly" class="flex justify-center items-center gap-2 mt-2 hidden" id="monthly-badge-container"> <span data-discount-badge="pro" class="hidden text-xs font-bold px-2.5 py-0.5 rounded-full uppercase tracking-wider bg-gradient-to-r from-yellow-400 to-orange-500 text-white whitespace-nowrap shadow-sm"></span> </div> <div class="flex items-baseline justify-center gap-x-2" data-billing-show="yearly" style="display: none;"> <span class="text-4xl md:text-4xl font-bold text-black" data-billing-show="yearly" data-price-display="pro"> $95.99<span class="font-semibold" style="font-size: 2rem;">/yr</span> </span> <span data-billing-show="yearly" data-price-original="pro" class="text-base md:text-lg font-semibold text-gray-400 line-through" style="display: none;"> <span style="font-size: 0.9em;">/yr</span> </span> </div> <div data-badge-container="yearly" class="flex justify-center items-center gap-2 mt-2 hidden" id="yearly-badge-container"> <span data-discount-badge-yearly="pro" class="hidden text-xs font-bold px-2.5 py-0.5 rounded-full uppercase tracking-wider bg-gradient-to-r from-yellow-400 to-orange-500 text-white whitespace-nowrap shadow-sm"></span> </div>  </div> <div class="mt-2 text-sm text-gray-700 space-y-2"> <div class="flex items-center justify-center min-h-[24px]"> <span data-billing-show="yearly" class="hidden text-xs font-semibold bg-yellow-100 text-yellow-800 px-2 py-0.5 rounded-full">
176Save extra 20% on yearly billing
177</span> </div> <div class="text-xs text-gray-600 whitespace-nowrap"> Use code &quot;welcome15&quot; for 15% off </div> <div class="flex justify-center" style="margin-top: 32px;"> <fieldset id="billing-toggle" class="inline-flex items-center rounded-xl bg-gray-100 p-1 border border-gray-200 shadow-sm"> <legend class="sr-only">Billing cycle</legend> <label class="cursor-pointer"> <input class="sr-only peer" type="radio" name="billing" value="yearly" aria-label="Yearly billing"> <span class="inline-flex items-center justify-center px-4 py-1.5 rounded-lg text-sm font-semibold text-gray-700 transition
178                      peer-checked:bg-black peer-checked:text-white">
179Yearly
180</span> </label> <label class="cursor-pointer"> <input class="sr-only peer" type="radio" name="billing" value="monthly" aria-label="Monthly billing" checked> <span class="inline-flex items-center justify-center px-4 py-1.5 rounded-lg text-sm font-semibold text-gray-700 transition
181                      peer-checked:bg-black peer-checked:text-white">
182Monthly
183</span> </label> </fieldset> </div> </div> </div> <ul class="grid mt-8 text-left gap-y-4 flex-grow"> <li class="flex items-start gap-3 text-gray-800"> <svg class="w-6 h-6 text-purple-500" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"><circle cx="12" cy="12" r="9" fill="currentColor" fill-opacity=".16"></circle><path fill-rule="evenodd" clip-rule="evenodd" d="M3.75 12a8.25 8.25 0 0 1 11.916-7.393.75.75 0 1 0 .668-1.343A9.713 9.713 0 0 0 12 2.25c-5.385 0-9.75 4.365-9.75 9.75s4.365 9.75 9.75 9.75 9.75-4.365 9.75-9.75c0-.366-.02-.727-.06-1.082a.75.75 0 1 0-1.49.164A8.25 8.25 0 1 1 3.75 12Zm17.78-6.47a.75.75 0 0 0-1.06-1.06L12 12.94l-2.47-2.47a.75.75 0 0 0-1.06 1.06l3 3a.75.75 0 0 0 1.06 0l9-9Z" fill="currentColor"></path> </svg> <span>All organization methods</span> </li><li class="flex items-start gap-3 text-gray-800">
183 <svg class="w-6 h-6 text-purple-500" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"><circle cx="12" cy="12" r="9" fill="currentColor" fill-opacity=".16"></circle><path fill-rule="evenodd" clip-rule="evenodd" d="M3.75 12a8.25 8.25 0 0 1 11.916-7.393.75.75 0 1 0 .668-1.343A9.713 9.713 0 0 0 12 2.25c-5.385 0-9.75 4.365-9.75 9.75s4.365 9.75 9.75 9.75 9.75-4.365 9.75-9.75c0-.366-.02-.727-.06-1.082a.75.75 0 1 0-1.49.164A8.25 8.25 0 1 1 3.75 12Zm17.78-6.47a.75.75 0 0 0-1.06-1.06L12 12.94l-2.47-2.47a.75.75 0 0 0-1.06 1.06l3 3a.75.75 0 0 0 1.06 0l9-9Z" fill="currentColor"></path> </svg> <span>All tab management tools</span> </li><li class="flex items-start gap-3 text-gray-800"> <svg class="w-6 h-6 text-purple-500" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"><circle cx="12" cy="12" r="9" fill="currentColor" fill-opacity=".16"></circle><path fill-rule="evenodd" clip-rule="evenodd" d="M3.75 12a8.25 8.25 0 0 1 11.916-7.393.75.75 0 1 0 .668-1.343A9.713 9.713 0 0 0 12 2.25c-5.385 0-9.75 4.365-9.75 9.75s4.365 9.75 9.75 9.75 9.75-4.365 9.75-9.75c0-.366-.02-.727-.06-1.082a.75.75 0 1 0-1.49.164A8.25 8.25 0 1 1 3.75 12Zm17.78-6.47a.75.75 0 0 0-1.06-1.06L12 12.94l-2.47-2.47a.75.75 0 0 0-1.06 1.06l3 3a.75.75 0 0 0 1.06 0l9-9Z" fill="currentColor"></path> </svg> <span><strong>Unlimited</strong> tokens ∞</span> </li><li class="flex items-start gap-3 text-gray-800"> <svg class="w-6 h-6 text-purple-500" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"><circle cx="12" cy="12" r="9" fill="currentColor" fill-opacity=".16"></circle><path fill-rule="evenodd" clip-rule="evenodd" d="M3.75 12a8.25 8.25 0 0 1 11.916-7.393.75.75 0 1 0 .668-1.343A9.713 9.713 0 0 0 12 2.25c-5.385 0-9.75 4.365-9.75 9.75s4.365 9.75 9.75 9.75 9.75-4.365 9.75-9.75c0-.366-.02-.727-.06-1.082a.75.75 0 1 0-1.49.164A8.25 8.25 0 1 1 3.75 12Zm17.78-6.47a.75.75 0 0 0-1.06-1.06L12 12.94l-2.47-2.47a.75.75 0 0 0-1.06 1.06l3 3a.75.75 0 0 0 1.06 0l9-9Z" fill="currentColor"></path> </svg> <span><span class="font-bold bg-gradient-to-r from-pink-500 to-purple-500 bg-clip-text text-transparent">No refills, No limits</span></span> </li><li class="flex items-start gap-3 text-gray-800"> <svg class="w-6 h-6 text-purple-500" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"><circle cx="12" cy="12" r="9" fill="currentColor" fill-opacity=".16"></circle><path fill-rule="evenodd" clip-rule="evenodd" d="M3.75 12a8.25 8.25 0 0 1 11.916-7.393.75.75 0 1 0 .668-1.343A9.713 9.713 0 0 0 12 2.25c-5.385 0-9.75 4.365-9.75 9.75s4.365 9.75 9.75 9.75 9.75-4.365 9.75-9.75c0-.366-.02-.727-.06-1.082a.75.75 0 1 0-1.49.164A8.25 8.25 0 1 1 3.75 12Zm17.78-6.47a.75.75 0 0 0-1.06-1.06L12 12.94l-2.47-2.47a.75.75 0 0 0-1.06 1.06l3 3a.75.75 0 0 0 1.06 0l9-9Z" fill="currentColor"></path> </svg> <span>On demand + <strong>Auto-organization</strong></span> </li><li class="flex items-start gap-3 text-gray-800"> <svg class="w-6 h-6 text-purple-500" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"><circle cx="12" cy="12" r="9" fill="currentColor" fill-opacity=".16"></circle><path fill-rule="evenodd" clip-rule="evenodd" d="M3.75 12a8.25 8.25 0 0 1 11.916-7.393.75.75 0 1 0 .668-1.343A9.713 9.713 0 0 0 12 2.25c-5.385 0-9.75 4.365-9.75 9.75s4.365 9.75 9.75 9.75 9.75-4.365 9.75-9.75c0-.366-.02-.727-.06-1.082a.75.75 0 1 0-1.49.164A8.25 8.25 0 1 1 3.75 12Zm17.78-6.47a.75.75 0 0 0-1.06-1.06L12 12.94l-2.47-2.47a.75.75 0 0 0-1.06 1.06l3 3a.75.75 0 0 0 1.06 0l9-9Z" fill="currentColor"></path> </svg> <span>Full Access to <a href='/tab-observer' class='hover:underline'><span class="font-bold bg-gradient-to-r from-blue-400 to-blue-700 bg-clip-text text-transparent">Tab Observer</span></a></span> </li> </ul> <div class="flex flex-col gap-2 mt-8">  <a href="#" data-billing-show="monthly" data-checkout-product="pro_plan" class="rounded text-center transition focus-visible:ring-2 ring-offset-2 ring-gray-200 w-full px-5 py-2.5 bg-black text-white hover:bg-gray-800  border-2 border-transparent">Get Pro (Monthly) </a> <a href="#" data-billing-show="yearly" data-checkout-product="pro_plan_yearly" class="rounded text-center transition focus-visible:ring-2 ring-offset-2 ring-gray-200 w-full px-5 py-2.5 bg-black text-white hover:bg-gray-800  border-2 border-transparent hidden">
183Get Pro (Yearly) </a>  </div> </div> </div> </div> </div>  </div>  <footer class="my-20"> <p class="text-center text-sm text-slate-500">
184Copyright © 2026 ATO - AI Tab Organizer. All rights reserved.
185</p> <p class="text-center text-xs text-slate-500 mt-1"> <a href="/terms-and-conditions" class="underline hover:text-purple-600">Terms of Service</a> |
186<a href="/privacy-policy" class="underline hover:text-purple-600">Privacy Policy</a> |
187<a href="/refund-policy" class="underline hover:text-purple-600">Refund Policy</a> </p> </footer> <!-- Initialize our custom analytics after page load --> 
187<script type="module" src="/_astro/Layout.astro_astro_type_script_index_0_lang.BPG3k8ww.js"></script>
187  </body> </html> <!-- Add Paddle script --> 
187<script src="https://cdn.paddle.com/paddle/v2/paddle.js"></script>
187 
187<script>(function(){const paddleConfig = {"environment":"prod","clientToken":"live_f63ea00908376efb64234e1843f","siteUrl":"https://atobase.app","baseUrl":"https://api.paddle.com","products":{"BOOST_PACK":{"id":"boost_pack","name":"Boost Pack","tokens":300,"type":"one_time","priceId":"pri_01k95drfxesmz2xzf8rw5xyrkx"},"MEGA_PACK":{"id":"mega_pack","name":"Mega Pack","tokens":1000,"type":"one_time","priceId":"pri_01k95dt67bxt9zhn81fsywjez6"},"PRO_PLAN":{"id":"pro_plan","name":"Pro Plan","tokens":10000,"type":"subscription","priceId":"pri_01m2ty1td9ea4c05mc03nt2q5b"},"PRO_PLAN_YEARLY":{"id":"pro_plan_yearly","name":"Pro Plan (Yearly)","tokens":10000,"type":"subscription","priceId":"pri_01m2ty1thcyrynsvbhwj081kyy"},"TOKEN_PACK":{"id":"token_pack","name":"Token Pack","tokens":50,"type":"one_time","priceId":"pri_01kjfskgvd46jwq08kdtd2trs9"}}};
188
189  // Initialize Paddle
190  (function initPaddle() {
191    if (typeof Paddle !== 'undefined') {
192      try {
193        const rawEnv = (paddleConfig.environment || 'sandbox').toLowerCase().trim();
194        const normalizedEnv = (rawEnv === 'production' || rawEnv === 'prod' || rawEnv === 'live') ? 'production' : 'sandbox';
195        if (normalizedEnv === 'production' && !paddleConfig.clientToken) {
196          console.error('❌ Missing PUBLIC_PADDLE_CLIENT_TOKEN for production environment');
197          return;
198        }
199        Paddle.Environment.set(normalizedEnv);
200        
201        const initConfig = {
202          eventCallback: function(data) {
203            if (data.name === 'checkout.completed') {
204              console.log('Checkout completed:', data);
205            }
206          }
207        };
208        
209        if (paddleConfig.clientToken) {
210          initConfig.token = paddleConfig.clientToken;
211        }
212        
213        Paddle.Initialize(initConfig);
214        console.log('✅ Paddle initialized on pricing page');
215        window.dispatchEvent(new Event('paddle-ready'));
216      } catch (error) {
217        console.error('❌ Failed to initialize Paddle:', error);
218      }
219    } else {
220      setTimeout(initPaddle, 100);
221    }
222  })();
223})();</script>
223 <style>
224  @media (prefers-reduced-motion: no-preference) {
225    .ato-promo-banner {
226      animation: ato-float 6s ease-in-out infinite;
227    }
228    .ato-promo-banner::after {
229      content: "";
230      position: absolute;
231      inset: -40%;
232      background: linear-gradient(
233        120deg,
234        transparent 35%,
235        rgba(255, 255, 255, 0.18) 50%,
236        transparent 65%
237      );
238      transform: translateX(-30%) rotate(8deg);
239      animation: ato-shimmer 7.5s ease-in-out infinite;
240      pointer-events: none;
241    }
242  }
243
244  @keyframes ato-float {
245    0%,
246    100% {
247      transform: translateY(0);
248    }
249    50% {
250      transform: translateY(-7px);
251    }
252  }
253
254  @keyframes ato-shimmer {
255    0%,
256    100% {
257      transform: translateX(-35%) rotate(8deg);
258      opacity: 0.65;
259    }
260    50% {
261      transform: translateX(35%) rotate(8deg);
262      opacity: 0.95;
263    }
264  }
265</style> 
265<script>(function(){const paddleConfig = {"environment":"prod","clientToken":"live_f63ea00908376efb64234e1843f","siteUrl":"https://atobase.app","baseUrl":"https://api.paddle.com","products":{"BOOST_PACK":{"id":"boost_pack","name":"Boost Pack","tokens":300,"type":"one_time","priceId":"pri_01k95drfxesmz2xzf8rw5xyrkx"},"MEGA_PACK":{"id":"mega_pack","name":"Mega Pack","tokens":1000,"type":"one_time","priceId":"pri_01k95dt67bxt9zhn81fsywjez6"},"PRO_PLAN":{"id":"pro_plan","name":"Pro Plan","tokens":10000,"type":"subscription","priceId":"pri_01m2ty1td9ea4c05mc03nt2q5b"},"PRO_PLAN_YEARLY":{"id":"pro_plan_yearly","name":"Pro Plan (Yearly)","tokens":10000,"type":"subscription","priceId":"pri_01m2ty1thcyrynsvbhwj081kyy"},"TOKEN_PACK":{"id":"token_pack","name":"Token Pack","tokens":50,"type":"one_time","priceId":"pri_01kjfskgvd46jwq08kdtd2trs9"}}};
266
267  (() => {
268    // ---- State ----
269    let couponCode = '';
270    let paddleReady = false;
271    let user = null;
272
273    // ---- Product map ----
274    const PRODUCTS = {
275      pro_plan: {
276        priceId: paddleConfig.products.PRO_PLAN.priceId,
277        tokens: 10000,
278        id: 'pro_plan',
279      },
280      pro_plan_yearly: {
281        priceId: paddleConfig.products.PRO_PLAN_YEARLY.priceId,
282        tokens: 10000,
283        id: 'pro_plan_yearly',
284      },
285    };
286
287    // ---- Paddle Ready ----
288    window.addEventListener('paddle-ready', () => { paddleReady = true; });
289    const checkInterval = setInterval(() => {
290      if (window.Paddle) { paddleReady = true; clearInterval(checkInterval); }
291    }, 100);
292    setTimeout(() => clearInterval(checkInterval), 10000);
293
294    // ---- Auth check (lazy) ----
295    let authPromise = null;
296    function ensureAuth() {
297      if (!authPromise) {
298        authPromise = fetch('/api/auth/user')
299          .then(r => r.json())
300          .then(data => { if (data.authenticated) user = data.user; return user; })
301          .catch(() => null);
302      }
303      return authPromise;
304    }
305
306    // ---- Checkout ----
307    async function openCheckout(productId) {
308      if (!paddleReady || !window.Paddle?.Checkout?.open) {
309        alert('Payment system is still loading. Please wait a moment and try again.');
310        return;
311      }
312
313      const u = await ensureAuth();
314      if (!u) {
315        window.location.href = '/api/auth/login?returnTo=' + encodeURIComponent(window.location.pathname + window.location.search);
316        return;
317      }
318
319      const product = PRODUCTS[productId];
320      if (!product) { console.error('Unknown product', productId); return; }
321
322      const checkoutConfig = {
323        items: [{ priceId: product.priceId, quantity: 1 }],
324        customData: {
325          user_id: u.sub,
326          product_id: product.id,
327          tokens: product.tokens.toString(),
328        },
329        customer: { email: u.email },
330        settings: { successUrl: window.location.origin + '/payment-success' },
331      };
332
333      if (couponCode) {
334        checkoutConfig.discountCode = couponCode;
335      }
336
337      window.Paddle.Checkout.open(checkoutConfig);
338
339      if (typeof window.gtag === 'function') {
340        window.gtag('event', 'begin_checkout', {
341          item_id: product.id,
342          item_category: 'subscription',
343          coupon: couponCode || undefined,
344        });
345      }
346    }
347
348    // ---- Wire Up CTA Buttons ----
349    // Pro monthly/yearly CTAs use data-checkout-product attribute
350    document.querySelectorAll('[data-checkout-product]').forEach(el => {
351      el.addEventListener('click', (e) => {
352        e.preventDefault();
353        const productId = el.getAttribute('data-checkout-product');
354        openCheckout(productId);
355      });
356    });
357
358    // ---- Billing Toggle ----
359    const STORAGE_KEY = 'ato_pricing_billing_cycle';
360    const toggle = document.getElementById('billing-toggle');
361    if (toggle) {
362      const inputs = toggle.querySelectorAll('input[name="billing"]');
363
364      const applyCycle = (cycle) => {
365        document.documentElement.dataset.billingCycle = cycle;
366        try { localStorage.setItem(STORAGE_KEY, cycle); } catch {}
367
368        document.querySelectorAll('[data-billing-show]').forEach((el) => {
369          const showFor = el.getAttribute('data-billing-show');
370          const shouldShow = showFor === cycle;
371          el.classList.toggle('hidden', !shouldShow);
372          // Clear inline display style so flex wrapper divs (yearly row) become visible.
373          // BUT skip data-price-original spans — those are coupon-gated and manage
374          // their own display independently (hidden until a discount is applied).
375          if (shouldShow && !el.hasAttribute('data-price-original')) {
376            el.style.removeProperty('display');
377          }
378          el.setAttribute('aria-hidden', String(!shouldShow));
379        });
380
381        // Sync discount badges visibility with billing cycle
382        const monthlyBadge = document.querySelector('[data-discount-badge="pro"]');
383        const yearlyBadge = document.querySelector('[data-discount-badge-yearly="pro"]');
384        if (monthlyBadge && monthlyBadge.textContent) {
385          monthlyBadge.classList.toggle('hidden', cycle !== 'monthly');
386        }
387        if (yearlyBadge && yearlyBadge.textContent) {
388          yearlyBadge.classList.toggle('hidden', cycle !== 'yearly');
389        }
390
391        document.querySelectorAll('.coupon-inline-badge').forEach(el => {
392           const isMatch = el.getAttribute('data-billing-show') === cycle;
393           el.classList.toggle('hidden', !isMatch);
394        });
395
396        document.querySelectorAll('[data-badge-container]').forEach(el => {
397           const showFor = el.getAttribute('data-badge-container');
398           const badgeSpan = showFor === 'monthly' ? monthlyBadge : yearlyBadge;
399           const isMatch = showFor === cycle;
400           const hasDiscount = badgeSpan && badgeSpan.textContent;
401           el.classList.toggle('hidden', !(isMatch && hasDiscount));
402        });
403      };
404
405      const initCycle = (() => {
406        try {
407          const saved = localStorage.getItem(STORAGE_KEY);
408          return saved === 'yearly' || saved === 'monthly' ? saved : 'monthly';
409        } catch { return 'monthly'; }
410      })();
411
412      inputs.forEach((input) => {
413        input.checked = input.value === initCycle;
414        input.addEventListener('change', () => {
415          if (input.checked) applyCycle(input.value);
416        });
417      });
418
419      applyCycle(initCycle);
420    }
421
422    // ---- Price Preview (discount) ----
423    function calcDiscountPercent(originalStr, discountedStr) {
424      const orig = parseFloat(originalStr.replace(/[^0-9.]/g, ''));
425      const disc = parseFloat(discountedStr.replace(/[^0-9.]/g, ''));
426      if (!orig || !disc || orig <= disc) return 0;
427      return Math.round(((orig - disc) / orig) * 100);
428    }
429
430    async function fetchPricePreview(code) {
431      if (!code) return;
432
433      const monthlyDisplay = document.querySelector('[data-billing-show="monthly"][data-price-display="pro"]');
434      const yearlyDisplay = document.querySelector('[data-billing-show="yearly"][data-price-display="pro"]');
435      
436      const originalMonthlyHTML = monthlyDisplay ? monthlyDisplay.innerHTML : '';
437      const originalYearlyHTML = yearlyDisplay ? yearlyDisplay.innerHTML : '';
438
439      const loaderHtml = `<span class="inline-block w-6 h-6 border-4 border-gray-200 border-t-purple-500 rounded-full animate-spin relative top-1"></span>`;
440      
441      if (monthlyDisplay) monthlyDisplay.innerHTML = loaderHtml;
442      if (yearlyDisplay) yearlyDisplay.innerHTML = loaderHtml;
443
444      try {
445        const res = await fetch('/api/paddle/price-preview?coupon=' + encodeURIComponent(code));
446        const data = await res.json();
447        if (!res.ok || !data.success || !data.couponValid) {
448          if (monthlyDisplay) monthlyDisplay.innerHTML = originalMonthlyHTML;
449          if (yearlyDisplay) yearlyDisplay.innerHTML = originalYearlyHTML;
450          return;
451        }
452
453        const currentCycle = document.documentElement.dataset.billingCycle || 'monthly';
454
455        // Update Pro monthly price
456        const proMonthly = data.prices?.pro_plan;
457        if (proMonthly?.discounted && proMonthly.discounted !== proMonthly.original) {
458          if (monthlyDisplay) monthlyDisplay.innerHTML = proMonthly.discounted + '<span class="font-semibold" style="font-size: 2rem;">/mo</span>';
459          const origEl = document.querySelector('[data-billing-show="monthly"][data-price-original="pro"]');
460          if (origEl) {
461            origEl.innerHTML = proMonthly.original + '<span style="font-size: 0.9em;">/mo</span>';
462            origEl.style.display = '';
463          }
464          // Show discount badge (only if monthly is active)
465          const pct = calcDiscountPercent(proMonthly.original, proMonthly.discounted);
466          if (pct > 0) {
467            const badge = document.querySelector('[data-discount-badge="pro"]');
468            if (badge) {
469              badge.textContent = pct + '% OFF';
470              if (currentCycle === 'monthly') badge.classList.remove('hidden');
471            }
472          }
473        } else {
474          if (monthlyDisplay) monthlyDisplay.innerHTML = originalMonthlyHTML;
475        }
476
477        // Update Pro yearly price
478        const proYearly = data.prices?.pro_plan_yearly;
479        if (proYearly?.discounted && proYearly.discounted !== proYearly.original) {
480          if (yearlyDisplay) yearlyDisplay.innerHTML = proYearly.discounted + '<span class="font-semibold" style="font-size: 2rem;">/yr</span>';
481          const origEl = document.querySelector('[data-billing-show="yearly"][data-price-original="pro"]');
482          if (origEl) {
483            origEl.innerHTML = proYearly.original + '<span style="font-size: 0.9em;">/yr</span>';
484            origEl.style.display = '';
485          }
486          // Show discount badge (only if yearly is active)
487          const pct = calcDiscountPercent(proYearly.original, proYearly.discounted);
488          if (pct > 0) {
489            const badge = document.querySelector('[data-discount-badge-yearly="pro"]');
490            if (badge) {
491              badge.textContent = pct + '% OFF';
492              if (currentCycle === 'yearly') badge.classList.remove('hidden');
493            }
494          }
495        } else {
496          if (yearlyDisplay) yearlyDisplay.innerHTML = originalYearlyHTML;
497        }
498
499        // Show the inline coupon badges now that fetching is done
500        document.querySelectorAll('.coupon-inline-badge').forEach(el => {
501          if (el.getAttribute('data-billing-show') === currentCycle) {
502            el.classList.remove('hidden');
503          }
504        });
505
506        // Ensure the parent Flex containers for the badges aren't hidden
507        const monthlyContainer = document.getElementById('monthly-badge-container');
508        const yearlyContainer = document.getElementById('yearly-badge-container');
509        const monthlyBadge = document.querySelector('[data-discount-badge="pro"]');
510        const yearlyBadge = document.querySelector('[data-discount-badge-yearly="pro"]');
511
512        if (monthlyContainer && monthlyBadge && monthlyBadge.textContent) {
513           monthlyContainer.classList.toggle('hidden', currentCycle !== 'monthly');
514        }
515        if (yearlyContainer && yearlyBadge && yearlyBadge.textContent) {
516           yearlyContainer.classList.toggle('hidden', currentCycle !== 'yearly');
517        }
518      } catch {
519          if (monthlyDisplay) monthlyDisplay.innerHTML = originalMonthlyHTML;
520          if (yearlyDisplay) yearlyDisplay.innerHTML = originalYearlyHTML;
521      }
522    }
523
524    // ---- "Grab the deal" Button ----
525    const btn = document.getElementById('promo-apply-btn');
526    if (btn) {
527      const coupon = btn.getAttribute('data-coupon') || 'welcome15';
528
529      const setAppliedState = () => {
530        btn.classList.remove('bg-yellow-300', 'text-purple-900', 'hover:bg-yellow-200');
531        btn.classList.add('bg-[#FEFCD0]', 'text-emerald-950', 'hover:bg-[#FEFCD0]');
532        btn.setAttribute('aria-disabled', 'true');
533        btn.classList.add('pointer-events-none');
534        btn.innerHTML = `
535          <span class="inline-flex items-center justify-center gap-2">
536            Coupon applied
537            <svg class="w-5 h-5" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true">
538              <path fill-rule="evenodd" d="M16.704 5.29a1 1 0 010 1.42l-7.5 7.5a1 1 0 01-1.42 0l-3.5-3.5a1 1 0 011.42-1.42l2.79 2.79 6.79-6.79a1 1 0 011.42 0z" clip-rule="evenodd" />
539            </svg>
540          </span>
541        `;
542
543        // Show the coupon badge inside the Pro card
544        showCouponBadgeInCard(coupon);
545      };
546
547      btn.addEventListener('click', (e) => {
548        e.preventDefault();
549        couponCode = coupon;
550        setAppliedState();
551        fetchPricePreview(coupon);
552        if (typeof window.gtag === 'function') {
553          window.gtag('event', 'discount_offer_clicked', { coupon });
554        }
555      });
556    }
557
558    // ---- Show coupon badge inside the Pro plan card ----
559    function showCouponBadgeInCard(code) {
560      // Find the Pro plan card (the one with the billing toggle)
561      const billingToggle = document.getElementById('billing-toggle');
562      if (!billingToggle) return;
563      const card = billingToggle.closest('.flex.flex-col.h-full');
564      if (!card) return;
565
566      // Clean up previous dynamic badges
567      card.querySelectorAll('.coupon-inline-badge').forEach(el => el.remove());
568      
569      const createInlineBadge = () => {
570         const span = document.createElement('span');
571         span.className = 'coupon-inline-badge hidden inline-flex items-center gap-1.5 bg-blue-100 text-blue-700 font-bold px-2.5 py-0.5 rounded-full text-xs border border-blue-200 uppercase tracking-wider whitespace-nowrap';
572         span.innerHTML = `
573          <svg class="w-3.5 h-3.5 text-blue-600" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true">
574            <path fill-rule="evenodd" d="M16.704 5.29a1 1 0 010 1.42l-7.5 7.5a1 1 0 01-1.42 0l-3.5-3.5a1 1 0 011.42-1.42l2.79 2.79 6.79-6.79a1 1 0 011.42 0z" clip-rule="evenodd" />
575          </svg>
576          ${code} applied
577         `;
578         return span;
579      };
580
581      const monthlyBadge = card.querySelector('[data-discount-badge="pro"]');
582      const yearlyBadge = card.querySelector('[data-discount-badge-yearly="pro"]');
583
584      if (monthlyBadge) {
585         const badge = createInlineBadge();
586         badge.setAttribute('data-billing-show', 'monthly');
587         monthlyBadge.insertAdjacentElement('beforebegin', badge);
588      }
589      
590      if (yearlyBadge) {
591         const badge = createInlineBadge();
592         badge.setAttribute('data-billing-show', 'yearly');
593         yearlyBadge.insertAdjacentElement('beforebegin', badge);
594      }
595    }
596
597    // ---- On Load: apply ?coupon= from the URL, or the default promo code ----
598    // Auto-applying the default code means visitors who never click "Grab the
599    // deal" (e.g. going straight to a Pro checkout button) still get the
600    // discount, instead of silently paying full price.
601    let urlCoupon = '';
602    try {
603      const urlParams = new URLSearchParams(window.location.search);
604      urlCoupon = urlParams.get('coupon');
605    } catch (e) {}
606
607    const defaultCoupon = document.getElementById('promo-apply-btn')?.getAttribute('data-coupon') || '';
608    const activeCoupon = urlCoupon || defaultCoupon;
609
610    if (activeCoupon) {
611      couponCode = activeCoupon;
612      const btn = document.getElementById('promo-apply-btn');
613      if (btn) {
614        // If there's a button, update it to applied state
615        btn.classList.remove('bg-yellow-300', 'text-purple-900', 'hover:bg-yellow-200');
616        btn.classList.add('bg-[#FEFCD0]', 'text-emerald-950', 'hover:bg-[#FEFCD0]');
617        btn.setAttribute('aria-disabled', 'true');
618        btn.classList.add('pointer-events-none');
619        btn.innerHTML = `
620          <span class="inline-flex items-center justify-center gap-2">
621            Coupon applied
622            <svg class="w-5 h-5" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true">
623              <path fill-rule="evenodd" d="M16.704 5.29a1 1 0 010 1.42l-7.5 7.5a1 1 0 01-1.42 0l-3.5-3.5a1 1 0 011.42-1.42l2.79 2.79 6.79-6.79a1 1 0 011.42 0z" clip-rule="evenodd" />
624            </svg>
625          </span>
626        `;
627      }
628      showCouponBadgeInCard(activeCoupon);
629      fetchPricePreview(activeCoupon);
630    }
631  })();
632})();</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.