> ## Documentation Index
> Fetch the complete documentation index at: https://learn.actionist.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Billing & plans

> Choose Basic or Pro, subscribe in one browser round-trip, and monitor your workspace usage. Your automation keeps running even during payment hiccups.

<div className="mxp-hero xc-border">
  <div className="exp-eyebrow mxp-rise">BILLING & PLANS</div>

  <h2 className="mxp-hero-title mxp-rise" style={{animationDelay:'0.06s'}}>
    Unlock your agents in{' '}

    <span style={{background:'linear-gradient(90deg,#24A4FF,#9000FF,#E3008E)',WebkitBackgroundClip:'text',backgroundClip:'text',color:'transparent'}}>
      one browser round-trip.
    </span>
  </h2>

  <p className="mxp-hero-dek mxp-rise" style={{animationDelay:'0.13s'}}>
    Two plans, transparent pricing fetched live, Stripe-hosted checkout. Sign in, pick a plan, finish in your browser. Actionist is waiting on the dashboard when you return.
  </p>
</div>

<div className="w-full py-10 xc-rise">
  <div className="actionist-tight flex flex-col gap-2 mb-6">
    <span className="actionist-section-eyebrow">The plans</span>

    <h2 className="text-2xl md:text-3xl font-semibold tracking-tight text-gray-900 dark:text-gray-50">
      Basic for individuals. Pro for teams.
    </h2>

    <p className="text-base text-gray-600 dark:text-gray-400 max-w-3xl">
      Start with Basic for individual usage, or choose Pro for team workspaces, higher Actionist usage, and paid add-ons. Select a plan below to see what comes with it.
    </p>
  </div>

  <div className="xbl-plans exp-tool-shell xc-try">
    <div className="mxp-srch-chips">
      <label htmlFor="xbl-p1"><input className="mxp-r" type="radio" name="xbl-plan" id="xbl-p1" defaultChecked />Basic</label>
      <label htmlFor="xbl-p2"><input className="mxp-r" type="radio" name="xbl-plan" id="xbl-p2" />Pro</label>
    </div>

    {/* ---- BASIC panel ---- */}

    <div className="xbl-panel xbl-panel-basic">
      <div className="xbl-plan-header" style={{marginTop:'18px'}}>
        <div>
          <span className="xbl-plan-header-name">Basic</span>
          <span className="xbl-plan-header-blurb" style={{marginLeft:'10px'}}>For individual operators</span>
        </div>
      </div>

      <div className="xbl-plan-card">
        <div className="xbl-feat">
          <strong className="xbl-feat-title">Built for solo work</strong>
          <p className="xbl-feat-body">Core Actionist usage included, resets on renewal. One seat. Ideal for individual operators running their own agents and workflows.</p>
        </div>

        <div className="xbl-feat">
          <strong className="xbl-feat-title">What's included</strong>
          <p className="xbl-feat-body">Full agent and workflow execution, computer use, schedules, MCP integrations, and the marketplace. Everything you need to run a productive solo workspace.</p>
        </div>

        <div className="xbl-feat">
          <strong className="xbl-feat-title">Usage resets monthly</strong>
          <p className="xbl-feat-body">Your included Actionist budget resets at the start of each billing cycle. The usage bar in Settings shows exactly how much you've spent and when it resets.</p>
        </div>

        <div className="xbl-feat">
          <strong className="xbl-feat-title">No add-ons</strong>
          <p className="xbl-feat-body">Basic does not support overage, extra credits, or capacity add-ons. When the monthly budget is exhausted, automation pauses until renewal. To continue immediately, upgrade to Pro.</p>
        </div>
      </div>
    </div>

    {/* ---- PRO panel ---- */}

    <div className="xbl-panel xbl-panel-pro">
      <div className="xbl-plan-header" style={{marginTop:'18px',borderColor:'rgb(144 0 255 / 0.35)'}}>
        <div>
          <span className="xbl-plan-header-name">Pro</span>
          <span className="mxp-stream-event" style={{margin:'0 0 0 8px',padding:'2px 8px',fontSize:'9.5px',fontWeight:'700',animation:'none',verticalAlign:'middle',letterSpacing:'0.07em'}}>Team</span>
          <span className="xbl-plan-header-blurb" style={{marginLeft:'10px'}}>For workspaces with multiple agents running all day</span>
        </div>
      </div>

      <div className="xbl-plan-card">
        <div className="xbl-feat">
          <strong className="xbl-feat-title">Built for teams</strong>
          <p className="xbl-feat-body">Higher included Actionist usage, pooled across the whole team. Designed for workspaces where multiple people run agents throughout the day.</p>
        </div>

        <div className="xbl-feat">
          <strong className="xbl-feat-title">Pooled team budget</strong>
          <p className="xbl-feat-body">Pro pools usage across the whole team rather than allocating it per person. One shared bucket means a heavy-use day for one agent doesn't strand another.</p>
        </div>

        <div className="xbl-feat">
          <strong className="xbl-feat-title">Overage safety valve</strong>
          <p className="xbl-feat-body">Pro workspaces can enable the overage toggle so automation continues past the included budget, up to the plan's hard ceiling. You decide when to flip the switch.</p>
        </div>

        <div className="xbl-feat">
          <strong className="xbl-feat-title">Seats, credits, and add-ons</strong>
          <p className="xbl-feat-body">Seat management, extra credit top-ups, and capacity add-ons are coming soon. You'll see their placeholder cards in the billing details page today.</p>
        </div>
      </div>
    </div>
  </div>
