PromoCard: {
    attribution: string;
    body: string;
    cta: string;
    ctaTarget: "feature" | "premium" | "checkout";
    discord?: string;
    endsAt?: string;
    feature: string;
    key: string;
    limit?: string;
    link: string;
    newForSetup?: true;
    percentOff?: number;
    premium: boolean;
    requiredPlan?: string;
    startsAt?: string;
    title: string;
    trialDays?: number;
    variant: string;
}

A feature promo to render. link is a dashboard path; premium = the feature needs a paid plan or add-on.

Type declaration

  • attribution: string

    exp:<key>:<variant> - send as the checkout attribution source when this card leads to a purchase.

  • body: string
  • cta: string
  • ctaTarget: "feature" | "premium" | "checkout"

    Where the button goes. feature: link (the feature page). premium: the premium page at requiredPlan's card. checkout: start a server checkout for requiredPlan with promo: key (and attributionSource: attribution).

  • Optionaldiscord?: string

    The variant's Discord tip text, if set. Dashboard: ignore.

  • OptionalendsAt?: string
  • feature: string

    Promotable feature id, e.g. ClipForwarding.

  • key: string
  • Optionallimit?: string

    Plan-limit upsell cards only: the limit id.

  • link: string
  • OptionalnewForSetup?: true

    The automatic card is a feature added to the setup wizard since this server finished it: badge it "New for your setup".

  • OptionalpercentOff?: number

    A timed discount: show "{percentOff}% off" with a countdown to endsAt; send promo: key at checkout.

  • premium: boolean
  • OptionalrequiredPlan?: string

    The plan to sell - the one that raises the limit, or the cheapest with this premium feature ('Add-on' for add-ons).

  • OptionalstartsAt?: string

    When the discount window opened (this server first saw the card): run the countdown bar from startsAt to endsAt.

  • title: string
  • OptionaltrialDays?: number

    A free trial at checkout (promo: key): show "{trialDays} days free". Only a first subscription gets it.

  • variant: string