Skip to content

Change Plan

Both directions, because only one of them is usually built: a radiogroup with the prorated charge announced as it changes, and a cancellation with the end date, what breaks, and one honest alternative offered once.

3 blocks52 lineslucide-reactAdded 10 Sept 2026

What's included

  • app/plan-change-page.tsx
  • 3 blocks it is built from, installed with it
  • Needs lucide-react

Works with

  • React
  • Next.js
  • Tailwind CSS
  • TypeScript

npx hoverlab add plan-change-page

Or over MCP, from your editor's agent — no account needed.

License

Free to read, copy and install, for personal and non-commercial projects. Shipping it in client work or a paid product needs Pro ($79 once). The source lands in your repo and stops being ours — no attribution, nothing to upgrade.

Was this useful?

Preview

Change plan

Both directions, with the charge shown before the button and the end date shown before the cancellation.

Change your plan

Choose a plan

$12.67 today, prorated to the 21st

Changes take effect immediately. Downgrades credit the unused remainder against your next invoice.

Cancel your Team plan

You can do this yourself, right here, and it takes one click once you have read what happens.

What happens, and when

  • You keep Team until 14 October 2026 — the period you have already paid for. Nothing stops today.
  • You will not be charged again, and there is no cancellation fee.
  • After that, your data is kept for 30 days and restoring is one click. It is deleted after that.

What breaks on 14 October 2026

  • API keys stop working, and any integration using them fails
  • Team members lose access to shared projects
  • Scheduled exports stop running

Delete this project?

This removes the project, its deployments and its logs. Team members lose access immediately. This cannot be undone.

The real page, rendered in your current theme — every section below is a live block, not a screenshot.

Built from

All blocks
  1. In-App Plan PickerA native radiogroup of plans with the current one disabled and the prorated charge announced as it changes — the upgrade dialog, not the marketing table.
  2. Subscription Cancel FlowSelf-serve cancellation with no dark patterns: the exact date access ends, what breaks, one honest alternative, and a button that works.
  3. Destructive Confirm DialogA type-to-confirm dialog built on native <dialog>, so the focus trap, top layer and escape handling come from the browser. Focus lands on Cancel, and the button says the verb.

Only want one section? Open it and copy that block instead — browse Pricing.

Source

app/plan-change-page.tsx
/**
 * Changing a plan, including downwards.
 *
 * `billing-page` shows what someone is on. This is the screen where they
 * change it, and the reason it is a separate page is the third block.
 *
 * Almost every billing UI ships the upgrade path and treats cancellation as
 * a support ticket. That asymmetry is the design: make leaving annoying
 * enough and some fraction stays. It also produces chargebacks, one-star
 * reviews, and — since June 2025 in the EU and under the FTC's click-to-
 * cancel rule in the US — a regulatory problem, because cancellation is
 * required to be no harder than signing up.
 *
 *   picker      a native radiogroup with the current plan disabled and the
 *               prorated charge announced as the selection changes, so the
 *               number is known before the button is pressed
 *   cancel      the exact date access ends, what breaks, one honest
 *               alternative offered once
 *   confirm     the irreversible step, stated as what it does
 *
 * The one honest alternative is the line worth defending. Offering a pause
 * or a downgrade at the moment of cancellation is legitimate and often what
 * the person actually wanted. Offering four of them, each behind its own
 * click, is a retention funnel wearing a helpfulness costume — and the
 * difference between the two is entirely in the count.
 */

import * as React from 'react'
import { PricingPlanPicker } from '@/components/pricing-plan-picker'
import { SubscriptionCancelFlow } from '@/components/subscription-cancel-flow'
import { ConfirmDialog } from '@/components/confirm-dialog'

export default function PlanChangePage() {
  return (
    <main className="min-h-screen bg-background text-foreground">
      <section className="mx-auto w-full max-w-5xl px-6 pb-2 pt-12">
        <h1 className="text-2xl font-bold tracking-tight">Change plan</h1>
        <p className="mt-1 text-sm text-muted-foreground">
          Both directions, with the charge shown before the button and the
          end date shown before the cancellation.
        </p>
      </section>

      <PricingPlanPicker />

      {/* As easy to leave as it was to arrive. */}
      <SubscriptionCancelFlow />
      <ConfirmDialog />
    </main>
  )
}

How to use it

  1. 1. Copy each of the 3 blocks above into components/ — each block page has its own copy button.
  2. 2. Drop this file at app/plan-change-page.tsx. The imports already point at @/components/…, so they resolve with no edits.
  3. 3. Delete the sections you do not want. Every block takes props, so the copy changes without the layout moving.

For AI

The component, its props, the design tokens it expects and the command that installs it — as one prompt. Paste it into Claude, Cursor, v0 or ChatGPT and what they build around it will match the rest of the catalog instead of inventing its own system.

See the prompt

More Account & Billing

Open the full page for this page

Account Settings

Profile, team, API keys and danger zone in one screen — with the destructive panel last, well away from the everyday controls.

Account & Billing5 blocks39 lines
Open the full page for this page

Billing & Usage Screen

Plan, quota meters and invoice history, with the upgrade prompt placed beside a bar that is nearly full rather than on the plan card.

Account & Billing5 blocks44 lines
Open the full page for this page

Usage & Limits

Consumption in the order the questions arrive: the overage warning first because it is time-critical, then the meters, then what actually happens at each limit.

Account & Billing4 blocks66 lines
Open the full page for this page

Invoices

Billing history laid out for finance rather than for the user — a retrieval screen, so the table leads and the payment method comes last.

Account & Billing3 blocks41 lines
Open the full page for this page

Notification Settings

Notifications from the receiving end: the inbox you arrived from, per-event and per-channel control, and the push prompt asked after the decision rather than on arrival.

Account & Billing5 blocks59 lines
Open the full page for this page

Team & Access

The admin screen a security questionnaire is really asking about — seats with the bill shown first, invitations, scopes split from bundles, sharing stated as its consequence, live sessions, and the audit trail underneath.

Account & Billing6 blocks61 lines