Staaarter

Billing App Store Receipt

A receipt card for mobile in-app subscriptions bought through the App Store or Google Play, meant to sit alongside a web billing history so a user can see everything they're charged for in one place. Shows the product, price, purchase and renewal dates, an optional Family Sharing note, and the transaction ID, with a link out to the store's own subscription management screen since neither Apple nor Google let you cancel from a web page.

By Staaarter Team
Billing
Updated January 22, 2026
Docs
Live preview

Docs

Installation

A real shadcn registry command, not a copy-paste stand-in: it fetches this block plus its badge, button dependencies and any missing npm packages, and installs them straight into your project.

npx shadcn add https://staaarter.com/r/billing-app-store-receipt.json

Prefer not to use the CLI? Copy the source from the Code toggle above into src/components/blocks/billing/billing21.tsx instead.

Usage

The file also exports billing21Demo, the exact props behind the preview above. Spread it to get a working section in one line, then replace it with your own data.

import { Billing21, billing21Demo } from "@/components/blocks/billing/billing21";

export default function Page() {
  return <Billing21 {...billing21Demo} />;
}

Props

PropTypeDefaultDescription
store"app-store" | "google-play"noneWhich store issued the receipt. Controls the header icon and label, and the store name used in the manage-subscription copy.
productNamestringnoneName of the purchased product or plan.
planLabelstringnoneOptional line under the product name, e.g. "Auto-renewing subscription".
pricestringnoneFormatted price as charged by the store, shown as-is.
purchaseDatestringnoneFormatted original purchase date.
renewalDatestringnoneFormatted next renewal date, omitted from the receipt if not passed.
status"active" | "canceled" | "expired""active"Drives the status badge in the header.
transactionIdstringnoneStore transaction identifier, shown in monospace.
familySharingbooleanfalseWhen true, shows a small Family Sharing note under the product name.
manageHrefstringnoneDeep link to the store's subscription management page. The manage button and its footnote are omitted entirely if not set.
classNamestringnoneExtra classes for the outer card.

Behavior notes

  • The store icon and label are derived internally from the store prop through a lookup table, there is no icon prop to pass in.
  • The manage button and the footnote below it only render when manageHref is provided, so a receipt with no store deep link just omits that whole footer section.
  • The footnote text always states that the subscription can only be canceled from the purchasing device, since that's a hard platform rule from Apple and Google, not something a caller can configure away.
  • The Family Sharing note is a plain boolean flag with static copy, it doesn't read anything from a receipt-validation payload itself, that mapping happens on your backend.

Frequently asked questions