</div>

{/* TODO(image): plan-gate. IMAGE SPEC: Full-screen SubscriptionRequiredBrandNewPage: eyebrow 'Plans & Pricing', headline 'Choose the right Actionist package.', two plan cards side by side (Basic left, Pro right), each showing monthly price, benefit lines, and CTA button ('Start with Basic' / 'Choose Pro'). Show the 'Actionist usage' explainer card partially below. Dark theme. Replace this CSS mock with the real screenshot */}

<div className="mxp-window xbl-mock xbl-mock-plan-gate" style={{boxShadow:'none'}}>
  <div className="mxp-window-bar">
    <span className="mxp-window-dot" />

    <span className="mxp-window-dot" />

    <span className="mxp-window-dot" />

    <span className="mxp-window-title">Plans & Pricing</span>
  </div>

  <div className="xbl-mock-body">
    <div className="xbl-mock-eyebrow">PLANS & PRICING</div>
    <div className="xbl-mock-headline">Choose the right Actionist package.</div>

    <div className="xbl-mock-plan-row">
      <div className="xbl-mock-plan-card" style={{borderColor:'rgb(72 110 255/0.4)'}}>
        <div className="xbl-mock-plan-name">Basic</div>
        <div className="xbl-mock-plan-price">\$ ,  /mo</div>

        <div className="xbl-mock-plan-lines">
          <div className="xbl-mock-row" />

          <div className="xbl-mock-row xbl-mock-row-short" />

          <div className="xbl-mock-row" />
        </div>

        <div className="xbl-mock-plan-btn xbl-mock-plan-btn-basic">Start with Basic</div>
      </div>

      <div className="xbl-mock-plan-card" style={{borderColor:'rgb(144 0 255/0.45)'}}>
        <div className="xbl-mock-plan-name">Pro <span className="mxp-stream-event" style={{margin:'0 0 0 6px',padding:'2px 8px',fontSize:'9.5px',fontWeight:'700',animation:'none',verticalAlign:'middle',letterSpacing:'0.07em'}}>Team</span></div>
        <div className="xbl-mock-plan-price">\$ ,  /mo</div>

        <div className="xbl-mock-plan-lines">
          <div className="xbl-mock-row" />

          <div className="xbl-mock-row xbl-mock-row-short" />

          <div className="xbl-mock-row" />
        </div>

        <div className="xbl-mock-plan-btn xbl-mock-plan-btn-pro">Choose Pro</div>
      </div>
    </div>

    <div style={{borderRadius:'10px',border:'1px dashed rgb(200 200 215)',padding:'14px 16px 10px',background:'rgb(0 0 0/0.015)',opacity:0.6}}>
      <div className="xbl-mock-row xbl-mock-row-short" style={{marginBottom:'6px'}} />

      <div className="xbl-mock-row" />
    </div>
  </div>
</div>

<hr className="xc-divider" />

<div className="w-full py-10 xc-rise">
  <div className="actionist-tight flex flex-col gap-2 mb-6">
    <span className="actionist-section-eyebrow">First-time setup</span>

    <h2 className="text-2xl md:text-3xl font-semibold tracking-tight text-gray-900 dark:text-gray-50">
      From sign-in to running agents.
    </h2>

    <p className="text-base text-gray-600 dark:text-gray-400 max-w-3xl">
      Every workspace needs an active subscription before agents, workflows, and scheduled runs execute. Here's what happens the first time you open Actionist.
    </p>
  </div>

  <div className="xbl-checkout-pipe">
    <div className="mxp-pipe">
      <div className="mxp-pipe-node">
        <strong>Plan gate appears</strong>
        <span>No active subscription detected on launch. The full-screen plan-selection page loads with live pricing from the server.</span>
      </div>

      <div className="mxp-pipe-link" />

      <div className="mxp-pipe-node">
        <strong>Pick your plan</strong>
        <span>Review Basic or Pro. Click <em>Start with Basic</em> or <em>Choose Pro</em>: button title reflects the live plan name.</span>
      </div>

      <div className="mxp-pipe-link d2" />

      <div className="mxp-pipe-node">
        <strong>Stripe in browser</strong>
        <span>Checkout opens in your default browser. The app stays on the plan page. Actionist never sees your card number.</span>
      </div>

      <div className="mxp-pipe-link d3" />

      <div className="mxp-pipe-node">
        <strong>2-second polling</strong>
        <span>The app checks every 2 seconds (up to 2 minutes) for subscription activation. An amber banner confirms polling is running.</span>
      </div>

      <div className="mxp-pipe-link d4" />

      <div className="mxp-pipe-node">
        <strong>Dashboard</strong>
        <span>Stripe confirms. Polling detects the active subscription and navigates straight to the dashboard. Agents ready.</span>
      </div>
    </div>
  </div>

  <div className="exp-surface-grid" style={{marginTop:'22px'}}>
    <div className="exp-surface-tile">
      <strong>Keep the app open.</strong> After clicking the plan button, the Stripe checkout opens in your browser. Do not close the Actionist app. It is polling in the background and will navigate automatically on success.
    </div>

    <div className="exp-surface-tile">
      <strong>Polling window: 2 minutes.</strong> If Stripe confirmation takes longer than usual, an amber banner reads <em>"Billing has not updated yet. If checkout is complete, refresh."</em> Click <strong>Refresh</strong>: it is not a failure, not a new charge.
    </div>

    <div className="exp-surface-tile">
      <strong>Cancelled checkout.</strong> If you close or cancel the Stripe checkout, Actionist returns to the plan-selection page. No charge was made. Click a plan button to start again.
    </div>
  </div>

  <div className="mt-8">
    <Steps>
      <Step title="The plan-selection page appears" icon="layers">
        On first launch (or after sign-out), Actionist detects no active subscription and shows the full-screen plan-selection page. The eyebrow reads <strong>Plans & Pricing</strong>; the headline reads <strong>Choose the right Actionist package.</strong> Pricing and plan details load live from the server.
      </Step>

      <Step title="Pick your plan" icon="mouse-pointer-2">
        Review the two plan cards. Compare features in the table below the cards. Click <strong>Start with Basic</strong> or <strong>Choose Pro</strong>: whichever matches your needs. The button title reflects the plan name from the live plan data.
      </Step>

      <Step title="Complete checkout in your browser" icon="external-link">
        Actionist opens the Stripe checkout in your default browser. The app itself stays on the plan-selection page. Do not close it. Stripe handles all payment details; Actionist never sees your card number.
      </Step>

      <Step title="The app polls while you check out" icon="loader">
        Actionist checks every two seconds (for up to two minutes) whether your subscription has activated. You'll see a <strong>"Waiting for billing to finish. This usually updates automatically after checkout."</strong> banner. You don't need to do anything.
      </Step>

      <Step title="You land on the dashboard" icon="check">
        Once Stripe confirms the payment, polling detects the active subscription and navigates you straight to the dashboard. Your agents and workflows are now available.
      </Step>
    </Steps>
  </div>

  <Warning>
    If you close or cancel the Stripe checkout, Actionist returns to the plan-selection page. No charge was made. Click a plan button to start again.
  </Warning>

  <Note>
    If the two-minute polling window expires before Stripe confirms, an amber banner appears: <strong>"Billing has not updated yet. If checkout is complete, refresh."</strong> Click the <strong>Refresh</strong> button. This re-checks subscription status without restarting checkout. It means Stripe confirmation took longer than usual, not that payment failed.
  </Note>
