Skip to content

Payment

Payments are handled by node3-pay-service with Stripe, Creem, and configurable plans. The usual model is: create pay channels first, map each plan to Stripe Product / Price IDs in Price Config, then bind every project (app_key) to a channel so checkout and webhooks use the right credentials.

Admin — payment channels

Admin — price config

  1. Pay Channels (/pay-channels)
    Add Stripe or Creem channels (keys, webhook secrets, etc.). One Stripe account can back one or many channel rows in Admin if you split by environment or brand.

  2. Price Config (/price-config)
    Create or edit plans: amount, billing interval, credits, feature flags. For Stripe, align each plan with Product ID and Price ID (below).

  3. Project ↔ channel binding (same Pay Channels page)
    Bind each app_key to a Stripe or Creem channel. New projects stay non-functional for payments until this binding exists—the system must know which channel credentials to use.

This lets you ship new sites quickly and reuse one Stripe catalog across many projects instead of rebuilding a full store for every launch; add or split channels when you are ready.

In the Stripe Dashboard (Products), each price has a Price ID (price_...) under a Product ID (prod_...). Admin Price Config must store the correct IDs for checkout and webhooks to line up.

To avoid manual copy/paste mistakes, use Fetch products / prices from Stripe in the price editor:

  • Calls the Stripe API using the selected pay channel’s secret key and lists products/prices you can pick and persist.
  • Prerequisites: choose the app (app_key) in the editor and ensure that app already has a Stripe channel binding in /pay-channels; otherwise fetch is blocked.
  • If you run multiple Stripe channels, you can choose which channel’s credentials to use for the catalog fetch (vs. the app’s default binding).

Fetch only wires IDs to Stripe’s catalog; customer-facing copy is still maintained in Admin (next section).

Plans support per-locale display fields (e.g. title, description, badge, feature bullets), typically stored as structured display_i18n keyed by locale (en, zh, …).

  • You author and maintain each locale’s text in the Admin UI (including any bulk / side-by-side editors). Stripe does not supply localized marketing strings for these cards.
  • Where AI Gateway is enabled, optional helpers may fill missing locales; always review before publishing.

The user-facing app picks the locale from site or user settings and falls back when a locale is missing (behavior follows the storefront implementation).

Enable Creem under Pay Channels and add the API key; project binding to that channel is still required for the app to process Creem payments. Plan fields follow Creem’s model (not Stripe Product/Price IDs—use the Admin form and API as reference).

Whenever you add a new project (app_key), open Pay Channels and confirm:

  • A binding points that app to the correct Stripe or Creem channel.
  • Keys and webhook endpoints match production.

Without a binding, checkout or webhooks may not work for that site.

  • Pay Channels (/pay-channels) — channels, project bindings, webhook guidance
  • Price Config (/price-config) — plans, Stripe fetch, localized copy, optional per-channel Stripe overrides