Tiers and Stripe¶
Paid subscription tiers are imported from Stripe, which is the source of truth: a tier corresponds to a Stripe product, and each of the product's active prices becomes one billing cadence of that tier (monthly, yearly, one-time, …). Subscribers buy through Stripe Checkout, and subscription state is kept in sync by webhooks.
Tiers come from Stripe¶
Under LoveShack → Subscriptions → Paid Subscription Tiers, the tier list is read-only and filled by the Import tiers from Stripe button:
- Each active Stripe product becomes one tier, carrying the product's name and description.
- Each of the product's active prices becomes a billing cadence, listed indented under its tier with its amount and Stripe price ID.
- The only locally editable control is a per-tier Hide on site checkbox.
Edit names, descriptions, prices, and cadences in the Stripe dashboard, then re-import. Re-importing is idempotent and safe to repeat:
- Existing tiers are matched by their Stripe product and price IDs and updated in place — the local tier ID and hidden flag survive, so post gates and subscriber entitlements are unaffected.
- New products are appended; tiers whose prices are no longer active in Stripe are removed.
- Prices that cannot be imported are skipped with a per-price notice: inactive or deleted products, currencies outside the supported list, and metered/tiered pricing without a flat per-unit amount. Every Stripe billing interval is supported, including multi-unit cadences such as "every 3 months".
Hidden tiers
Hiding a tier removes it from every public surface — tier listings, select fields, and checkout — while keeping it fully working for existing subscribers: entitlements, webhooks, and the customer portal are unaffected. Use it to retire a plan without disturbing the people still on it.
The Friends & Family tier¶
Next to the imported tiers, Loveshack carries one built-in tier that is not for sale: Friends & Family. It has no price, is always hidden on the site, and survives Stripe re-imports because it is not stored with the imported tiers. Administrators add an account to it with a checkbox on the user's profile under Loveshack subscription; the Users table shows each account's tier in a Subscription column.
Members rank above every paid tier for post gates, so they read every subscriber-only post, while a post limited to Friends & Family stays out of paid subscribers' reach. For update products the tier is checked per product like any other, and the account has to be a confirmed subscriber. The Paid Subscription Tiers tab lists the tier with its member count.
Marketing features¶
Stripe products carry an optional marketing feature list (the bullet points shown on Stripe's own pricing tables). The import stores each product's feature names with its tier, and the tier cards on the subscription page and in the Subscriptions block list them below the description with a check mark. Edit the list on the product in the Stripe dashboard and re-import; a product without features renders no list.
Connecting Stripe¶
- Enter the Stripe secret key in LoveShack → Subscriptions.
- Copy the webhook endpoint URL shown on that screen.
- In the Stripe dashboard, add that URL as a webhook destination and select the event types listed below.
- Copy Stripe's webhook signing secret and paste it back into Loveshack.
- Click Import tiers from Stripe on the Paid Subscription Tiers tab.
Both secrets are required
Without the signing secret, Loveshack cannot verify that incoming webhooks genuinely come from Stripe, and subscription state will not update. Checkout may appear to work while access never gets granted.
Payment methods on the checkout step¶
When a subscriber chooses between Stripe and Mollie, the checkout step lists the payment methods each provider offers. Loveshack loads that list from the provider:
| Provider | Source |
|---|---|
| Stripe | The methods switched on in Stripe's default payment method configuration (Settings > Payments > Payment methods in the Stripe dashboard) |
| Mollie | The methods activated on the Mollie profile, named in the site language when Mollie supports it |
The list refreshes once a day, after the provider's key changes, and with Refresh now below the Payment methods shown field on the Providers tab, which also says when it last loaded. The field itself stays empty and shows the loaded list as its placeholder. Type into it to show your own text instead.
Stripe methods that only work in other currencies than your tiers charge in are left out, for example Pix (Brazilian real) or BLIK (Polish złoty) when all tiers are priced in euros. The list follows tier changes right away. Stripe also decides by the kind of payment, so a subscription checkout can still offer fewer methods than the list names.
Restricted Stripe keys
A restricted key needs Payment Method Configurations: Read to load the list. Without it, the checkout step shows a generic list and the Providers tab explains what is missing.
How access is granted¶
- A visitor selects a paid tier and is sent to Stripe Checkout. No account is needed first: Stripe collects the email during payment.
- On completion, Stripe fires webhook events back to the site.
- Loveshack verifies the signature, processes the event, and updates the subscriber's subscription metadata. When the payer has no account yet, one is created from the payment and marked confirmed.
- The new tier immediately governs gating, feeds, and digests.
Because access is driven by webhooks rather than by the browser returning from Checkout, a subscriber who closes the tab mid-redirect still gets access.
Paying before signing up¶
With Let visitors pay for a tier before creating an account enabled (the default), a guest who completes Checkout returns through a verification endpoint. Loveshack fetches the session from Stripe, checks that it is paid and was started by this site, and then:
- creates the subscriber account, signs the visitor in, and sends them to the page they came from when no account exists for the payer's email;
- links the payment to the existing account and emails a sign-in link when an account already exists, because Stripe does not verify that the payer owns that address.
The session's subscription is synced immediately, so access does not wait for the webhook. Each session can sign a visitor in only once. Accounts created this way use the default digest frequency, like any other new subscriber. Turn the option off to require the free sign-up and email confirmation first.
Payments that match an existing account¶
Stripe Checkout does not verify the email a payer types, so a payment made with an existing subscriber's address does not prove the payer owns that account. Loveshack therefore limits what such a payment can change:
- The account keeps the Stripe customer it is already linked to. A payment from a different Stripe customer grants access but never takes over the account's billing portal.
- A new subscription replaces the account's older ones only when it was paid by the linked customer. A payment from someone else never cancels an existing subscription.
- An account that has not confirmed its email yet receives a confirmation email instead of being confirmed by the payment. Unconfirmed accounts with a linked payment are kept by the unconfirmed-account cleanup.
Tiers are ordered by price, and every tier includes the access of all cheaper tiers: a post's gate is a minimum tier, so subscribers of that tier or any higher-priced one can view it. The billing cadence never affects access — a yearly and a monthly subscriber of the same product hold the same tier. See Gated content.
Monthly and yearly prices¶
A tier can carry more than one recurring price, for example a monthly and a yearly one. When the visible tiers offer at least two billing periods between them, the subscription page and the Subscriptions block show a toggle above the tiers, Monthly and Yearly for instance, with the first period selected. Each view lists the tiers that offer that period at that period's price, and checkout charges the price the visitor picked. With a single period across all tiers there is no toggle, and each tier shows its primary price as before.
Lifecycle events¶
Loveshack processes the subscription lifecycle, not just the initial purchase — renewals, upgrades, downgrades, and cancellations all flow through webhook handling and update the stored subscription record.
Users are linked to Stripe by email, so state also self-heals without manual work: on registration and on login, a user without a linked Stripe customer is looked up in Stripe by email address and any subscriptions found are mirrored locally. This is the fix for "they paid but the site still shows the old tier" — and it means a rebuilt site regains its subscribers' entitlements as soon as they are re-imported or log in again.
The Overview tab of LoveShack → Subscriptions shows how many users hold an active paid subscription, per tier.
Webhook events¶
Select these event types on the Stripe webhook destination:
| Event | What it drives |
|---|---|
checkout.session.completed |
Links the Stripe customer to the WordPress user and records the purchase; one-time payments become prepaid credit |
customer.subscription.created |
Creates the local subscription record and grants the tier |
customer.subscription.updated |
Keeps status, tier, and billing period in sync (upgrades, downgrades, pauses) |
customer.subscription.deleted |
Revokes the tier when a subscription ends |
subscription_schedule.created |
Records a scheduled plan change made in the customer portal |
subscription_schedule.updated |
Keeps the scheduled change in sync |
subscription_schedule.canceled |
Clears a scheduled change that was called off |
subscription_schedule.completed |
Clears the scheduled change once it has taken effect |
subscription_schedule.released |
Clears the schedule when Stripe detaches it from the subscription |
invoice.paid |
Confirms renewal periods and consumes prepaid credit |
invoice.payment_failed |
Marks the subscription record as payment-failed |
Any other event type is acknowledged and ignored, so over-selecting does no
harm beyond useless traffic. Under-selecting is the real risk: without the
customer.subscription.* events entitlements stop syncing, and without the
subscription_schedule.* events the "Scheduled change" notice in subscriber
settings goes stale.
The customer portal¶
Subscribers manage their subscription through the Stripe customer portal — changing plans or billing cadence, updating payment methods, viewing invoices, and cancelling — rather than Loveshack reimplementing billing management. The Change subscription button on their settings screen opens it; their settings screen also always shows their current tier, even when that tier has been hidden or removed from the catalog.
Since v1.3.21
The subscription section of the settings screen now leads with the current tier's name, description, and marketing features, followed by the subscription details (price, status, renewal or end date, scheduled changes, and the start date). Its Change subscription / Cancel button opens the subscription page with the tier cards; the customer portal stays reachable through the Payment methods and invoices link next to it.
Without Stripe¶
Paid tiers require Stripe — importing from Stripe is the only way tiers are created. Sites running only the free subscriber tier need no payment configuration at all.
Tiers created manually in earlier versions (including ones pointing at PayPal or an external checkout URL) keep working until the next import replaces the tier list with the Stripe catalog.
Testing¶
Before launch, run a full purchase against Stripe test keys and confirm:
- Import tiers from Stripe lists every product with its cadences
- Checkout completes and returns to the site
- The webhook is received (check the Stripe dashboard's webhook log)
- The subscriber's tier updates on
/settings/ - A post gated at that tier becomes readable — and one gated at a higher-priced tier stays locked
- Cancelling in the portal revokes access