</div>

{/* TODO(image): checkout-polling. IMAGE SPEC: The plan-selection gate page while polling is active: the amber 'Waiting for billing to finish. This usually updates automatically after checkout.' banner visible at the bottom of the plan cards, conveying the in-app feedback during browser checkout. Replace this CSS mock with the real screenshot */}

<div className="mxp-window xbl-mock xbl-mock-checkout-polling" style={{boxShadow:'none'}}>
  <div className="mxp-window-bar">
    <span className="mxp-window-dot" />

    <span className="mxp-window-dot" />

    <span className="mxp-window-dot" />

    <span className="mxp-window-title">Actionist · checkout in progress</span>
  </div>

  <div className="xbl-mock-body">
    <div className="xbl-mock-plan-row" style={{marginBottom:'12px'}}>
      <div className="xbl-mock-plan-card xbl-mock-plan-card-sm" style={{borderColor:'rgb(72 110 255/0.4)'}}>
        <div className="xbl-mock-plan-name">Basic</div>

        <div className="xbl-mock-plan-lines">
          <div className="xbl-mock-row" />

          <div className="xbl-mock-row xbl-mock-row-short" />
        </div>
      </div>

      <div className="xbl-mock-plan-card xbl-mock-plan-card-sm" style={{borderColor:'rgb(144 0 255/0.45)'}}>
        <div className="xbl-mock-plan-name">Pro</div>

        <div className="xbl-mock-plan-lines">
          <div className="xbl-mock-row" />

          <div className="xbl-mock-row xbl-mock-row-short" />
        </div>
      </div>
    </div>

    <div className="xbl-mock-amber-banner">
      <span className="xbl-mock-amber-dot" />

      Waiting for billing to finish. This usually updates automatically after checkout.
    </div>
  </div>
</div>

