import { ArrowDownIcon } from '@heroicons/react/outline' import { ArrowUpRight } from 'lucide-react' import { NextSeo } from 'next-seo' import dynamic from 'next/dynamic' import { useRouter } from 'next/router' import { useEffect, useState } from 'react' import ReactTooltip from 'react-tooltip' import { Button } from 'ui' import DefaultLayout from '~/components/Layouts/Default' import PricingPlans from '~/components/Pricing/PricingPlans' import { useOrganizations } from '~/data/organizations' const PricingComputeSection = dynamic(() => import('~/components/Pricing/PricingComputeSection')) const PricingAddons = dynamic(() => import('~/components/Pricing/PricingAddons')) const PricingComparisonTable = dynamic(() => import('~/components/Pricing/PricingComparisonTable')) const PricingFAQs = dynamic(() => import('~/components/Pricing/PricingFAQs')) const CTABanner = dynamic(() => import('~/components/CTABanner')) export default function IndexPage() { const router = useRouter() const { asPath } = useRouter() const [mounted, setMounted] = useState(false) const meta_title = 'Pricing & Fees | Supabase' const meta_description = 'Explore Supabase fees and pricing information. Find our competitive pricing Plans, with no hidden pricing. We have a generous Free Plan for those getting started, and Pay As You Go for those scaling up.' useEffect(() => { setTimeout(() => { setMounted(true) }, 200) }, []) // Ability to scroll into pricing sections like storage useEffect(() => { /** * As we render a mobile and a desktop row for each item and just display based on screen size, we cannot navigate by simple id hash * on both mobile and desktop. To handle both cases, we actually need to check screen size */ const hash = asPath.split('#')[1] if (!hash) return let device = 'desktop' if (window.matchMedia('screen and (max-width: 1024px)').matches) { device = 'mobile' } const element = document.querySelector(`#${hash}-${device}`) if (element) { element.scrollIntoView({ behavior: 'smooth' }) } }, [asPath]) const { isLoading, organizations } = useOrganizations() const hasExistingOrganizations = !isLoading && organizations.length > 0 return (

Predictable pricing,
designed to scale

Start building for free, collaborate with your team, then scale to millions of users

{mounted && ( )}
) }