import { createFileRoute, useNavigate } from "@tanstack/react-router"; import { AutumnProvider, useCustomer } from "autumn-js/react"; import { useEffect, useState } from "react"; import { useSession } from "@/lib/auth-client"; import { getStandardErrorMessage } from "@/client/lib/error-messages"; import { getSubscribeRouteState } from "@/client/features/billing/route-state"; import { AUTUMN_MANAGED_SERVICE_ACCESS_FEATURE_ID, AUTUMN_PAID_PLAN_ID, } from "@/shared/billing"; export const Route = createFileRoute("/_authenticated/subscribe")({ component: SubscribePage, }); function SubscribePage() { return ( ); } function SubscribePageContent() { const navigate = useNavigate(); const { data: session } = useSession(); const [isAttaching, setIsAttaching] = useState(false); const [error, setError] = useState(null); const customerQuery = useCustomer({ queryOptions: { enabled: Boolean(session?.user?.id), }, }); const hasManagedServiceAccess = Boolean( customerQuery.data?.flags?.[AUTUMN_MANAGED_SERVICE_ACCESS_FEATURE_ID], ); const subscribeRouteState = getSubscribeRouteState({ hasSession: Boolean(session?.user?.id), isCustomerLoading: customerQuery.isLoading, isCustomerError: customerQuery.isError, hasManagedServiceAccess, }); useEffect(() => { if (subscribeRouteState === "redirectToApp") { void navigate({ to: "/", replace: true }); } }, [navigate, subscribeRouteState]); if ( subscribeRouteState === "loading" || subscribeRouteState === "redirectToApp" ) { return null; } if (subscribeRouteState === "error") { return (
OpenSEO

Billing unavailable

{getStandardErrorMessage( customerQuery.error, "We couldn't verify your billing status right now. Please try again.", )}

); } async function handleSubscribe() { setError(null); setIsAttaching(true); try { await customerQuery.attach({ planId: AUTUMN_PAID_PLAN_ID, redirectMode: "always", successUrl: window.location.origin, }); } catch (err) { setError( getStandardErrorMessage( err, "We couldn't start the checkout. Please try again.", ), ); setIsAttaching(false); } } return (
OpenSEO

Get started

Base Plan $10/month
    {[ "Access to OpenSEO's managed service", "Includes $10.00 of Usage Credits each month", "Credits are consumed as you go for SEO data and AI features", ].map((item) => (
  • {item}
  • ))}
{error ?

{error}

: null}

Cancel anytime — no commitment. Powered by Stripe.

); }