<div id="managing-billing" className="w-full py-10 xc-rise">
  <div className="actionist-tight flex flex-col gap-2 mb-6">
    <span className="actionist-section-eyebrow">Usage lifecycle</span>

    <h2 className="text-2xl md:text-3xl font-semibold tracking-tight text-gray-900 dark:text-gray-50">
      What happens when you approach the limit.
    </h2>

    <p className="text-base text-gray-600 dark:text-gray-400 max-w-3xl">
      Actionist tracks your usage in three states. Each state shows a different banner and unlocks different actions. The gradient bar in Settings mirrors real-time spend. Select a state to see the full picture:
    </p>
  </div>

  <div className="xbl-meter exp-tool-shell xc-try">
    <div className="mxp-srch-chips">
      <label htmlFor="xbl-m1"><input className="mxp-r" type="radio" name="xbl-state" id="xbl-m1" defaultChecked />Healthy</label>
      <label htmlFor="xbl-m2"><input className="mxp-r" type="radio" name="xbl-state" id="xbl-m2" />Warning, approaching limit</label>
      <label htmlFor="xbl-m3"><input className="mxp-r" type="radio" name="xbl-state" id="xbl-m3" />Exhausted, automation paused</label>
    </div>

    {/* ---- HEALTHY ---- */}

    <div className="xbl-state xbl-state-healthy">
      <div className="xbl-bar-track">
        <div className="xbl-bar-fill xbl-bar-fill-healthy">
          <span className="xbl-bar-pct">38%</span>
        </div>
      </div>

      <div className="xbl-cat-bar" title="Category breakdown">
        <div className="xbl-cat-seg" style={{flexGrow:1.8,background:'#486EFF'}} title="Agent runs — largest share of budget" />

        <div className="xbl-cat-seg" style={{flexGrow:1.1,background:'#9000FF'}} title="Computer use" />

        <div className="xbl-cat-seg" style={{flexGrow:0.7,background:'#C800B3'}} title="Schedules and triggers" />

        <div className="xbl-cat-seg" style={{flexGrow:0.4,background:'#24A4FF'}} title="Browser usage" />
      </div>

      <div className="xbl-cat-legend">
        <span><i style={{background:'#486EFF'}} />agent runs</span>
        <span><i style={{background:'#9000FF'}} />computer use</span>
        <span><i style={{background:'#C800B3'}} />schedules</span>
        <span><i style={{background:'#24A4FF'}} />browser</span>
      </div>

      <div className="xbl-bar-meta">
        <span>38% of included budget used</span>
        <span>Resets on <code>Jul 11</code></span>
      </div>

      <div className="xbl-banner xbl-banner-healthy">
        No banner shown in the healthy state. Usage is well within the included budget. The gradient fill bar runs cyan to purple as you approach the ceiling.
      </div>
    </div>

    {/* ---- WARNING ---- */}

    <div className="xbl-state xbl-state-warning">
      <div className="xbl-bar-track">
        <div className="xbl-bar-fill xbl-bar-fill-warning">
          <span className="xbl-bar-pct">78%</span>
        </div>
      </div>

      <div className="xbl-cat-bar">
        <div className="xbl-cat-seg" style={{flexGrow:2.2,background:'#486EFF'}} />

        <div className="xbl-cat-seg" style={{flexGrow:1.4,background:'#9000FF'}} />

        <div className="xbl-cat-seg" style={{flexGrow:0.9,background:'#C800B3'}} />

        <div className="xbl-cat-seg" style={{flexGrow:0.5,background:'#FF8C00'}} />
      </div>

      <div className="xbl-cat-legend">
        <span><i style={{background:'#486EFF'}} />agent runs</span>
        <span><i style={{background:'#9000FF'}} />computer use</span>
        <span><i style={{background:'#C800B3'}} />schedules</span>
        <span><i style={{background:'#FF8C00'}} />browser</span>
      </div>

      <div className="xbl-bar-meta">
        <span>78% of included budget used</span>
        <span>Resets on <code>Jul 11</code></span>
      </div>

      <div className="xbl-banner xbl-banner-warning">
        <strong>Approaching usage limit</strong>: You are close to your included monthly budget. Automation may pause when the limit is reached.
      </div>
    </div>

    {/* ---- EXHAUSTED ---- */}

    <div className="xbl-state xbl-state-exhausted">
      <div className="xbl-bar-track">
        <div className="xbl-bar-fill xbl-bar-fill-exhausted">
          <span className="xbl-bar-pct">100%</span>
        </div>
      </div>

      <div className="xbl-cat-bar">
        <div className="xbl-cat-seg" style={{flexGrow:2.4,background:'#FF4444'}} />

        <div className="xbl-cat-seg" style={{flexGrow:1.5,background:'#9000FF'}} />

        <div className="xbl-cat-seg" style={{flexGrow:0.9,background:'#C800B3'}} />

        <div className="xbl-cat-seg" style={{flexGrow:0.2,background:'#FF8C00'}} />
      </div>

      <div className="xbl-cat-legend">
        <span><i style={{background:'#FF4444'}} />agent runs</span>
        <span><i style={{background:'#9000FF'}} />computer use</span>
        <span><i style={{background:'#C800B3'}} />schedules</span>
        <span><i style={{background:'#FF8C00'}} />browser</span>
      </div>

      <div className="xbl-bar-meta">
        <span>100%, budget exhausted</span>
        <span>Resets on <code>Jul 11</code></span>
      </div>

      <div className="xbl-banner xbl-banner-exhausted">
        <strong>Usage limit reached. Automation paused.</strong> Your included budget is used up. Click <strong>Manage billing</strong> to resume. Pro workspaces can enable the overage toggle to continue up to the hard ceiling. Basic workspaces must upgrade or wait for the billing cycle to reset.
      </div>
    </div>
  </div>

  <Note>
    Usage is calculated as: <code>(used + reserved) ÷ hard ceiling × 100</code>. Reserved budget is usage allocated to in-progress runs but not yet billed; it counts against your ceiling immediately. The per-category breakdown below the bar shows which types of action consumed the most budget. For example, agent runs versus computer use.
  </Note>

  <Note>
    Hitting the usage limit does not cut off a running agent. The current step finishes and results are saved. Only new credit-based actions pause. If a time-sensitive run is in progress and your budget is close to exhausted, it will complete. It is only the next queued run that waits.
  </Note>

  <div className="xc-quote">
    <p>The usage bar tells you what automation costs. Your calendar tells you what it bought.</p>
    <span>Felix · Finance & Ops, on checking the billing page after a busy automations week</span>
  </div>
</div>

<hr className="xc-divider" />

