diff --git a/surfsense_web/components/pricing/pricing-section.tsx b/surfsense_web/components/pricing/pricing-section.tsx index 43177e383..9d75e9a1d 100644 --- a/surfsense_web/components/pricing/pricing-section.tsx +++ b/surfsense_web/components/pricing/pricing-section.tsx @@ -1,4 +1,9 @@ +"use client"; +import React, { useRef, useEffect, useState } from "react"; +import { AnimatePresence, motion } from "motion/react"; +import { IconPlus } from "@tabler/icons-react"; import { Pricing } from "@/components/pricing"; +import { cn } from "@/lib/utils"; const demoPlans = [ { @@ -59,13 +64,280 @@ const demoPlans = [ }, ]; +interface FAQItem { + question: string; + answer: string; +} + +interface FAQSection { + title: string; + items: FAQItem[]; +} + +const faqData: FAQSection[] = [ + { + title: "Pages & Billing", + items: [ + { + question: "What exactly is a \"page\" in SurfSense?", + answer: + "A page is a simple billing unit that measures how much content you add to your knowledge base. For PDFs, one page equals one real PDF page. For other document types like Word, PowerPoint, and Excel files, pages are automatically estimated based on the file. Every file uses at least 1 page.", + }, + { + question: "How does the Pay As You Go plan work?", + answer: + "There's no monthly subscription. When you need more pages, simply purchase 1,000-page packs at $1 each. Purchased pages are added to your account immediately so you can keep indexing right away. You only pay when you actually need more.", + }, + { + question: "What happens if I run out of pages?", + answer: + "SurfSense checks your remaining pages before processing each file. If you don't have enough, the upload is paused and you'll be notified. You can purchase additional page packs at any time to continue. For cloud connector syncs, a small overage may be allowed so your sync doesn't partially fail.", + }, + { + question: "If I delete a document, do I get my pages back?", + answer: + "No. Deleting a document removes it from your knowledge base, but the pages it used are not refunded. Pages track your total usage over time, not how much is currently stored. So be mindful of what you index. Once pages are spent, they're spent even if you later remove the document.", + }, + ], + }, + { + title: "File Types & Connectors", + items: [ + { + question: "Which file types count toward my page limit?", + answer: + "Page limits only apply to document files that need processing, including PDFs, Word documents (DOC, DOCX, ODT, RTF), presentations (PPT, PPTX, ODP), spreadsheets (XLS, XLSX, ODS), ebooks (EPUB), and images (JPG, PNG, TIFF, WebP, BMP). Plain text files, code files, Markdown, CSV, TSV, HTML, audio, and video files do not consume any pages.", + }, + { + question: "How are pages consumed?", + answer: + "Pages are deducted whenever a document file is successfully indexed into your knowledge base, whether through direct uploads or file-based connector syncs (Google Drive, OneDrive, Dropbox, Local Folder). SurfSense checks your remaining pages before processing and only charges you after the file is indexed. Duplicate documents are automatically detected and won't cost you extra pages.", + }, + { + question: "Do connectors like Slack, Notion, or Gmail use pages?", + answer: + "No. Connectors that work with structured text data like Slack, Discord, Notion, Confluence, Jira, Linear, ClickUp, GitHub, Gmail, Google Calendar, Microsoft Teams, Airtable, Elasticsearch, Web Crawler, BookStack, Obsidian, and Luma do not use pages at all. Page limits only apply to file-based connectors that need document processing, such as Google Drive, OneDrive, Dropbox, and Local Folder syncs.", + }, + ], + }, + { + title: "Self-Hosting", + items: [ + { + question: "Can I self-host SurfSense with unlimited pages?", + answer: + "Yes! When self-hosting, you have full control over your page limits. The default self-hosted setup gives you effectively unlimited pages, so you can index as much data as your infrastructure supports.", + }, + ], + }, +]; + +const GridLineHorizontal = ({ + className, + offset, +}: { + className?: string; + offset?: string; +}) => { + return ( +
+ ); +}; + +const GridLineVertical = ({ + className, + offset, +}: { + className?: string; + offset?: string; +}) => { + return ( + + ); +}; + +function PricingFAQ() { + const [activeId, setActiveId] = useState+ Everything you need to know about SurfSense pages and billing. + Can't find what you need? Reach out at{" "} + + rohan@surfsense.com + +
++ {item.answer} +
+