<div className="w-full py-10 xc-rise">
  <div className="actionist-tight flex flex-col gap-2 mb-6">
    <span className="actionist-section-eyebrow">Settings</span>

    <h2 className="text-2xl md:text-3xl font-semibold tracking-tight text-gray-900 dark:text-gray-50">
      Plan, usage, and payment, all in one place.
    </h2>

    <p className="text-base text-gray-600 dark:text-gray-400 max-w-3xl">
      Open Settings in the sidebar, then navigate to Billing. The compact overview card shows your plan name, status, and usage percentage at a glance. Click <strong>View billing details</strong> to open the full billing page.
    </p>
  </div>

  <AccordionGroup>
    <Accordion title="Plan card" icon="credit-card" defaultOpen={true}>
      The plan card at the top of the billing details page shows your plan name (Basic or Pro), the subscription status pill (active, trialing, past due), the current billing period, and your next renewal date and invoice.

      * <strong>Basic workspaces</strong> see an <strong>Upgrade to Pro</strong> button.
      * <strong>Pro workspaces</strong> see a <strong>Manage billing</strong> button.

      <Note>
        "Upgrade to Pro" opens the Stripe billing portal. It does not take you back to the plan-selection page. The plan-selection checkout only appears when no active subscription exists. All plan changes once subscribed are handled through the Stripe portal.
      </Note>
    </Accordion>

    <Accordion title="Alert banners" icon="bell">
      Actionist surfaces time-sensitive billing events as coloured banners directly on the billing details page. You will see at most one banner at a time, prioritised by urgency:

      | Banner                                      | What it means                                                                                    |
      | ------------------------------------------- | ------------------------------------------------------------------------------------------------ |
      | **Approaching usage limit**                 | You are close to your included monthly budget. Automation may pause when the limit is reached.   |
      | **Usage limit reached. Automation paused**  | Your included budget is used up. Click **Manage billing** to resume.                             |
      | **Payment failed**                          | Stripe could not charge your payment method. Update it in the portal to keep automation running. |
      | **Subscription paused. Automation stopped** | The subscription is paused. Open the portal to reactivate.                                       |
      | **Payment past due. Grace period active**   | A payment is overdue, but automation is still running. See the grace period section below.       |
    </Accordion>

    <Accordion title="Usage card" icon="chart-column">
      The usage card shows how much of your included monthly budget has been consumed. The gradient fill bar runs from cyan to purple as you approach the ceiling. Below the bar:

      * <strong>Resets on</strong>: the date your usage allowance refreshes.
      * An optional message from the server when you are in the warning or exhausted state.
      * <strong>Per-category breakdown</strong>: a segmented colour bar showing which types of action consumed the most budget (e.g. agent runs vs. computer use).

      Usage is calculated as: `(used + reserved) ÷ hard ceiling × 100`. Reserved budget is usage that has been allocated to in-progress runs but not yet billed; it counts against your ceiling immediately.
    </Accordion>

    <Accordion title="Browser usage panel" icon="globe">
      Browser usage (consumed by computer-use actions that drive a real browser) is tracked separately from the main Actionist budget. The browser usage panel shows credit units and event counts broken down by provider:

      * <strong>Agent Browser</strong>: Actionist's built-in browser automation
      * <strong>Browserbase</strong>: cloud browser sessions
      * <strong>Verification</strong>: browser-based verification flows

      This panel is informational. The cost is controlled via your agent's tool configuration, not a separate billing toggle.

      <Note>
        If no browser actions ran in the current period, the panel shows <strong>"No browser usage reported this period."</strong>
      </Note>
    </Accordion>

    <Accordion title="Seats, credits, and add-ons" icon="layers">
      The billing details page includes placeholder cards for <strong>Seats</strong>, <strong>Extra Credits</strong>, and <strong>Add-ons</strong>. These sections are not yet active:

      * Seats management is coming soon.
      * Extra credits ("Extra credits are on the way") are coming soon.
      * Add-ons ("Add-ons are coming soon") are coming soon.
    </Accordion>

    <Accordion title="Payment card and Stripe portal" icon="lock">
      The payment card confirms: <strong>"Managed securely in the Stripe billing portal."</strong> It also shows your next invoice date. Click <strong>Open billing portal</strong> to open the Stripe-hosted portal in your browser, where you can:

      * Update your payment method
      * Download past invoices
      * Cancel or reactivate your subscription
      * Change your plan

      The Stripe portal opens via a server-generated session link. Actionist never stores or transmits payment method details.
    </Accordion>
  </AccordionGroup>
</div>

{/* TODO(image): billing-details. IMAGE SPEC: /settings/billing-new full view: plan hero card with 'Pro' name badge and 'Active' status pill, gradient usage bar at approximately 60% with per-category colour breakdown below it, 'Resets on' date footer, and the 'Open billing portal' button visible in the payment card. Dark theme. Replace this CSS mock with the real screenshot */}

<div className="mxp-window xbl-mock xbl-mock-billing-details" style={{boxShadow:'none'}}>
  <div className="mxp-window-bar">
    <span className="mxp-window-dot" />

    <span className="mxp-window-dot" />

    <span className="mxp-window-dot" />

    <span className="mxp-window-title">settings / billing</span>
  </div>

  <div className="xbl-mock-body xbl-mock-body-settings">
    <div className="xbl-mock-settings-card">
      <div className="xbl-mock-settings-card-header">
        <span className="xbl-mock-plan-name" style={{marginBottom:0}}>Pro</span>
        <span className="xbl-mock-settings-status-pill">Active</span>
      </div>

      <div className="xbl-mock-row xbl-mock-row-short" style={{marginBottom:'10px'}} />

      <div className="xbl-mock-bar-track">
        <div className="xbl-mock-bar-fill" style={{width:'60%'}} />
      </div>

      <div className="xbl-mock-cat-bar-sm">
        <div style={{flexGrow:2,background:'#486EFF',height:'100%',borderRadius:'999px 0 0 999px'}} />

        <div style={{flexGrow:1.4,background:'#9000FF',height:'100%'}} />

        <div style={{flexGrow:0.8,background:'#C800B3',height:'100%'}} />

        <div style={{flexGrow:0.4,background:'#24A4FF',height:'100%',borderRadius:'0 999px 999px 0'}} />
      </div>

      <div className="xbl-mock-row xbl-mock-row-tiny" />
    </div>

    <div className="xbl-mock-settings-card" style={{display:'flex',flexDirection:'column',justifyContent:'flex-end'}}>
      <div className="xbl-mock-row xbl-mock-row-short" style={{marginBottom:'8px'}} />

      <div className="xbl-mock-row xbl-mock-row-tiny" style={{marginBottom:'14px'}} />

      <div className="mxp-stream-event" style={{borderRadius:'8px',padding:'7px 14px',animation:'none',fontSize:'12px',display:'block',textAlign:'center',marginTop:'8px',cursor:'default',letterSpacing:'normal',textTransform:'none',fontWeight:'600'}}>Open billing portal</div>
    </div>
  </div>
</div>

<div className="w-full py-10 xc-rise">
  <div className="actionist-tight flex flex-col gap-2 mb-6">
    <span className="actionist-section-eyebrow">Pro feature</span>

    <h2 className="text-2xl md:text-3xl font-semibold tracking-tight text-gray-900 dark:text-gray-50">
      Overage toggle, keep going past the limit.
    </h2>
  </div>

  <p className="text-base text-gray-600 dark:text-gray-400 max-w-3xl mb-6">
    When your workspace's included monthly budget is exhausted, automation pauses by default. Pro workspaces can change this behaviour with the overage toggle in Settings. Billing. Turning overage on lets automation continue past your included budget up to the plan's hard ceiling. The hard ceiling prevents runaway costs; you cannot exceed it.
  </p>

  <div className="exp-surface-grid">
    <div className="exp-surface-tile">
      <strong>Pro only.</strong> The overage toggle appears only on Pro workspaces. The toggle section is labelled <em>"Usage overage"</em> with the description: <em>"Allow the workspace to continue after the included monthly allowance, up to the plan's safety limit."</em>
    </div>

    <div className="exp-surface-tile">
      <strong>Hard ceiling.</strong> Even with overage enabled, the plan's hard ceiling caps total spend. You decide when to flip the switch, but you can never exceed the safety limit.
    </div>

    <div className="exp-surface-tile">
      <strong>Basic cannot enable overage.</strong> When a Basic workspace exhausts its monthly budget, automation pauses. Options: upgrade to Pro (which unlocks the overage toggle), or wait for the billing cycle to reset. Basic does not support add-ons or extra credits.
    </div>
  </div>

  <Note>
    The overage toggle appears only on Pro workspaces. Basic workspaces do not see this toggle.
  </Note>
</div>

<div className="w-full py-10 xc-rise">
  <div className="actionist-tight flex flex-col gap-2 mb-6">
    <span className="actionist-section-eyebrow">Payment resilience</span>

    <h2 className="text-2xl md:text-3xl font-semibold tracking-tight text-gray-900 dark:text-gray-50">
      A missed payment doesn't kill your agents.
    </h2>
  </div>

  <p className="text-base text-gray-600 dark:text-gray-400 max-w-3xl mb-6">
    If Stripe cannot collect payment on renewal, your subscription moves to a grace period rather than suspending immediately. During the grace period, automation continues and the workspace behaves normally. The only visible change is an amber warning banner.
  </p>

  <div className="mxp-window" style={{maxWidth:'640px'}}>
    <div className="mxp-window-bar">
      <span className="mxp-window-dot" />

      <span className="mxp-window-dot" />

      <span className="mxp-window-dot" />

      <span className="mxp-window-title">settings / billing</span>
    </div>

    <div className="mxp-window-body" style={{minHeight:'auto',padding:'16px 20px'}}>
      <div className="mxp-stream-line mxp-s1">
        <span className="mxp-stream-time">banner</span>
        <span className="mxp-stream-text"><em>Payment past due, grace period active</em></span>
      </div>

      <div className="mxp-stream-line mxp-s2">
        <span className="mxp-stream-time">detail</span>
        <span className="mxp-stream-text">Update your payment method before <em>Jul 18</em> to avoid interruption.</span>
      </div>

      <div className="mxp-stream-line mxp-s3">
        <span className="mxp-stream-time">action</span>
        <span className="mxp-stream-text">Click <em>Manage billing</em> or <em>Open billing portal</em> → update card.</span>
      </div>

      <div className="mxp-stream-line mxp-s4">
        <span className="mxp-stream-time">status</span>
        <span className="mxp-stream-text">Automation still running. Agents still executing. No interruption yet.<span className="mxp-caret" /></span>
      </div>
    </div>
  </div>

  <Warning>
    During the grace period you will see: <strong>"Payment past due — grace period active"</strong> followed by <strong>"Update your payment method before \[date] to avoid interruption."</strong> Click <strong>Manage billing</strong> or <strong>Open billing portal</strong> and update your payment method before the deadline. Once the grace period ends, the subscription suspends and automation stops.
  </Warning>

  <p className="text-base text-gray-600 dark:text-gray-400 max-w-3xl mt-6">
    If a payment attempt fails after checkout (separate from the grace period), you will see a different banner: <strong>"Payment failed — We couldn't charge your payment method. Update it to keep your automation running."</strong> Both resolve the same way. Open the Stripe portal and update your card.
  </p>
</div>

{/* TODO(image): grace-banner. IMAGE SPEC: Close-up of the compact BillingCardNew component in the Settings overview sidebar, showing the orange 'Payment past due, grace period active' warning banner with a deadline date visible. Dark theme. Crop tightly to the card. Replace this CSS mock with the real screenshot */}

<div className="mxp-window xbl-mock xbl-mock-grace-banner" style={{boxShadow:'none'}}>
  <div className="mxp-window-bar">
    <span className="mxp-window-dot" />

    <span className="mxp-window-dot" />

    <span className="mxp-window-dot" />

    <span className="mxp-window-title">settings / overview · billing card</span>
  </div>

  <div className="xbl-mock-body" style={{padding:'16px 18px'}}>
    <div style={{borderRadius:'12px',border:'1px solid rgb(255 140 0/0.45)',padding:'14px 16px',background:'rgb(255 140 0/0.04)',maxWidth:'360px'}}>
      <div className="xbl-mock-settings-card-header">
        <span className="xbl-mock-plan-name" style={{fontSize:'13px',marginBottom:0}}>Pro</span>
        <span style={{fontSize:'10px',fontWeight:'700',textTransform:'uppercase',letterSpacing:'0.07em',padding:'2px 9px',borderRadius:'999px',background:'rgb(255 140 0/0.12)',border:'1px solid rgb(255 140 0/0.45)',color:'rgb(160 80 0)'}}>past due</span>
      </div>

      <div className="xbl-mock-amber-banner" style={{gap:'8px',borderRadius:'8px',padding:'8px 12px',fontSize:'12px',color:'rgb(160 80 0)',marginBottom:'8px'}}>
        <span className="xbl-mock-amber-dot" style={{width:'7px',height:'7px',animation:'none'}} />

        <span>Payment past due, grace period active</span>
      </div>

      <div style={{fontSize:'11.5px',color:'rgb(100 60 0)',padding:'0 2px'}}>Update by <strong>Jul 18</strong> to avoid interruption</div>
    </div>
  </div>
</div>

<hr className="xc-divider" />

<div className="w-full py-10 xc-rise">
  <div className="actionist-tight flex flex-col gap-2 mb-6">
    <span className="actionist-section-eyebrow">Multiple workspaces</span>

    <h2 className="text-2xl md:text-3xl font-semibold tracking-tight text-gray-900 dark:text-gray-50">
      Switching workspaces skips checkout.
    </h2>
  </div>

  <Note>
    If you belong to more than one Actionist workspace, a workspace switcher appears at the bottom of the plan-selection gate page. Selecting a workspace that already has an active subscription switches your context immediately. No checkout required. This saves you from going through account settings when you are simply in the wrong workspace.
  </Note>
</div>

<div className="w-full py-10 xc-rise">
  <div className="actionist-tight flex flex-col gap-2 mb-6">
    <span className="actionist-section-eyebrow">Best practices</span>

    <h2 className="text-2xl md:text-3xl font-semibold tracking-tight text-gray-900 dark:text-gray-50">
      Tips for a smooth billing experience.
    </h2>
  </div>

  <AccordionGroup>
    <Accordion title="Keep the app open during checkout" icon="monitor" defaultOpen={true}>
      After clicking "Start with Basic" or "Choose Pro", the Stripe checkout opens in your browser. Do not close the Actionist app while completing checkout. The app is polling in the background and will navigate you to the dashboard automatically once Stripe confirms, no manual refresh needed in most cases.
    </Accordion>

    <Accordion title="If the 2-minute polling window expires" icon="clock">
      If checkout takes longer than expected, an amber banner reads <strong>"Billing has not updated yet. If checkout is complete, refresh."</strong> Click the <strong>Refresh</strong> button. This re-checks your subscription status without restarting checkout or making a new charge. It is not a failure. It means Stripe confirmation was delayed.
    </Accordion>

    <Accordion title="'Upgrade to Pro' opens the Stripe portal" icon="circle-arrow-up">
      Once you have an active subscription, the plan-selection page does not appear again. The <strong>Upgrade to Pro</strong> button on the billing details page (visible only on Basic) takes you directly to the Stripe portal where you can switch plans. The two-card plan selection is only for first-time subscribers.
    </Accordion>

    <Accordion title="Basic cannot enable overage" icon="shield-off">
      When a Basic workspace exhausts its monthly budget, automation pauses. Options: upgrade to Pro (which unlocks the overage toggle), or wait for the billing cycle to reset. There is no way to continue automation on Basic without upgrading or waiting. Basic does not support add-ons or extra credits.
    </Accordion>

    <Accordion title="Automation doesn't stop mid-run when a limit is hit" icon="activity">
      Hitting the usage limit does not cut off a running agent. The current step finishes and results are saved. Only new credit-based actions pause. If a time-sensitive run is in progress and your budget is close to exhausted, it will complete. It is only the next queued run that waits.
    </Accordion>

    <Accordion title="Billing data is visible to admins only" icon="lock">
      Non-admin workspace members do not see billing cards in Settings. If you need to check usage, change the plan, or update payment details, you must be logged in as a workspace admin. If someone in your team cannot see the billing page, this is the most likely reason.
    </Accordion>
  </AccordionGroup>
</div>

<div className="w-full py-8 xc-rise">
  {/* TODO(image): limits-page. IMAGE SPEC: /billing/limits page: eyebrow 'Plan limits · explained', the two-path side-by-side cards (Basic in a blue gradient on the left, Pro in a purple gradient on the right), and the first FAQ accordion ('Will an agent stop mid-run if I hit my Actionist usage limit?') open with the answer visible. Dark theme. Replace this CSS mock with the real screenshot */}

  <div className="mxp-window xbl-mock xbl-mock-limits-page" style={{boxShadow:'none'}}>
    <div className="mxp-window-bar">
      <span className="mxp-window-dot" />

      <span className="mxp-window-dot" />

      <span className="mxp-window-dot" />

      <span className="mxp-window-title">Plan limits · explained</span>
    </div>

    <div className="xbl-mock-body" style={{paddingBottom:0}}>
      <div className="xbl-mock-eyebrow">PLAN LIMITS · EXPLAINED</div>

      <div className="xbl-mock-plan-row">
        <div className="xbl-mock-limit-card" style={{background:'linear-gradient(135deg,rgb(72 110 255/0.09),rgb(36 164 255/0.07))',borderColor:'rgb(72 110 255/0.38)'}}>
          <div style={{fontSize:'13px',fontWeight:'660',marginBottom:'10px',color:'rgb(40 40 40)'}}>Basic</div>

          <div className="xbl-mock-row" />

          <div className="xbl-mock-row xbl-mock-row-short" />
        </div>

        <div className="xbl-mock-limit-card" style={{background:'linear-gradient(135deg,rgb(144 0 255/0.09),rgb(200 0 179/0.07))',borderColor:'rgb(144 0 255/0.42)'}}>
          <div style={{fontSize:'13px',fontWeight:'660',marginBottom:'10px',color:'rgb(40 40 40)'}}>Pro</div>

          <div className="xbl-mock-row" />

          <div className="xbl-mock-row xbl-mock-row-short" />
        </div>
      </div>

      <div style={{borderTop:'1px solid rgb(210 210 225)',padding:'14px 0 16px'}}>
        <div style={{fontSize:'12.5px',fontWeight:'600',color:'rgb(30 30 30)',marginBottom:'10px'}}>Will an agent stop mid-run if I hit my Actionist usage limit?</div>

        <div style={{paddingLeft:'4px'}}>
          <div className="xbl-mock-row" />

          <div className="xbl-mock-row xbl-mock-row-short" />
        </div>
      </div>
    </div>
  </div>

  <div className="max-w-3xl mt-6">
    <Check>
      Actionist has a dedicated limits explainer page that answers what happens when you hit a limit on Basic, what happens on Pro, and how to keep your workspace moving. From the plan-selection gate, click <strong>"Read it"</strong> under the "What happens when I hit a limit?" card to open it directly.
    </Check>

    <Card title="Plan limits explained" icon="book-open" horizontal>
      What's paused, what isn't, and how to get unblocked on Basic and Pro. Open Actionist and click <strong>Read it</strong> on the "What happens when I hit a limit?" card on the plan-selection page.
    </Card>
  </div>
</div>

<div className="w-full py-10">
  <div className="actionist-cta-panel xc-border">
    <div className="relative z-10 flex flex-col gap-5 max-w-3xl">
      <h2 className="text-2xl md:text-3xl font-semibold tracking-tight text-white leading-tight">
        One round-trip to a running workspace.
      </h2>

      <p className="text-base md:text-lg text-white/85">
        Sign in, pick a plan, finish in your browser. Actionist has your agents ready on the other side.
      </p>

      <div className="flex flex-wrap items-center gap-3 pt-2">
        <a className="actionist-cta-btn-primary" href="https://app.actionist.ai" target="_blank" rel="noreferrer">
          Open the Dashboard

          <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2.2" strokeLinecap="round" strokeLinejoin="round">
            <path d="M5 12h14" />

            <path d="m12 5 7 7-7 7" />
          </svg>
        </a>

        <a className="actionist-cta-btn-secondary" href="mailto:support@actionist.ai">
          Email the team
        </a>
      </div>
    </div>
  </div>
</div>

<div className="w-full pt-4 pb-8 xc-rise">
  <p className="actionist-trust-line">
    Payments handled by Stripe. Actionist never stores payment details.<br />
    Grace periods protect your automation. Usage visible before it's a problem.
  </p>
</div>

<div className="w-full pb-20 xc-rise">
  <div className="actionist-tight flex flex-col gap-2 mb-6">
    <span className="actionist-section-eyebrow">Keep going</span>

    <h2 className="text-2xl md:text-3xl font-semibold tracking-tight text-gray-900 dark:text-gray-50">
      Next steps.
    </h2>
  </div>

  <Columns cols={4}>
    <Card title="Getting started" icon="rocket" href="/Folders/getting-started">
      Install Actionist, sign in, and run your first workflow, picking up right after checkout.
    </Card>

    <Card title="Agents" icon="users" href="/Folders/agents">
      Your subscription unlocks agent execution. Start building your first AI employee.
    </Card>

    <Card title="Schedules" icon="calendar-clock" href="/Folders/schedules">
      Schedules require an active subscription to execute. Set up recurring runs here.
    </Card>

    <Card title="Settings" icon="settings" href="/Folders/settings">
      The Settings overview shows your compact billing card: plan name, status, and usage at a glance.
    </Card>
  </Columns>
</div>
