Overview
Piano's Stripe Billing integration combines Piano's flexible subscription management with Stripe's advanced billing infrastructure and AI-powered revenue recovery capabilities. This integration maintains Piano as your primary interface for subscription operations while leveraging Stripe's billing engine to handle payment processing, invoicing, and automated retry logic.
The Piano Subscription Management + Billing integration is now fully released and supports clients using Stripe Payments and Non-Stripe payment providers.
QuickStart Guide
Enabling Stripe Billing
The Stripe Billing integration needs to be enabled on your application by your Piano representative. Clients will be enabled in turn based on their use of Piano features. Contact your Piano representative if you have any questions.
Existing Stripe Payments clients
Your existing Stripe account used for Payments will be automatically connected to Piano's Stripe Billing Connect account if you have previously connected it, you only need to add your Stripe API keys. There is no additional setup required in Piano. You simply need to log in to your Stripe Dashboard and complete the configuration steps below.
New to Stripe Payments Clients
New Stripe clients need to create a Stripe account before configuration.
-
First create your Stripe Account (you can do this in your Piano Dashboard/Stripe Billing configuration), then configure Stripe Account and Business settings
-
Connect your Stripe Account to Piano as described in Stripe Billing Configuration in Piano (if the Stripe account was created outside Piano)
Non-Stripe Payments Clients
Clients who do not use Stripe for Payments, also need to create new Stripe account. Please contact your Piano representative to enable your Stripe Billing integration.
Required Stripe Dashboard Configuration
The Piano-Stripe integration requires a few simple configuration changes in the Stripe Dashboard so that subscriptions can be fully synchronized between the two systems. Below is an overview for both Stripe Payments and BYOP clients.
|
Setting |
Stripe Default |
Piano Guidance on default settings |
Key Risk if Misconfigured |
Client Type Applicability (Stripe Payments vs BYOP) |
|---|---|---|---|---|
|
Revenue recovery |
Smart Retries — 8 retries over 2 weeks & Enable local payment methods retries as required |
Recommended |
If using a third-party retry tool, contact your Piano representative to validate compatibility |
Stripe Payments only |
|
Invoice finalization period |
1 hour |
Recommended |
Do not change — affects renewal window and Piano sync logic |
Both |
|
Upcoming invoice events |
7 days before renewal |
Acceptable |
3 days before renewal recommended. Required for Piano-Stripe pre-renewal sync; not setting it risks out-of-sync state |
Both |
|
Invoice level rounding |
Round at invoice level |
Recommended |
Do not change to item-level — small discrepancies may cause sync failures |
Both |
|
Automatic invoice emails |
Send finalized invoices enabled |
Default not recommended |
Disable to prevent duplicate emails; critical to disable for BYOP + in case payment links are enabled on invoices to avoid double charges |
Both |
|
Invoice status (In both "Manage Failed Payment" and "Manage invoices sent to customers" sections) |
Past-due |
Default not recommended |
Set the invoice to "Uncollectible" status in both sections |
Both |
|
Subscription status (In both "Manage Failed Payment" and "Manage invoices sent to customers" sections) |
Cancel / Past-due |
Default not recommended |
Set the subscription to "Unpaid" in both sections Subscription remains active in Stripe, so Piano controls cancellation "Cancel the subscription" must NEVER be selected for BYOP as it can lead to unexpected cancelation during grace and retry |
Both |
For BYOP clients, the same settings apply as above, except Revenue Recovery settings which are not applicable to BYOP subscriptions. Please make sure to review both the Manage Failed Payments and Manage invoices sent to customers sections.
Below, you'll find the same configuration steps outlined in a step-by-step format.
Billing Settings
Revenue Recovery Settings (Only Stripe Payments clients)
In the Stripe Dashboard, navigate to Settings → Billing → Subscriptions → Revenue Recovery → Retries → Cards.
Recommended configuration:
-
Retry period: 2 weeks (to avoid overlapping periods on monthly subscriptions). Choose to retry up to 8 times in the period for best recovery results.
-
Subscription status: "Mark the subscription as unpaid"
-
Invoice status: "Mark the invoice as uncollectible"
This setting configures the same retry rules regardless of term length. To use different rules for monthly vs. annual subscriptions, use Automations to configure separate policies.
In the same section, navigate to Local Payment methods and click Manage to enable retries accordingly (e.g. if you use SEPA or other direct debit payment methods).
Invoice Settings
Invoice Finalization Rules
In the Stripe Dashboard, navigate to Settings → Billing → Invoices → Invoice finalization period and locate the Edit button next to the default rule.
Required setting:
-
Set finalization grace period to 1 hour (default)
-
Do not add additional rules
Upcoming Invoice Events
In the Stripe Dashboard, navigate to Settings → Billing → Subscriptions and emails → Prevent Failed Events → Upcoming renewal events.
Required setting:
Configure events for upcoming renewals to ensure proper validation between Piano and Stripe — this is an important integration point between the systems. Change the "Upcoming renewal events" setting to be triggered 3 days before a subscription renews.
Invoice Level Rounding
In the Stripe Dashboard, navigate to Settings → Billing → Invoices → Manual tax amount rounding.
Required setting:
If you use Piano Tax support, choose "Round manually entered taxes at invoice level". This ensures that the Invoice level rounding rules are enabled in your Stripe account Invoice settings to prevent discrepancies.
Disable Automatic Invoice Emails (Only Applicable to Non-Stripe Payments Clients)
To prevent customers from paying directly on Stripe when using a non-Stripe processor, disable automatic notifications.
In the Stripe Dashboard, navigate to Settings → Billing → Subscriptions and emails → Manage invoices sent to customers and disable the customer emails toggle for Send finalized invoices and credit notes to customers.
Stripe Payments customers can leave this enabled if desired. Make sure Stripe email rules and Piano Email Manager do not conflict or send duplicate emails. For BYOP clients, ensure no payment links are enabled on invoices — otherwise there may be double charges.
Manage Failed Payments setting
Under Settings → Billing → Subscriptions and emails, navigate to Manage Failed Payment and update the Subscription status to Unpaid and Invoice Status to Uncollectible.
Manage Invoices Sent to Customers (Only Applicable to Non-Stripe Payments Clients)
In the Stripe Dashboard, navigate to Settings → Billing → Subscriptions and emails → Manage invoices sent to customers and update the Subscription status to Unpaid and Invoice Status to Uncollectible. These settings apply to BYOP invoices since they use collection_method = send_invoice.
This is important to ensure Piano can manage BYOP grace and retry logic and handle cancellation, in no case set the Subscription status to Cancel.
Stripe Billing Configuration in Piano
Stripe Account Configuration in Piano
There may be multiple account hierarchy use cases; such as 1 to 1, 1:2 and many to 1 scenario between Piano and Stripe applications and account structures. It is important to understand the effect of multiple account configurations.
Known limitations: Stripe doesn’t currently support sharing customers and payment methods across multiple connected accounts!
Scenario 1: 1 to 1 (Supported and recommended)
Most common implementation scenario, fully supported and recommended.
Scenario 2: Many Piano apps to 1 Stripe account (Supported)
Using a single Stripe account for payment processing across multiple Piano applications is supported.
Scenario 3: 1 Piano app to 2 Stripe accounts (Unsupported DO NOT USE!)
Using multiple Stripe payment integrations connected under the same application in Piano with two different Stripe accounts for processing payments is not supported and should never be used.
How to connect Piano with Stripe Billing
Creating a new Stripe Account
You need to create Stripe account for Billing purposes even if you do not use Stripe for Payments. To do that, navigate to Piano Dashboard → Edit Business → Stripe Billing configuration → click Add and then Connect:
This will trigger Stripe onboarding flow:
Follow the instructions in the flow to create an account.
Connecting an existing Stripe Account
Clients using Stripe payments have their accounts connected automatically and presented in the Billing configuration already. If your Stripe API keys are not already added in the Payment Provider configuration, you will need to add them to connect Stripe Billing,. In case you have not yet connected your Stripe account, you will need to "Connect" in Piano.
Piano will use the account ID from your Stripe payment provider configuration to make sure that your customers and payment methods information already created in the application will be used with Billing.
In the Piano Dashboard, navigate to Edit Business → Billing Provider and click Add and then Connect to trigger the Stripe onboarding flow to authenticate your Stripe Account.
The Stripe Billing configuration is ready to use when BOTH Connected Account ID and API credentials are populated and valid.
To get your Stripe API credentials, navigate to the Stripe dashboard and login. On your Home page you can find your API keys in the top right corner:
In case you cannot see the keys on your Home page, you can also find them in the Settings → Developers → API Keys – select the Standard API keys, do not use restricted keys as these may lead to loss of functionality.
Important notes:
Stripe doesn’t currently support sharing customers and payment methods across multiple connected accounts. To prevent issues while switching to Stripe billing, it is critically important to make sure that ALL Stripe payment provider integrations in the single Piano client application (for example, Stripe Elements and Stripe Apple Pay) are connected to the same client’s Stripe account ID!
Clients already using Stripe for payments, but Stripe account is not yet connected
Clients need to connect their account for Stripe billing using Stripe billing configuration. In this case, their Stripe payment provider integrations won’t be affected.
Important note:
You must use the same Stripe account as used in payment integrations. Piano will validate the connection before setting up and will restrict saving of configuration with different account ID.
Stripe Account for Billing additional considerations
-
Once your Stripe account is connected to Piano and used for billing, you cannot change it in Stripe payment provider configuration nor in Stripe billing provider configuration. To switch to a different account, a migration on both Piano and Stripe side will be required. It is NOT recommended to change accounts in the application once connected.
-
The same connected account used across different Piano applications doesn’t guarantee that billing configurations will be created for each application. To switch all applications to Stripe, make sure each application has Stripe Billing configured.
-
After the application has been switched to Stripe billing, all new connections to Stripe made with payment provider integrations will use the same connected account ID from the Billing configuration.
-
To disconnect already connected accounts from Piano, clients need to inform their Piano and Stripe Account representatives to help organize the process of disconnecting without losing or corrupting any information.
Stripe Dashboard Navigation
Stripe dashboard can be accessed via https://dashboard.stripe.com/ for both production and sandbox instances. For more details on how Piano regional instances are connected to Stripe accounts see docs.
We recommend you learn about Stripe Dashboard features and settings. Some of those features are explained below and you should review the full Stripe documentation.
Below is a brief overview of the key places where Piano- created entities will appear.
Once you login, you will see the following view.
Home view
Transactions view
The most important and relevant tabs to navigate are Transactions, Customers, and Subscriptions. You may already be familiar with Transactions and Customers if you use Stripe for payments:
Transactions tab shows all payments executed for customers; this is what clients using Stripe Payments typically see and use, in addition to the Customers tab.
Customers view
Product Catalog view
Product Catalog stores Piano Resources and Tax Rates as Stripe Billing entities; it will show any Piano Resources converted on.
IMPORTANT: DO NOT make any changes to Product catalog directly in Stripe; this will lead to issues with syncing of the entities and events between Piano and Stripe. This also applies to all other tabs within the Product Catalog view. Clients must use Piano dashboard for all subscriber operations.
Each Product will include Piano Metadata, which should not be edited in Stripe, for more details on Metadata please see the section below.
Tax rates
Under the Tax Rates tab, clients using any of the Piano Tax support and its integrations will see manual tax rates created there automatically on any switched or newly purchased products. Do not make changes to the tax rates in Stripe; these are programmatically maintained and in sync with Piano Tax support.
Automatic Stripe Tax is not supported in the current phase and must not be enabled at this time as it will lead to conflicts across entities and integration.
Example with Piano created tax rates (these must not be changed in Stripe at any time)!:
Invoices
The Invoices tab shows all invoices for every customer and the status of each billing operation on subscriptions:
When the invoice payment is being retried, the status is updated at the individual invoice level.
Subscriptions view
Subscriptions tab will include all subscriptions including any Piano subscriptions switched to Stripe Billing and newly purchased subscriptions after Billing integration is enabled. Clicking on a subscription in the list shows details including customer email, resource (Stripe product), price, tax rate and amount, access period and a preview of the customer’s next invoice:
All of the associated data is maintained in sync with Piano. Metadata provides additional Piano context.
Important Note: Do not make any direct changes any on Piano created entities in “Actions” or on Customer and Subscription as manual changes made in Stripe Dashboard will cause out-of-sync events and subscription operations will be limited.
Out-of-sync recovery
In case a discrepancy occurs during validations, Piano will automatically cross-check all relevant states and entities to automatically correct and update the subscription as necessary to finalize the invoice accurately.
If you use Stripe Billing to directly manipulate Piano-managed Product catalog, Subscriptions or Invoices and Piano cannot cross-check entities (e.g. you create new product and/or price and add it to subscription directly in Stripe), such subscriptions will become out-of-sync. For any out-of-sync subscriptions, Piano will stop managing subscription billing and collection and will no longer show accurate subscription and transaction data and events in the Piano Dashboard.
Currently, Piano will retain active access for the customer, but the subscription will no longer be manageable in Piano and all operations except cancelation will be limited in the Piano Dashboard. Piano will keep extending access to the original subscription resource(s) only while the subscription is active in Stripe.
In case such a situation occurs, you will see a notification in the Subscription details view of such subscription as per below:
In case an out-of-sync happened from unexpected reasons (e.g. human error), please contact the Piano support team immediately and Piano support can reinstate the subscription state to make it in-sync again.
Piano monitors for data inconsistencies between its records and Stripe. If a discrepancy is identified, your Piano account team will contact you to coordinate resolution. Fully automated reconciliation is planned for a future release.
Feature Overview
New Purchases
Piano integrates existing features, including payment and checkout interfaces with Stripe Billing in addition to Stripe Payments. Overall, existing Piano dashboard and functionality will remain unchanged, unless specified.
Any new subscriptions created in Stripe Billing from a purchase in Piano Checkout or Subscribe User in the Piano Customer Service dashboard will show two transactions in the Stripe dashboard, one in ‘Cancelled’ state and one in ‘Succeeded’.
This is an expected behavior and a result of using Stripe API operations during subscription creation. At this time Stripe is not able to remove this record appearing in the dashboard, and Piano is not able to change it. This duplicated record listing is purely visual and has no impact on any subscription processing or billing. The correct payment is associated with the newly created subscription invoice. Subscribers will only see a single transaction in the Piano Dashboard and on their credit card or bank statement.
Currently, the following new purchase features are supported. For the list of unsupported features, please refer to Piano unsupported features in this section.
Resources
-
Resource creation (mapped to Product in Stripe)
-
Resources are mapped 1:1, but are not created in Stripe immediately/real-time when a new Resource is created in Piano. When a new subscription conversion is passed from Piano to Stripe, the Resource is looked up. If it doesn't exist in the Stripe Product Catalog, a new Stripe Product is created and mapped to the Piano Resource.
Payment Terms
-
Single payment (one-offs, mapped to price_data) or Recurring payment (mapped to price_data and subscription schedule)
-
Support for shared access (buyer and subscription in Billing)
-
Allow users to pay more
-
Trials (Paid trial and free trial periods, presented as 0 amount schedule phases in Stripe for free trials)
-
Promotions (Paid and free promotions, presented as net amount schedule phases)
-
Apply trial period for new customers only
-
Force all new subscriptions to be auto-renewing subscriptions
-
Restrict to first-time customers only
-
Gift purchase creates Stripe Invoice with purchase-date service period
-
Stripe recognizes gift revenue immediately based on invoice service period (purchase date)
-
Gift redemption remains fully handled by Piano
-
Every new one‑time payment creates a Stripe Invoice
-
Upgrades immediate and deferred (for more details see the Upgrades section)
Tax Support
Tax calculations made with Piano Checkout and Subscribe User tools will be used to automatically create unique manual tax rates in Stripe Billing and apply those rates to invoices and subscriptions. Likewise, any existing subscriptions will be created with manual tax rates, if you use Piano Tax support.
Rounding Rules: Generally, tax amounts calculated separately by 3rd party system may differ slightly from tax amounts applied to invoices with manual tax rates pre-created in Stripe (usually 0.01 in the smallest currency unit). That difference might take place in case of different rounding rules between the two systems applied to exclusive tax rates. For more details, see the Rounding Rules docs.
You must configure the "Invoice level" rounding in case you use Piano tax support with any tax provider. Ensure that the Invoice level rounding rules are enabled in your Stripe account Invoice settings to prevent discrepancy.
Checkout
Once you’ve configured Stripe Payments and Billing in your Piano application, you will be able to see subscriptions and purchases represented in the Stripe Dashboard.
The initial purchase is processed in Piano and then a subscription and/or invoice (one-offs) is created in Stripe Billing. From this moment on, Stripe Billing manages the billing process.
Stripe Cards, Stripe Elements, and Stripe Apple Pay are supported for checkout with Stripe-native billing. Non-Stripe payment providers are supported via Piano's BYOP feature — see the Non-Stripe Providers (BYOP) section for details. No changes are required in the system templates.
Subscribe User (via Piano Dashboard)
Subscription purchases made within the scope of supported features for this phase automatically create subscriptions and associated invoices in Stripe Billing.
Subscription Operations
The following Piano subscription management features are supported within the integration for Stripe managed subscriptions.
Update renewal payment method and billing address
The functionality to update payment method or billing address remains available and functions as it always has.
Changing payment method between Stripe and non-Stripe providers is supported via Piano's BYOP (Bring Your Own Processor) feature. See the Non-Stripe Providers (BYOP) section for full details.
Auto-renew toggle on/off
You can easily control whether a subscription renews automatically at the end of its term.
Turning Auto-Renewal OFF:When you disable auto-renewal, the system modifies the subscription billing plan to set a definitive end date—the end of the current paid period. This instructs the billing system not to generate any future invoices, ensuring the subscriber will not be charged again.
Turning Auto-Renewal ON: If you re-enable auto-renewal, the system removes that end date and restores the subscription's original, ongoing billing plan. The subscriber will be charged on their next scheduled billing date as if the setting was never changed.
Turning off auto-renewal during a grace period
When a subscriber turns off auto-renewal while their subscription is already in a grace period (a renewal payment failed and retry attempts are still running), the cancellation is deferred to the end of the current billing period — it does not take effect immediately.
Because the cancellation is deferred, payment retries continue for the open invoice throughout the remainder of the grace period. This means a retry can succeed after the subscriber has turned auto-renewal off. If the charge goes through and the subscriber did not intend it, it should be remediated with a refund.
This behavior applies to all subscriptions on Stripe Billing — both Stripe-native payment methods and BYOP (Bring Your Own Payment) integrations.
What happens step by step
-
A scheduled renewal payment fails. The subscription enters a grace period: access is retained while retries run.
-
During the grace period, the subscriber turns auto-renewal off.
-
The cancellation is scheduled for the end of the current billing period. The subscription is not cancelled immediately, and the open invoice is not voided.
-
Retries continue against the open invoice for the remainder of the grace period. If a retry succeeds, the payment is collected and the subscription is extended as normal — even though auto-renewal has been turned off. The deferred cancellation then takes effect at the next renewal date.
-
If the subscriber is charged unexpectedly, issue a refund.
The practical effect: turning auto-renewal off in a grace period stops future renewals but does not stop the in-flight retry of the currently failing payment.
BYOP note: BYOP subscriptions follow the same deferred-cancellation logic. The difference is that Piano drives the retries directly (rather than Stripe Smart Retries) and marks the invoice paid out-of-band on success.
Immediate subscription cancellation
You can cancel a subscription at any time, with the cancellation taking effect immediately.
Cancellation without a Refund: This is a direct action. Our system sends a command to immediately terminate the subscription in the billing system. Access is revoked, and all future scheduled charges are stopped.
Cancellation with a Refund: This is a two-step process to ensure financial accuracy. Our refund process remains unchanged.
First, the refund is issued through the standard process.
Once the refund is successfully processed, the system then proceeds to cancel the subscription. This sequence prevents situations where a subscription is cancelled before a refund can be properly issued.
Refunds (full and partial)
Supported, refunds are automatically reflected in Stripe, for BYOP subscriptions invoice credit notes will also be applied to accurately adjust revenue recognition in Stripe.
Changing a Subscriber's Next Billing Date
You have the full flexibility to adjust when a subscriber is next charged, either to provide a complimentary service period or to align billing dates.
When you change a subscriber's next billing date in Piano, our system adjusts their billing schedule in Stripe. We effectively end their current paid period and insert a new, complimentary (zero-price) phase that runs from the moment of the change until the new billing date you've selected. Regular billing then resumes on that new date.
Important Caveat: Because Piano creates a complimentary period to bridge the gap, if you view the subscription directly in the Stripe dashboard, you might notice it temporarily reflects a $0 price until the new billing date arrives. This is the expected behavior.
Please note: currently changing the next billing date is only supported up to 3 years ahead. Stripe Price objects only support 3-year billing intervals as maximum at the moment due to risk and chargebacks typically associated with longer billing periods.
Manual Renewal
The core Manual renewal flow in MyAccount and Dashboard is supported for Stripe payment methods (Stripe CC, Stripe Elements sync, Stripe Apple Pay) and BYOP payment methods. This covers both pre-billing renewal and grace-period escape scenarios.
Upgrading and Downgrading
For more details on Upgrades, please see the Upgrades section below. For deferred upgrades, publishers can manage the lifecycle with the following operations:
|
Operation |
Who Can Trigger |
What It Does |
|---|---|---|
|
Suspend |
Subscriber or Admin |
Pauses a deferred upgrade. The current subscription expires at end of billing period if not resumed. |
|
Resume |
Subscriber or Admin |
Reactivates a suspended upgrade. Stripe schedule restored. Auto-renewal re-enabled. |
|
Cancel |
Admin only |
Cancels the deferred upgrade. Subscription returns to ACTIVE. No cancellation of the current subscription. |
|
Abort (auto) |
System (automatic) |
If a suspended upgrade reaches billing period end without being resumed, it auto-aborts. Subscription expires at the end of the period. |
Supported payment methods within the Stripe integrations
Stripe payment integrations (Stripe Elements, Stripe Cards, Stripe Apple Pay) are fully supported as per documentation. Non-Stripe payment providers are supported via Piano's BYOP (Bring Your Own Processor) feature — see the Non-Stripe Providers (BYOP) section for configuration details below.
Payment method management
|
Change |
Behavior |
|---|---|
|
BYOP → Stripe-native |
Subscription transitions to charge-automatically. Eligible for Smart Retries. |
|
Stripe-native → BYOP |
Subscription transitions to out-of-band mode. Piano handles future charges and retries. |
|
BYOP → different BYOP |
Piano updates the payment method reference. No change to Stripe subscription. |
Non-Stripe Providers (BYOP)
BYOP (Bring Your Own Processor) enables clients to continue using their existing non-Stripe payment processor — such as Braintree or Datatrans — while Piano manages the full subscription lifecycle through Stripe Billing. In this model, Stripe acts as the subscription engine (schedules, invoices, renewal logic), while your processor handles the actual charge.
This means you get Stripe Billing's invoice and subscription scheduling — combined with your existing payment infrastructure. Note: Stripe Smart Retries only support Stripe-native payment methods. For BYOP subscriptions, Churn Prevention configured grace period and retry logic applies and continues to be managed in Piano and your processor as per the specification of your PSP integration in Piano.
BYOP renewal flow
The key difference in BYOP is which Stripe webhook event triggers subscription renewal in Piano. With Stripe-native payments, the invoice.paid event signals successful collection. With BYOP, the invoice.finalized event is used instead, since the actual payment is collected “out-of-band” by your processor.
|
Event |
Stripe-native |
BYOP |
|---|---|---|
|
|
Ignored for sync only |
Triggers Piano subscription renewal including payment request and access extension |
|
|
Triggers renewal + access extension |
Confirms payment (informational) |
|
|
Starts Smart Retry grace period |
Starts grace period; your processor retries out-of-band |
|
|
Expires Piano subscription |
Expires Piano subscription |
BYOP vs Stripe-native comparison
|
Capability |
Stripe-native |
BYOP |
|---|---|---|
|
Payment [bolder]processing |
Stripe handles charge |
Your processor handles charge, reflected as out-of-band in Stripe |
|
Subscription lifecycle |
Stripe Billing |
Stripe Billing |
|
Renewal trigger |
|
|
|
Smart Retries |
Fully supported |
Grace period only; retries managed by Piano Churn Prevention and your processor |
|
Invoice emails |
Optional (Stripe sends) |
Must be disabled — Stripe invoice cannot be paid directly on BYOP subscription to avoid double charge |
|
Multi-currency |
1 customer per currency |
1 customer per currency (same rule applies) |
|
Payment method management |
Via Piano/Stripe |
Via Piano/managed by your processor; Piano stores token reference |
Subscription Payment method changes
Clients can switch a subscriber's payment method between Stripe-native and BYOP within Piano. When switching, Piano updates the subscription's billing context and ensures the correct renewal trigger (invoice.paid vs invoice.finalized) is applied going forward. This transition is handled transparently without interrupting the subscriber's access.
Grace period
For BYOP subscriptions, the grace period is managed by Piano rather than Stripe Smart Retries. When invoice.finalized is received and your processor has not yet confirmed payment, Piano extends subscriber access for the configured grace period while your processor retries the charge. If the charge is not collected within the grace period, Piano expires the subscription.
Payment method management
Non-Stripe payment methods are stored as references in Piano. When a subscriber updates their payment method in MyAccount, the token is updated in your processor and the reference is updated in Piano. Stripe does not hold the actual payment method for BYOP subscribers.
Multi-currency and multi-customer support
Piano fully supports subscribers transacting in multiple currencies. Because Stripe requires a separate customer object per currency, Piano automatically creates and manages additional Stripe customer records where needed. This happens transparently — from your perspective, there is one subscriber; Piano handles the Stripe-side customer mapping.
This applies equally to both Stripe-native and BYOP subscribers. Your existing multi-currency business rules continue to operate as configured in Piano. In case of multiple concurrently active subscriptions in different currencies on a single subscriber, user will be asked to select currency in the MyAccount to ensure the payment method is properly associated with customer and currency in Stripe.
BYOP subscription operations
All standard Piano subscription management operations are available for BYOP subscriptions:
-
Auto-renew toggle on/off
-
Immediate cancellation (with or without refund)
-
Changing next billing date
-
Payment method update (updating token reference in your processor)
-
Subscription switching between BYOP and Stripe-native (in case you use both)
Upgrade operations for BYOP
Upgrade and downgrade operations for BYOP subscriptions follow the same 2:1 mapping as Stripe-native upgrades: Piano cancels the existing subscription and creates a new one with the target term and a proration credit applied, while in Stripe Billing subscription remains the same and a result of upgrade or downgrade is represented as an updated subscription Schedule period only, effectively retaining the same subscription. Piano calculates the proration amount, which is applied as net amount to the specified subscription schedule phase in Stripe.
Subscription Upgrades
Subscription upgrades — moving a subscriber from one term to another — are now available for all Stripe Billing managed subscriptions. Upgrades are being released concurrently with BYOP, so both capabilities are available from day one.
Upgrade model: Stripe subscription-first
Piano now uses Stripe’s subscription-first model for all upgrades. This means:
-
The subscription plan change is applied to Stripe immediately when an upgrade is initiated, subscription remains the same in Stripe.
-
Payment is collected after the subscription change — not as a prerequisite to it.
-
If payment fails, the subscriber enters a grace period with Stripe Smart Retries — the subscription change is NOT rolled back.
-
All upgrade channels (My Account, Checkout, Publisher Dashboard, API, Action Manager) behave identically.
Note: This is a behavioral change from legacy Piano billing, where immediate upgrades made via MyAccount, Dashboard and API resulted in a rollback (no charge, no change) but not Onsite Upgrades which already follow the subscription-first model. Publishers who rely on that rollback behavior should review their downstream integrations.
Supported upgrade types
-
Immediate upgrade (billing_timing=0): The plan change and payment happen at the moment of the upgrade request. Stripe creates a two-phase Subscription Schedule — Phase 1 ends immediately, Phase 2 (new plan) starts with a prorated charge.
-
End-of-billing-cycle upgrade (billing_timing=1): The plan change is scheduled to take effect at the end of the current billing period. Stripe creates a Phase 1 (current plan, runs to period end) and Phase 2 (new plan, starts at period end).
-
Payment-to-payment only: Only upgrades between payment term subscriptions are supported. Dynamic-to-payment and Scheduled-to-payment upgrade offers are not supported and must be disabled before switching.
-
Same currency: Stripe subscription currency is immutable. Cross-currency upgrades are not supported.
-
Pending upgrades: Subscriptions with an already scheduled (deferred) upgrade will not be switched to Stripe Billing until that upgrade executes or is cancelled.
Proration and payment collection
Piano calculates all proration amounts before passing them to Stripe. The proration logic is unchanged from legacy Piano billing.
Payment is collected off-session: there is no in-session payment step during the upgrade. Stripe charges the subscription’s default payment method automatically, in case of failure starts Smart Retries, else Piano starts Churn prevention on BYOP subscriptions.
Payment failure handling
If an upgrade payment fails, behavior depends on the payment method type:
-
Stripe-native and BYOP synchronous methods: Grace period starts with Piano Churn prevention on BYOP or Stripe Smart Retries attempt recovery for up to 8 retries over a configurable window on Stripe native methods. If all retries fail, the subscription follows the configured dunning policy. The subscriber retains upgraded plan access during the grace period.
-
BYOP asynchronous methods (direct debit, bank transfer): Payment failure results in immediate subscription cancellation — no grace period. Access is granted at upgrade time but revoked when the async failure is confirmed. This matches legacy Piano behavior for BYOP async. See BYOP Upgrade Operations above.
Pending upgrade management
All lifecycle operations for deferred (end-of-billing-cycle) upgrades are supported:
-
Cancel pending upgrade: The Stripe Subscription Schedule is released. Phase 2 is discarded, the subscription continues on its current plan, and auto-renewal is restored.
-
Suspend pending upgrade: The subscriber turns off auto-renewal while an upgrade is pending. The Stripe schedule end_behavior is set to cancel — if not resumed, the subscription will expire at period end.
-
Resume pending upgrade: Auto-renewal is re-enabled. The Stripe schedule is restored with Phase 1 + Phase 2.
-
Abort (automatic): If a suspended upgrade reaches the billing period end without being resumed, Stripe expires the subscription. The subscription transitions to Expires at End (EWE) and no publisher action is required.
Shared account upgrades
Upgrades for shared account (family/team) subscriptions are supported with no additional configuration required.
Supported features overview
|
Scenario |
Status |
|---|---|
|
Payment term → Payment term (upgrades and downgrades) |
✓ Supported |
|
Immediate upgrade with or without proration |
✓ Supported |
|
Deferred upgrade (end of billing period) |
✓ Supported |
|
Deferred upgrade with early access to new resource |
✓ Supported |
|
Upgrades for BYOP subscriptions |
✓ Supported |
|
Suspend / resume upgrade |
✓ Supported |
|
Upgrade cancellation (admin) |
✓ Supported |
|
Upgrades via My Account, Dashboard, API, on-site |
✓ All channels supported |
Upgrade behavior with asynchronous payments
When an upgrade is paid with an asynchronous payment method, Piano's webhooks, history events, and emails behave differently under the Stripe Billing integration than they did under the legacy billing engine. Previously, Piano confirmed the upgrade as finished at the moment it was initiated, even though the payment was still processing. Now, Piano separates the initiation of the term change from the confirmation of payment.
At the moment of upgrade, Piano sends a new "initiated" webhook set, alongside the existing payment_pending.payment_pending:
-
term_change.term_change_initiated -
subscription_ended.term_change_initiated -
subscription_created.term_change_initiated -
access_revoked.term_change_initiated -
access_granted.term_change_initiated
These reflect that the term change has taken effect while payment is still processing.
Once payment succeeds, Piano sends term_change.term_change_finished and payment_completed.payment_completed to confirm completion.
If payment fails, behavior depends on whether a grace period is configured. Under the legacy billing engine, a failed payment expired the subscription immediately, with no grace period available. Under the Stripe Billing integration, if a grace period is configured, Piano instead sends term_change.term_change_failure and term_change.term_change_grace_period_started, then falls back to the same webhook sequence used for synchronous-payment upgrades once the grace period resolves (through retry success or final failure).
This change also affects what users and publishers see directly:
-
History events: MyAccount and the Publisher Dashboard display new history events describing the pending/initiated upgrade state, for upgrades triggered from either MyAccount or the Publisher Dashboard.
-
Emails: If payment fails and a grace period is configured, users receive the standard "Subscription renewal failure" email rather than "Term change failure." Note that the grace-period paragraph within that email is intentionally suppressed in this case.
Subscription Billing
Once you have enabled Stripe Billing integration, all new purchases will result in subscription creation in Stripe, and renewals will be managed by Stripe going forward.
Revenue Recovery (Smart retries)
Clients using Stripe Payments and Billing will be able to benefit from the latest AI/ML driven retry processing which operates across cards, card-based methods and direct debits, with a 56%+ success recovery rate across failed payments. Stripe achieves this success rate because of the high volume of payments processed – 90% of cards have been seen on the Stripe network before, and Stripe stores and learns from global payment success and failure patterns.
Because Stripe uses AI/ML to power Smart retries, retry patterns will differ compared with Piano Passive Churn or other preconfigured static retry methods. One result is that there is not a set grace period, and while next attempt dates are provided with every failure, these may change depending on the opportunity to retry and success signals Stripe sees for the card across the network.
Passive Churn vs Revenue Recovery (Smart Retries) Differences
|
Passive Churn |
Smart Retries and Automations |
|
Supports charge retries with various cadences or on custom days of the grace period. |
Supports AI-driven charge retry schedule not visible to clients. |
|
Supports up to 10 retry attempts within a grace period of up to 60 days. |
Supports fixed set of 4 or 8 charge retries within 2-weeks up to 2- months periods. |
|
Supports different customizable logics based on the initial charge failure code. |
Supports AI-driven charge retry logic, optimizing retry time, cadence and cost vs. recovery ratio. |
|
Supports sending customized email notifications for each charge retry attempt. |
Supports a single version of failed renewal email notification for all charge retry attempts. |
|
Supports different grace period length per logic. |
Supports single retry period length per application in general, multiple policies with Automations. |
|
Supports term-based configurations. |
Supports single configuration for the whole application that will be applied to all types of subscriptions (weekly, monthly, annual) or multiple automations configurations. |
|
Supports retries on manually defined cadence. |
Supports AI-driven charge retry times. |
|
Supports multiple payment providers with synchronous payment methods only. |
Supports card-based methods, with separate logic for ACH and SEPA payment methods. |
Email Notifications
Existing notifications will continue to be sent even for Smart retries. As of right now, only a single renewal failure notification is available. Additional email dunning configuration are expected in later phase.
Renewal retries processing
Understanding the renewal and retry logic when using Stripe Revenue Recovery includes two key failed renewal processes:
Synchronous Payments (e.g. Cards, Apple Pay, Google Pay):
-
Renewal date arrives
-
Payment attempt made immediately
-
If successful: subscription renewed, access continued
-
If failed: Smart Retry begins, access extended until next billing date during retry period
Asynchronous Payments (e.g. Direct Debit):
-
Invoice created and finalized
-
Subscription renewed, access granted
-
Payment collection initiated
-
If payment fails: Smart Retry begins while Piano is maintaining access until the next billing date
Hard Decline handling
On any hard decline, Stripe starts Smart Retries, Piano starts grace period and sends a renewal failed notification, expecting the end-user to go to MyAccount and add a new payment method which updates the subscription default payment method in Stripe. Then Stripe tries to charge against the invoice and if the payment fails it continues Smart retries cadence as configured in Revenue Recovery settings, until successful or terminal failure resolution.
For more details on which hard declines do not trigger charges in Stripe Smart Retries until a new payment method is provided, see the Stripe docs for more details.
Payment Action Required
In some rare cases, additional authentication may be required during renewal payments, for example with 3DS re-authentication. If a renewal payment fails, the subscriber is directed to their account page to update their payment method and re-authorize the payment.
In these cases, Piano receives a Stripe payment_action_required error event, so Smart Retries do not start automatically. Instead, Piano initiates a fixed 30-day grace period and sends a Subscription Renewal Failure email every five days, up to six times, or until the payment method is updated in My Account. Once updated and re-authorized, Stripe attempts payment for the outstanding invoice, and the normal flow resumes, including Smart Retries if applicable.
Key Stripe Dashboard configurations
Revenue Recovery Settings
There are two options to configure your Revenue Recovery in Stripe Billing.
-
General Revenue Recovery settings enable configuring one global retry strategy for all subscriptions. You have the option to use Smart Retry or a fixed custom retry policy, and the option to turn on retries for Bank debits. Direct Debit retries have a preset duration and number of attempts following the bank guidelines. Piano recommends using both Smart Retry and Bank debit retries.
-
Automations settings enable configuring flexible retry strategies to be configured differently for two different subscription periods.
Recommended General Revenue Recovery settings
When setting up a Smart retry policy for subscriptions, the recommended period is up to 1 month, to avoid overlapping periods on monthly subscriptions.
Additionally set the Subscription Status to "Mark the subscription as unpaid" and Invoice status to "Mark the invoice as uncollectible"
Overlapping period
If you set 2 months for the retries policy, overlapping periods may occur and affect the processing behavior of the subscription renewal and access.
Automations
If you wish to configure different retry strategies for Monthly vs Annual subscription types navigate to Automations.
Then set name and trigger, and in the conditions choose Subscription interval is, and set it to Yearly. Should you wish to treat Monthly subscriptions differently, repeat the setup for Monthly.
In the second step select or create the desired retry policy relevant for the subscription type and set the Subscription status and Invoice status as follows:
Then "Add action" to "Mark subscription unpaid", followed by another action to "Mark invoice uncollectable", then click Publish. Your final setup should appear as follows:
Non-Stripe Payment providers and Dual Retry run
Please note in case you are migrating from 3rd party provider to Stripe, and Dual Retry run is recommended, do not configure Automations, only use the general Revenue recovery as described above: Set the Subscription cancelation strategy to "Mark subscription unpaid" and Invoice status to "Mark invoice uncollectible" to ensure fallback retry logic in Piano can attempt retrying the legacy tokens for the optimal success on any migrated card retries.
For BYOP subscription retries, Passive Churn in Piano continues to be used. Any Smart Retry configurations will not affect subscription fail and retry logic managed by Piano.
Invoice Settings
Invoice event configuration
Invoice events are key validation and integration points for Piano and Stripe Billing. It is required that you configure the "Upcoming renewal events" to 3 days before.
Invoice finalization grace period configuration
Invoice finalization settings:
-
Go To Settings (SETTINGS > BILLING > INVOICES)
-
Select Billing in the Product setting section
-
Go to Invoices, Scroll down to Invoice finalization period
-
Check if your rule is configured to 1 hour, in case there is no rule, add a rule
-
This determines the length of time between invoice being first created and when the invoice becomes finalized and sent to the user. It is required that this setting is set to 1 hour as per default.
-
There should not be any other rules for invoice finalization grace period configured.
Disable invoice emails (if using non-Stripe payment provider)
To prevent customers from paying directly on Stripe, disable automatic notifications if you process payments on a third-party processor through BYOP. Navigate to Settings > Billing > Subscriptions and emails > Manage invoices sent to customers to disable automatic emails: Disable "Send finalized invoices and credit notes to customers".
If you are using Stripe Payments you have the option to leave this setting enabled.
Manage invoices sent to customers settings (if using non-Stripe Payment provider)
Under Settings → Billing → Subscriptions and emails. These settings apply to BYOP invoices since they use collection_method = send_invoice. Default Stripe values are recommended for both Subscription and Invoice statuses.
Stripe Reporting
Available Stripe Reports for Piano Clients
To learn about the Stripe reports, please refer to https://docs.stripe.com/stripe-reports.
Dashboard Financial Reports
Balance Summary Report
Piano Data Present: All Piano transactions converted to Stripe PaymentIntents and invoices
Metadata Included: Piano transaction IDs, application context, user identifiers
Use Case: Reconcile Stripe balance with Piano transaction history
Revenue by Customer Report
Piano Data Present: Piano users mapped to Stripe customers with Piano metadata
Customer Mapping: Piano User ID, application context
Use Case: Track revenue across Piano user base with Piano context preserved
Revenue by Product Report
Piano Data Present: Piano Resources mapped to Stripe Products
Product Metadata: Piano Resource IDs, titles
Use Case: Analyze revenue across Piano Resources/products with native Piano categorization
Billing-Specific Reports
Subscription Analytics Report
Piano Data Present: Piano subscriptions mapped to Stripe subscription schedules
Subscription Context: Piano Term information, subscription metadata, lifecycle data
Metrics Available: Customer lifetime value calculated on Piano subscription data
Note: Stripe supports free trials only, because of that Piano map both free and paid trials as phases of a schedule, therefore trial counts will not be populated in the Stripe’s report. This may change in the future with paid trials being more natively supported in Billing and available via API.
Subscription Churn Report
Piano Integration: Maps Stripe churn events back to Piano Subscription Insights
Data Flow: Stripe Revenue Recovery events → Piano churn reporting
Monthly Recurring Revenue (MRR) Report
Piano Data: Piano Terms converted to Stripe price_data with full pricing context
Revenue Attribution: MRR calculated from Piano pricing engine outputs
Segmentation: By Piano application, resource type, and term configurations
Invoice Status Report
Piano Context: Piano payment status mapping to Stripe invoice lifecycle
Status Synchronization: Sync between Piano payment states and Stripe invoice status
Revenue Recognition Reports
Income Statement
Piano Revenue: Piano subscription revenue recognized through Stripe billing cycles
Revenue Attribution: Maintains Piano application and resource-level revenue categorization
Period Recognition: Aligns with Piano subscription term periods and renewals via Subscription schedules and phases
Revenue Recovery Reporting
Clients using Stripe for Payments and Billing will also benefit from Revenue Recovery features and its associated reporting.
Churn Reporting in Piano Subscription Insights
Will continue to be available based off the webhook event handling and subsequent conversion event generation in Piano.
Stripe Billing Revenue Recovery events are mapped to Piano and will be available in the Subscription Insights and Piano Churn reporting.
Webhook handling
Here is how Stripe Billing Events are integrated into Piano, so that you can understand how critical subscription actions take place between the Stripe and Piano systems.
Stripe Billing Events
|
Event Type |
Description |
Piano Billing Integration Processing |
|
Customer’s subscription ends. |
Expire Piano subscription by setting to Expired status when deleted in Stripe (by setting it to expired it will become inactive). |
|
|
New invoice created. |
Confirm/update TaxRate ID, verify invoice.
|
|
|
Draft invoice deleted. |
Piano access not extended, set payment status to ABORTED. If Stripe invoice is deleted, charge is skipped for that cycle. |
|
|
Invoice.upcoming |
Emit an event X days before an auto-charged subscription invoice is generated (configurable; recommended X = 3 days). |
Verify the invoice. If the invoice is invalid, then:
|
|
tax_rate.updated |
Occurs whenever a tax rate is updated. |
Tax rates created by Piano are immutable. If a tax rate is modified directly in Stripe, Piano flags the original tax rate ID as corrupted and creates a new tax rate in Stripe. |
|
Draft invoice cannot be finalized. |
Extend Piano access, so that it is not shorter than 3 days. Piano payment is NOT PENDING (we do not touch Piano payment on this event). Alert, so that Piano can fix the invoice and re-finalize it. |
|
|
Draft invoice finalized. |
Ignore for synchronous payments. For async: initiate renewal of Piano subscription to the next billing period, set payment status to PENDING. Piano subscription renewal conversion is not created at this point. |
|
|
Invoice payment succeeds. |
Renew Piano subscription, set payment status to COMPLETED. For synchronous payment:
For asynchronous payment:
|
|
|
Payment requires user action. |
Start preset 30-day grace period, extend access, send failure notification; if end-user updates method - payment either succeeds or fails, at which point Smart Retry starts, in case user does not update the method and preset 30-day period runs its course, Piano expires subscription. |
|
|
Payment attempt fails. |
Grace period logic applies. Start grace period or cancel/expire subscription, set status to CANCELED as follows: If Stripe will Smart Retry the invoice:
If Stripe will not Smart Retry the invoice:
|
|
|
Subscription schedule aborted. |
Internal System Validation only. |
|
|
Subscription schedule canceled. |
Internal System Validation only. |
|
|
Subscription schedule completed. |
Internal System Validation only. |
|
|
Subscription schedule created. |
Internal System Validation only. |
|
|
Subscription schedule expiring. |
Internal System Validation only. |
|
|
Subscription schedule released. |
Internal System Validation only. |
|
|
Subscription schedule updated. |
Internal System Validation only. |
Piano Changes Overview
Piano Webhook Changes
Access webhook will have a small change to grace period length for Stripe managed subscriptions using Stripe Payments, because of the difference in grace period and retry behavior for Smart Retries compared with Piano Passive Churn management, as follows:
There are three fields available in access webhooks that relate to grace period - is_in_grace, grace_period_start_date, grace_period_length.
-
In is_in_grace we send true if Piano subscription is in grace (i.e. smart retried in Stripe)
-
In grace_period_start_date we send current period start date.
-
In grace_period_length we will send the current billing period length (e.g. 1 month) for any Stripe retried subscriptions, as opposed to configured grace period length in Passive Churn or in the Term settings.
Dashboard changes
Clients using Piano will notice no changes to their day-to-day operations in the dashboard. The main expected change will happen for clients using Stripe Payments as they will no longer use Piano Passive churn, and the configuration will happen in Stripe Billing/ Revenue Recovery or Automations - enabling clients to configure their Smart Retries. No Passive Churn settings will take any effect on subscriptions made by Stripe Payments from the moment clients are switched to Stripe Billing. Additional information about Billing owner was added to the Subscription Details view to enable seeing which subscription is managed by Stripe.
Asynchronous payment method retry changes
Smart Retries significantly improve asynchronous payment method processing by enabling failed payment retries for direct debit: Clients using Stripe SEPA, BACS or ACH will enjoy improved failed renewal handling. Piano extends access management and enables Smart Retries to run on these methods driving additional revenue recovery, compared to the current approach when a subscription is immediately cancelled once the direct debit payment fails.
This improvement will introduce several changes related to async payment method processing, access management, conversion status, and payment status for these methods. For more information, please refer to the async retry flows above.
Email notifications changes
All notifications will remain working as they are even after clients have switched to Billing. The only change will occur to Renewal Notification failure where a few changes will happen due to Smart Retry logic. The grace period duration parameter will no longer be provided, as Smart Retries are not preset as a static cadence and instead act on many signals across the network and user behavior, dictating attempts at the most opportunistic time rather than on a preset schedule.
Email TO_CONSUMER_SUBSCRIPTION_AUTO_RENEWED_FAILURE is sent when renewal retry fails, and the grace period either starts or continues.
The above paragraph about grace period will be automatically hidden from the email for any switched subscriptions.
Grace period information in the Subscription details and History events (Dashboard and My Account)
Given that preset grace period isn’t available with Smart retries, the information about grace will be provided as follows: "Subscription to RESOURCE has entered a grace period"
Reporting Changes
Stripe configured retry policy length and number of retries will not be available in the Piano reports, as they are not available to Piano programmatically; the grace period will equal billing period.
API Changes
No general API changes, unless specified below. Any Piano API actions are mapped and transferred to Stripe as necessary within the scope of the currently supported feature set.
-
API endpoint: POST
/publisher/term/change/do
Change: A successful API response (200 OK) confirms the plan change only. Payment is processed asynchronously. A grace period is possible even after a 200 OK response.
Upgrade Changes
Comparison across all upgrade flows and payment types:
|
Upgrade Scenario |
Legacy Piano Billing |
Stripe Billing |
|---|---|---|
|
Immediate, MA/PD/API — sync Stripe payment fails |
Subscription rolled back |
Plan changed. Grace period starts. (Changed) |
|
Immediate, on-site — sync payment fails |
Grace period starts |
Grace period starts. (No change) |
|
Immediate — async Stripe payment fails |
Subscription cancelled |
Grace period starts. Smart Retries activated. (Changed) |
|
Immediate — BYOP sync payment fails |
Grace period starts |
Grace period starts. (No change, same behavior) |
|
Immediate — BYOP async payment fails |
Subscription cancelled |
Subscription cancelled (No change, same behavior) |
|
Deferred — any payment failure |
Grace period / cancel depending on type |
Consistent with failure rules above |
General Considerations
Support SLAs
What are the uptime and service level guarantees?
Piano continues to provide SLAs as contracted with each client. Stripe is one of the providers Piano uses to deliver services, and Piano is responsible for the overall service level of the platform — including the integration with Stripe and any other payment providers. Piano actively monitors the health of all integrations to ensure contracted service levels are met.
Support SLA/Model
Problem Ticket First Response Times
Standard Piano Problem response times based on the ticket Severity Level:
|
Severity Level Classification |
Problem Response Time |
|---|---|
|
Severity 1 |
Within 2 hours |
|
Severity 2 |
Within 1 business day |
|
Severity 3 |
Within 5 business days |
Problem Ticket Severity Levels
"Severity" is the assessed possible risk or effect of a problem with the Services.
Severity 1
-
The Services are causing the availability of the Client website or applications to be significantly affected;
-
There is a complete outage of a critical service or a recurring temporary outage of a critical service;
-
There is a security breach that exposes the personally identifiable information of Client customers; or
Severity 2
-
Due to a problem with the Services, users are not able to properly purchase access for, or gain access to, Client content;
-
The Services administrative applications (e.g. reporting, authoring, etc.) are unavailable;
-
There is an error, bug, or issue with the experience of a subset of Client customers (e.g. transactional emails are not being delivered properly / some but not all Client customers are viewing unintended media, content, or messages); or
Severity 3
-
Client is experiencing operational inconvenience caused by the Services;
-
Client needs or expects different functionality or presentation of information than Piano currently provides;
-
An individual user has reported a problem that has not been evidenced to be prevalent among Client customers.
For more details about SLA and uptime please visit https://www.piano.io/legal/sla.
Piano to Stripe subscription mapping
It is important to understand the difference between Stripe native Product catalog entities and Piano API level integration with Stripe Billing. Stripe provides more flexibility and functionality only via APIs which are used to map and integrate Piano term and subscription specifics. As per the mapping table provided above, you will notice that Piano term context is mapped to multiple entities instead of being represented as 1:1 term to price, therefore no Stripe catalog native price IDs are created or used, instead priceIDs are set via API which Stripe interface shows as "archived". This is expected system behavior on API level integrations.
|
CORE ENTITY MAPPING |
|||
|
Piano Entity |
Stripe Entity |
Mapping Strategy |
1:1 Relationship |
|
Piano App |
Stripe Account |
Connected Account |
Yes |
|
Piano User |
Stripe Customer |
1:1 with multi-currency exception |
Multi-currency = Multiple Customers in Stripe |
|
Piano Subscription |
Stripe Subscription + Schedule |
Subscription Schedules with phases |
Yes |
|
Piano Term |
Stripe Price data |
Piano-native pricing generating price_data |
Yes |
|
Piano Resource |
Stripe Product |
Resource mapping to product |
Yes |
|
Piano Transaction |
Stripe PaymentIntent |
Invoice for billing, PaymentIntent for payments only |
Yes |
|
Piano Payment Method |
Stripe Payment Method |
Direct mapping + BYOP via out-of-band for non-Stripe methods |
Yes + BYOP |
|
BILLING ARCHITECTURE MAPPING |
|||
|
Piano Billing Concept |
Stripe Billing Concept |
Implementation Pattern |
Technical Approach |
|
Payment Terms |
Subscription Schedules |
Phase-based billing with schedule API |
Multi-phase schedules for complex billing |
|
Dynamic Terms (later phase) |
Subscription Schedules |
Multiple phases with dynamic price_data generation |
Piano calculates pricing → Dynamic price_data → Schedule phases |
|
Shared Terms |
Subscription Schedules |
Shared subscription management |
Master subscription with shared access |
|
Gift Terms |
Stripe Invoice |
Stripe Invoice with purchase-date service period |
Stripe Invoice with purchase-date service period for revenue recognition, Piano manages gift redemption |
|
Promotions |
Invoice Net amount line Item (Discounts) |
Piano-native promotion engine with Stripe invoice net amount |
Piano calculates discounts → Apply as discounted line items in Stripe invoices |
|
Trial Periods |
Subscription Schedule Phases |
Trial phases in schedules with price_data |
Piano trial logic → $0 price_data → Paid phase transition |
|
Grace Periods |
Smart Retries + Piano Access Control |
Stripe Smart Retries + Piano access extension |
Dual system coordination |
|
Renewals |
Subscription Billing Cycles |
Stripe controlled renewal billing |
Piano renewal tax rate check→ New price_data → Stripe billing -> Finalize invoice |
|
Upgrades/Downgrades |
Subscription Schedule Modifications |
Piano-calculated proration + price_data + Subscription Schedule Phase |
Piano determines new pricing → price_data updates → Stripe Schedule Update (2:1 mapping on Piano subscriptions to Stripe) |
|
DATA ARCHITECTURE & SYNCHRONIZATION |
|||
|
Data Flow |
Synchronization Strategy |
Technical Implementation |
Consistency Model |
|
Piano → Stripe |
Real-time price_data Generation |
Piano pricing engine → Dynamic price_data → Stripe APIs |
Piano single source of truth |
|
Stripe → Piano |
Webhook Processing |
Stripe webhook consumption |
Strong consistency for critical events, metadata filtering to ensure only Piano actions are processed |
|
Catalog Sync |
Piano Master |
Piano terms → Stripe Products and Price_data |
Piano-driven catalog with Stripe Product creation and Metadata |
|
Subscription Sync |
Bi-directional |
Real-time status + pricing synchronization |
Piano pricing authority + Stripe billing execution |
|
Metadata Management |
Rich Metadata Strategy |
Extensive use of Stripe metadata for Piano context |
Metadata-driven context for product revenue recognition needs |
Piano Metadata in Stripe
When Piano connects your subscriptions and payments to Stripe Billing, it automatically adds metadata to Stripe objects. This metadata links each Stripe record back to its corresponding Piano entity — your application, subscriber, subscription, or resource — so you can trace any Stripe object to its Piano source. Filtering of webhook events based on relevant Piano metadata is implemented to ensure non-Piano related events are ignored.
This documents every metadata field Piano sets in your Stripe account, what it represents, and the values you will see. Metadata is read-only: do not modify these fields directly in Stripe.
|
Piano manages all metadata automatically. You do not need to configure or maintain these fields.
|
Stripe objects covered:
-
subscription_schedule
-
subscription
-
invoice
-
tax_rate
-
payment_intent
-
customer
-
product
payment_method and price objects do not carry Piano metadata.
Field naming
All Piano metadata fields use camelCase and begin with the prefix "piano" — for example, pianoAid, pianoUid, pianoSubscriptionId. A small set of fields on payment_intent use an older naming style without the prefix; these are listed in the payment_intent section.
subscription_schedule
Piano creates a Stripe subscription schedule for each managed subscription. Metadata is stored at the phase level, not at the schedule root. The root-level subscription_schedule.metadata is always empty; all fields are set on subscription_schedule.phases[n].metadata.
Fields that do not change between phases are only written on the first phase — Stripe carries them forward automatically. Fields that stop applying to a period are explicitly cleared so they are not inherited.
|
Metadata Field |
Purpose |
Values |
|---|---|---|
|
|
Identifies why this schedule exists in Stripe. |
PIANO_VX — created by the Piano Stripe Billing integration. |
|
|
Records the channel through which the subscription was originally purchased. |
CHECKOUT — Piano Checkout
|
|
|
Your Piano application identifier. |
Piano application ID (string). |
|
|
The subscriber's Piano user identifier. |
Piano user ID (string). |
|
|
The Piano subscription this Stripe subscription corresponds to. |
Piano subscription ID (string). |
|
|
Whether auto-renewal is currently enabled for the subscription. |
true or false. |
|
|
Marks a phase that represents a free or paid trial period. |
true when a trial is active. Field is absent in all other phases. |
|
|
The promo code applied to this billing period. |
Piano promo code ID (string). Field is absent when no promo code is applied. |
|
|
The promotion applied to this billing period. |
Piano promotion ID (string). Field is absent when no promotion is applied. |
|
|
Marks a billing period where the subscriber chose to pay more than the standard price. |
true when Pay More is active. Field is absent otherwise. |
|
|
Marks the bridging phase created when a publisher manually changes a subscription's next billing date. This zero-amount phase spans from the change date to the new billing date. |
true. Field is absent in all other phases. |
|
|
Marks the prepaid phase created when a subscription is renewed early by the publisher. This zero-amount phase spans the pre-paid period. |
true. Field is absent in all other phases. |
|
|
Marks the bridging phase that covers the period between the date a subscription was connected to Stripe Billing and its first Stripe renewal date. This phase carries no associated invoice. |
true. Field is absent in all other phases and does not apply to subscriptions connected via a manually created invoice. |
|
|
The voucher applied to extend this subscription period. |
Piano voucher ID (string). Field is absent when no voucher is applied. |
|
|
Marks the first billing period of a subscription that was created as a result of an upgrade. |
true. Field is absent in all other phases. |
subscription
subscription.metadata reflects the currently active phase of the subscription schedule and is kept in sync by Piano as phases change. When no schedule exists — after the schedule completes — the metadata retains the values from the last active phase.
The fields are identical to those on subscription schedule phases. The key difference is how they behave over time:
-
Fixed fields (
pianoCreationReason,pianoOrigin,pianoAid,pianoUid,pianoSubscriptionId) are set once and do not change over the subscription's lifetime. -
State fields (
pianoInTrial,pianoPromoCodeId,pianoPromotionId,pianoPayMoreApplied,pianoInitialCustomPeriod,pianoNextBillingDateManuallyUpdated,pianoSubscriptionManuallyPrebilled,pianoVoucherId,pianoSubscriptionUpgraded) reflect the current period — present when that condition is active, absent otherwise. -
pianoAutoRenewalEnabledreflects the subscriber's current auto-renewal setting.
|
Metadata Field |
Purpose |
Values |
|---|---|---|
|
|
Identifies why this subscription exists in Stripe. |
PIANO_VX. |
|
|
Records the original purchase channel. |
CHECKOUT, ATW, MANUAL, MARKING_JOB, or SWITCH_COCKPIT. See subscription_schedule section for definitions. |
|
|
Your Piano application identifier. |
Piano application ID (string). |
|
|
The subscriber's Piano user identifier. |
Piano user ID (string). |
|
|
The Piano subscription this record corresponds to. |
Piano subscription ID (string). |
|
|
Whether auto-renewal is currently enabled. |
true or false. |
|
|
Marks an active trial period. |
true when in trial. Absent otherwise. |
|
|
The promo code currently applied. |
Piano promo code ID. Absent when none is applied. |
|
|
The promotion currently applied. |
Piano promotion ID. Absent when none is applied. |
|
|
Marks an active Pay More period. |
true when active. Absent otherwise. |
|
|
Active when a manually adjusted billing date bridging period is in effect. |
true. Absent otherwise. |
|
|
Active during an early-renewal prepaid period. |
true. Absent otherwise. |
|
|
Active during the initial bridging phase (no invoice) after Stripe Billing connection. |
true. Absent otherwise. |
|
|
The voucher currently extending this subscription. |
Piano voucher ID. Absent when none is applied. |
|
|
Active during the first period following an upgrade. |
true. Absent otherwise. |
The following subscription locations are always empty: subscription.items[n].metadata, subscription.items[n].plan.metadata, subscription.items[n].price.metadata, subscription.plan.metadata.
invoice
Piano creates or enriches Stripe invoices in several contexts: the first invoice when a subscription is connected to Stripe Billing, renewal invoices (automatic and manual), upgrade invoices, one-time payment invoices, and gift invoices. All carry a common set of core fields; additional fields appear where applicable.
The table below covers invoice.metadata. See the note at the end of this section for the behavior of other invoice locations (lines, subscription_details, etc.).
|
Metadata Field |
Purpose |
Values |
|---|---|---|
|
|
Identifies why this invoice exists in Stripe. Present on all Piano-managed invoices. |
PIANO_VX. |
|
|
Records the original purchase channel. Present on all Piano-managed invoices. |
CHECKOUT, ATW, MANUAL, MARKING_JOB, or SWITCH_COCKPIT. |
|
|
Your Piano application identifier. Present on all invoices. |
Piano application ID (string). |
|
|
The subscriber's Piano user identifier. For gift invoices, this is the gifter's ID. Present on all invoices. |
Piano user ID (string). |
|
|
The Piano payment record this invoice is associated with. Present on all invoices. |
Piano user payment ID (string). |
|
|
Identifies the type of manually created connection invoice. Present only on first-period invoices created when connecting a subscription to Stripe Billing, and on one-time or gift payment invoices. |
SUBSCRIPTION_PURCHASE — first period of a connected subscription
|
|
|
The Stripe payment intent that was manually attached to this invoice. Present on first-period connection invoices, gift invoices, and manual renewals processed through Piano Checkout. |
Stripe payment intent ID (string). |
|
|
The promo code applied to the billing period this invoice covers. |
Piano promo code ID. Absent when no promo code applies. |
|
|
The promotion applied to the billing period this invoice covers. |
Piano promotion ID. Absent when no promotion applies. |
|
|
Marks invoices for billing periods where the subscriber paid more than the standard price. |
true. Absent otherwise. |
|
|
The voucher associated with a gift subscription invoice. |
Piano voucher ID. Present on all gift invoices; absent on all other invoice types. |
|
|
Marks invoices created as part of an early (pre-billing) manual renewal. |
true. Absent on all other invoice types. |
|
|
Marks invoices created when a subscriber pays to resolve a lapsed (grace period) subscription. |
true. Absent on all other invoice types. |
|
|
Marks invoices associated with the first billing period following a subscription upgrade. |
true. Absent on all other invoice types. |
|
|
Explains why the tax amount on this invoice is zero, when taxes are configured but the calculated amount is zero. |
not_configured — tax provider not set up
|
|
|
Additional detail when a tax calculation error occurred. |
Error message string. Present only when |
|
|
The billing country code used for tax calculation, collected when the subscriber's billing country differs from their country of residence. |
ISO country code. Absent when not collected or taxes not applicable. |
|
|
The country of residence code used for tax calculation. |
ISO country code. Absent when not collected or taxes not applicable. |
|
|
The postal/ZIP code used for tax calculation. Required for USA and Canada. |
Postal or ZIP code string. Absent for other countries or when taxes not applicable. |
|
|
The postal/ZIP code collected from the subscriber's payment method. |
Postal or ZIP code string. Absent when the payment method does not collect a postal code. |
|
|
Identifies the Piano tax provider used to calculate taxes on this invoice. |
Tax provider identifier, e.g. vat.eu, tax.us, avalara.vat.canada. Absent when taxes not applied. |
|
|
The Piano billing address record used for tax calculation when full address collection is enabled with Avalara. |
Piano billing address ID. Present only when Avalara is the tax provider and full address collection is enabled. |
Other invoice locations
|
Location |
Behavior |
|---|---|
|
|
Mirrors subscription.metadata at the current moment for subscription invoices — this is a live reflection, not a snapshot. Always empty for one-time payment and gift invoices. |
|
|
Always empty. |
|
|
Always empty. |
|
|
Snapshot of subscription.metadata at the time the invoice was created. Does not change after creation. Always empty for one-time payment and gift invoices. |
|
|
Snapshot of subscription.metadata at the time the invoice was created. Identical to |
tax_rate
Piano automatically creates tax rate objects in Stripe based on your Piano tax configuration. One metadata field is set on each tax rate object.
|
Metadata Field |
Purpose |
Values |
|---|---|---|
|
|
Your Piano application identifier. |
Piano application ID (string). |
Do not modify tax rates created by Piano directly in the Stripe Dashboard.
payment_intent
Piano sets metadata on payment intents it creates — for subscription purchases, renewals, one-time payments, and gift purchases. Payment intents created automatically by Stripe for subscription renewals carry no metadata.
|
Metadata on |
|
Metadata Field |
Purpose |
Values |
|---|---|---|
|
|
Identifies why this payment intent exists in Stripe. |
PIANO_VX. |
|
|
Identifies the Piano payment integration used to process the payment. |
Payment source identifier, e.g. STRP (Stripe), STRP_EL (Stripe Elements), APSTRP (Apple Pay via Stripe). |
|
|
Your Piano application identifier. |
Piano application ID (string). |
|
|
The subscriber's Piano user identifier. |
Piano user ID (string). |
|
|
The Piano term (product) this payment is for. |
Piano term ID (string). |
|
|
The name of the Piano term this payment is for. |
Piano term name (string). |
|
|
The Piano subscription this payment is associated with. |
Piano subscription ID (string). |
|
|
The country code used for tax calculation on this payment. |
ISO country code. Absent when taxes are not applied. |
|
|
The state or province code used for tax calculation, when a full billing address is collected. |
State or province code. Absent when full address collection is not in use. |
|
|
Piano's internal transaction tracking identifier for this payment. |
Piano tracking ID (string). |
|
|
The consent mandate reference for payments that require a mandate (e.g. cards issued in India). |
Mandate reference string, e.g. MR_DF8R0PPYDPKD1NTU1. Absent when no mandate is required. |
payment_intent.charges[n].metadata automatically mirrors payment_intent.metadata. No separate configuration is needed.
customer
Piano maps each subscriber to a Stripe customer record. One metadata field is set on customer creation and does not change.
|
Metadata Field |
Purpose |
Values |
|---|---|---|
|
|
The subscriber's Piano user identifier. Note: this field uses uppercase, consistent with the older naming style used when customer records were first created. |
Piano user ID (string). |
product
Piano creates a Stripe product object for each Piano resource associated with a subscription or one-time payment.
|
Metadata Field |
Purpose |
Values |
|---|---|---|
|
|
The Piano resource this Stripe product represents. |
Piano resource ID (string). |
|
A deprecated |
payment_method and price
payment_method.metadata and price.metadata are always empty for all Piano-managed objects. No metadata is set on these entity types.
Stripe Unsupported features in Piano
In this phase following products or features are not yet available and integrated with Piano:
-
Stripe Tax (Piano tax support is integrated as Stripe Manual rates at this stage)
-
Invoicing (Standalone Invoicing product from Stripe not currently integrated, which is different from Invoice generation in Billing)
-
Usage-based Billing and Product catalog created entities directly in Stripe
-
Other features not explicitly documented as supported in this documentation.
Piano unsupported features in Subscription Piano powered by Stripe
These features are not yet available to use on “switched” subscriptions and will be released soon.
Coming soon
-
Manual renewal in Checkout
Not supported in the current integration scope
-
Dynamic terms all functionality
-
Future start date
-
Recurring Gifts (Private Preview)
Billing Integration agnostic features
These features are not in scope of the Stripe Billing integration or are irrelevant as they continue to be managed in Piano.
-
Registration term
-
External service (EVTs, and other 3rd party integrations)
-
Custom terms
-
Access granted
-
Linked Terms
-
Site Licensing
Minimum charge amounts
Stripe applies minimum charge amounts, which may affect very small invoice amounts that might not be charged to the end-user. Here's how it works:
If an invoice amount due is less than the minimum chargeable amount for the currency, Stripe automatically marks the invoice as paid. The amount is debited from the customer's credit balance rather than processing a card payment. If there's no credit balance, the customer effectively gets that amount for free
The minimum chargeable amounts vary by currency. For example:
USD: $0.50
EUR: €0.50
GBP: £0.30
When this happens:
-
The invoice status changes to paid automatically
-
No payment attempt is made against the customer's payment method
-
The small amount is recorded as paid (either from credit balance or effectively waived)
This commonly occurs with:
-
Prorated amounts from subscription changes
-
Very small subscription costs
-
Tax-only invoices with minimal amounts
-
Remaining balances after partial payments
This behavior helps avoid processing fees on very small transactions that might not be economical to charge.
Rounding rules for tax
Stripe rounding rules:
-
Stripe rounds to the smallest currency unit (e.g., cents for USD, yen for JPY)
-
When rounding decimal amounts, Stripe uses "half to even" rounding (also known as banker's rounding):
-
Values less than x.5 round down
-
Values greater than x.5 round up
-
For exactly x.5, Stripe rounds to the nearest even number
-
-
For currencies without decimal places (zero-decimal currencies like JPY), no rounding is necessary as these currencies are already represented in their smallest unit.
Tax providers integrated in Piano use multiple rounding rules. Depending on your configuration, if one of the Avalara integrations is used, the rounding rules may be configured differently from the rules imposed by Stripe rounding rules.
Due to the rounding rules, in case the rules of tax service don’t match Stripe rules, the tax amount and total amount of invoice could be different from the amounts of the payment made in Piano checkout or Subscribe User. This discrepancy may occur for exclusive tax amounts only and not be more than 0.01 in the smallest currency unit.
Subscription renewal date handling for subscription switching
-
Anchoring is a feature that allows you to return to the same calendar date back at renewals.
-
Example: monthly subscription purchased on Jan 31.
-
With anchoring to 31st of month: renewed on Feb 28, Mar 31, Apr 30, May 31
-
Without anchoring: renewed on Feb 28, Mar 28, Apr 28, May 28
-
-
Anchoring is important for monthly and yearly billing periods (because of leap years). Any other billing periods (weekly, several days) aren’t affected by anchoring.
-
For new purchases with Stripe Billing, Piano anchors to the moment of purchase.
-
For existing subscriptions switched to Stripe Billing, Piano anchors to the next renewal date (the 1st charge in Stripe).
-
The anchor date is reset when a subscription enters a new billing period, for example after a trial or promotion to a full price billing period.
-
In case the subscription does not have a monthly/yearly trial period, anchor is set once it enters any monthly/yearly period.
-
Anchor timestamp is passed to Stripe as is. Stripe calculates calendar date anchor based on UTC time zone.
Renewal process date handling in Stripe
-
Piano passes the renewal date in UTC to Stripe
-
In the majority of cases billing cycle anchor is used to set the first renewal date for all switched subscriptions from which Stripe Billing renews the subscription.
-
Stripe Billing honors the end of the month for the subscription renewal
Subscription Billing intervals
Please note, Stripe is currently allowing billing intervals to be set up to 3 years as maximum at the Price object. Therefore, any subscriptions with billing interval set to more than 3 years cannot be currently switched or purchased once switched to Stripe Billing.
-
Same limitation affects the manual changes to Next Billing Date (NBD) on active subscriptions, and the NBD cannot be set to a future date longer than date +3 years.
For more details, see Billing periods and the 3-year guideline.
Validations
-
Validations are done at:
-
Invoice preview (upon creation of subscription and any associated schedules)
-
Invoice draft upon renewal (validating amount and tax rates)
-
Data mapping from Stripe to Piano
Piano subscription object
|
Stripe source |
Stripe source description |
Piano destination |
|
id field of Stripe subscription object. |
Unique identifier for the subscription object. |
stripe_subscription_id field of Piano subscription object. |
|
ended_at field of Stripe subscription object. |
If the subscription has ended, the date the subscription ended. |
end_date field of Piano subscription object. |
Piano payment object
|
Stripe source |
Stripe source description |
Piano destination |
|
id field of Stripe invoice object. |
Unique identifier for the invoice object. |
stripe_invoice_id field of Piano payment object. |
|
created field of Stripe invoice object. |
Time at which the invoice object was created. Measured in seconds since the Unix epoch. |
tx_stamp field of Piano payment object. |
|
currency field of Stripe invoice object. |
The code of the currency used to pay for the invoice object. |
currency field of Piano payment object. |
|
total field of Stripe invoice object. |
The total amount after discounts and taxes paid for the invoice object. |
amount field of Piano payment object. |
|
total_excluding_taxes field of Stripe invoice object. |
The amount representing the total amount of the invoice excluding all taxes. |
pre_tax_amount field of Piano payment object. |
Legacy Subscription Switching to Stripe Billing
Switching existing subscriptions to Billing
For date and time handling for initial phase creation vs renewal date and time, Stripe uses the Epoch timestamp for absolute time creation.
Any subscription switched to Stripe Billing, must NOT have any changes made in Stripe Dashboard, as this will corrupt subscription schedule(s) and cause out-of-sync state without possibility of reconciliation.
All existing (legacy billing) Piano subscriptions which conform to supported features will be switched to Stripe Billing. Clients and their apps are scheduled to be switched in cohorts based on their use of Piano features and further planning by the operation and switching team.
Switching upgraded subscriptions to Stripe Billing
Clients using Upgrades and Downgrades can now be switched to Stripe Billing. Subscriptions that have been previously upgraded can be automatically switched to Stripe Billing as they conclude upgrading or downgrading.
All upgraded subscriptions that meet our general eligibility rules can be moved to Stripe Billing just like any other existing subscription.
Subscriptions that still have an upgrade scheduled but not yet completed are not switched to Stripe Billing until that upgrade is completed or cancelled.
In practice, this means:
-
If a subscription was created earlier as part of an upgrade (even months ago and already renewed), it can now be moved to Stripe Billing once it is eligible.
-
If a subscription has an upgrade scheduled but not completed (or suspended but not fully cancelled), it will be held back from switching until the upgrade flow is resolved.
Upgrades with Stripe Billing
All channels now behave like On-site Upgrades, Stripe processes payment off-session after the plan change is applied.
|
Channel |
What Happens Immediately |
On Payment Failure |
|---|---|---|
|
My Account Widget |
Plan changes. Access granted to new plan. |
Grace period — no rollback |
|
Publisher Dashboard |
Plan changes. Access granted to new plan. |
Grace period — no rollback |
|
Publisher API |
Plan changes. 200 OK = plan changed only. |
Grace period — no rollback |
|
On-site Upgrade |
Plan changes. No behavior change. |
Grace period — same as before |
On-site Upgrades
No behavioral change. On-site Upgrades with Stripe Billing work the same as in legacy Piano billing: payment is off-session, and a failed payment puts the subscription in grace period. Clients using upgrade offers via on-site will see behavior consistent with all other channels.
Upgrade Types and Timing
Immediate Upgrade
The subscription changes at the moment of the upgrade request. Stripe generates an invoice for the prorated amount — the unused portion of the current plan applied toward the new plan — and attempts payment off-session.
Proration formula:
|
Calculation |
Example |
|---|---|
|
Credit = current price × (remaining days ÷ paid days) |
$30/mo × (15 ÷ 30) = $15.00 credit |
|
Upgrade charge = new plan price − credit |
$60/mo − $15.00 = $45.00 charged |
|
Downgrade refund = credit − new plan price |
$15.00 − $8.00 = $7.00 credited to subscriber |
Deferred (Scheduled) Upgrade
The subscription changes at end of billing period. No proration. Full price of new plan billed from the next renewal date. Optionally: subscriber can gain access to new resource immediately, before billing transition.
Deferred upgrades are not affected by the off-session model change — they were already off-session in legacy billing. No change in payment behavior. The additional benefit in processing asynchronous payment methods with Stripe Billing, in case of payment failure instead of immediate cancellation grace period and Smart retries apply for all supported methods.
BYOP Async methods and Upgrades
For BYOP async payment methods, the payment is initiated after the upgrade but confirmed or rejected days later (typically 2–5 days depending on the payment method). If that deferred payment fails:
|
Payment Type |
Upgrade Payment Fails |
Access Outcome |
|---|---|---|
|
Stripe-native (card, SEPA etc.) |
Grace period starts. Smart Retries activated. |
Access maintained during grace period. |
|
BYOP sync (immediate result) |
Grace period starts. Churn prevention retries activated. |
Access maintained during grace period. |
|
BYOP async (deferred result) |
Subscription cancelled immediately. No grace period. |
Access revoked on cancellation. |
Why BYOP async cancels immediately
BYOP async payments (such as direct debit or bank transfer) are processed on Piano's side, not Stripe's. Piano payment processing rules apply. In legacy Piano billing, BYOP async upgrade payment failures resulted in immediate cancellation — no grace period. This behavior remains the same. If your publisher account uses BYOP async payment methods and supports upgrades, subscribers will be cancelled rather than put into grace period if their async upgrade payment fails.It is recommended to use Stripe Payments for async payment method processing which can be retried.
Upgrade Lifecycle Operations
For deferred upgrades, publishers can manage the lifecycle with the following operations:
|
Operation |
Who Can Trigger |
What It Does |
|---|---|---|
|
Suspend |
Subscriber or Admin |
Pauses a deferred upgrade. The current subscription expires at end of billing period if not resumed. |
|
Resume |
Subscriber or Admin |
Reactivates a suspended upgrade. Stripe schedule restored. Auto-renewal re-enabled. |
|
Cancel |
Admin only |
Cancels the deferred upgrade. Subscription returns to ACTIVE. No cancellation of the current subscription. |
|
Abort (auto) |
System (automatic) |
If a suspended upgrade reaches billing period end without being resumed, it auto-aborts. Subscription expires at the end of the period. |
FAQ
Q: What happens when Piano cannot connect or create a valid subscription in Stripe Billing?
-
-
Piano has a retry mechanism in case of network error and continue to try to create the subscription entities in Billing up to 5 times, in case of failover, subscription cannot be created, or in case of incomplete creation such subscription will be cancelled in Stripe and recreated again after problem has been fixed.
-
NOTE: in case you decide to set up email notifications in Stripe Billing, this will trigger sending a subscription cancelation notification. It is recommended to use Piano notifications, as in such case Piano will not be sending such notifications, until a problem is resolved.
-
Q: How does Piano ensure subscriptions are properly and accurately created in Stripe Billing?
-
-
Piano integration uses several validation approaches to ensure consistency and accuracy. All subscriptions created are validated after creation using Invoice preview feature, to match amount, currency, date, billing period.
-
Any subscription renewals are also validated to ensure accurate tax rate, pricing, promotions, or any other lifecycle adjustments or updates are accurately sync’d between Piano and Stripe using the Draft Invoice generated upon renewal by Stripe which provides 72 hours window for validation.
-
Q: Why are there two transactions appearing on the transaction list in the Stripe Dashboard for any newly created subscriptions?
-
-
Any new subscriptions created in Stripe Billing as a result of purchase in the Checkout or Subscribe User will show two transactions in the Stripe dashboard, one in ‘Cancelled’ state and one in ‘Succeeded’.
-
This is an expected behavior and a result of using Stripe API operations during subscription creation. At this time Stripe is not able to remove this record appearing in the dashboard, and Piano is not able to make this change. This duplicated record listing is purely visual and has no impact on any subscription processing or billing. The correct payment is associated with the newly created subscription invoice. Subscribers will only see a single transaction in the Piano Dashboard and on their credit card or bank statement.
-
Q: What actions NOT to perform on a subscription in Stripe dashboard?
-
-
Generally, it is not recommended to make any changes to Subscriptions and Invoices as well as any associated entities in Billing / Product catalog. Any changes will lead to subscription becoming out-of-sync and require to be manually reset in Piano or will need full management outside Piano.
-
Viewing reports, managing access and account settings are supported
-
Any payments related configurations e.g. Radar are allowed and supported
-
Working with data in Stripe with 3rd party apps/plugins and other Stripe products which does not affect Catalog entities and its states is also not limited.
-
Q: Why do I see different tax amounts in the Subscription view versus Invoice view?
-
-
In case the subscription had modifications made during purchase (e.g. Promotion applied), you will see the Subscription general amount and period in the Subscription view in Stripe which typically shows upcoming amount and period only.
-
The initial period tax amount is accurately represented in the Invoice view. This is to avoid rounding rule discrepancies on the initial period or purchase amount, prior to Stripe Billing applying the tax calculation natively.
-
Q: What are Revenue recovery settings and where do I find them?
-
-
Revenue recovery settings control how Stripe handles failed subscription payments. The most important option is Smart Retries, which automatically re-attempts a failed charge using Stripe's machine-learning model to pick the best retry timing.
-
Location in Stripe: Settings → Billing → Revenue recovery
-
Smart Retries is enabled by default. Stripe will retry failed charges up to 8 times over a 2-week period.
-
Keep Smart Retries enabled with the default configuration. This is the most important of the five settings and the default is fully compatible with Piano.
-
Q: What could go wrong if Revenue recovery is configured differently?
-
-
If Smart Retries is disabled, no retry logic runs and failed payments are lost. If a third-party retry tool is also active, double charges are possible. Both scenarios must be resolved before your Switch.
-
Two situations to flag before Switching:
-
Smart Retries are disabled — a client may have turned this off because they use a dedicated revenue recovery or dunning tool (e.g. Churnkey, Recurly Recover, a custom dunning flow). In this case, confirm which retry logic should take precedence and disable the other. Let your Piano contact know.
-
A custom retry schedule is active instead of Smart Retries — the overlap can trigger multiple charge attempts for the same invoice, leading to double charges and customer complaints.
-
-
Q: What is the Invoice finalization period setting and where do I find it?
-
-
The invoice finalization period is the window between when Stripe generates a subscription renewal invoice and when it attempts to charge the customer. During this window, Piano can validate the invoice — confirming amounts, applying any last-minute adjustments, and ensuring Piano and Stripe are synchronized before payment is collected.
-
Location in Stripe: Settings → Billing → Subscriptions and emails → Invoice finalization period. The invoice finalization period is set to 1 hour by default.
-
Do not change this setting. The 1-hour default is the recommended configuration for Piano. This window is a critical integration point — Piano uses it to run pre-charge validations.
-
Q: What could go wrong if Invoice finalization is configured differently?
-
-
Any additional rules configured in this section may conflict with Piano's integration validation logic. Flag any customizations here with your Piano contact before your Switch.
-
Reducing the finalization period leaves less time for Piano's pre-charge checks to complete, which can result in charges being collected before Piano has confirmed the invoice is correct. Extending it delays renewals and may affect billing cycle expectations for subscribers.
-
Q: What is the Upcoming invoice events setting and where do I find it?
-
-
This setting controls when Stripe fires an upcoming invoice webhook event before a subscription renewal. Piano uses this event to run a pre-renewal sync check — confirming that the subscription state, pricing, and subscriber details are consistent between Piano and Stripe before the invoice is finalized.
-
Location in Stripe: Settings → Billing → Subscriptions and emails → Prevent failed events → Upcoming renewal events
-
Stripe defaults to sending the upcoming invoice event 7 days before renewal. Set this to 3 days before renewal. The default value is acceptable. The critical point is that this event must be configured — leaving it unset disables the pre-renewal sync entirely.
-
Q: What could go wrong if Upcoming invoice events are configured differently?
-
-
If upcoming invoice events are not configured, Piano cannot run its pre-renewal validation. Operations performed close to a renewal — such as plan changes, coupon application, or subscription updates on either the Piano or Stripe side — may not be reflected in the renewal invoice, resulting in an out-of-sync state.
-
An out-of-sync state means the amount Stripe charges may not match what Piano expects. This can affect revenue reporting, subscription state, and subscriber experience.
-
Q: What is the Invoice level rounding setting and where do I find it?
-
-
This setting controls how Stripe rounds tax amounts on invoices. There are two options: round at the invoice level (a single rounding operation applied to the total tax) or round at the item level (rounding applied to each line item individually before summing).
-
Location in Stripe: Settings → Billing → Invoices → Manual tax amount rounding
-
Stripe defaults to rounding at the invoice level. Keep the default. Round at the invoice level. Do not change this setting.
-
Q: What could go wrong if Invoice rounding is configured differently?
-
-
Changing to item-level rounding introduces small rounding discrepancies between Stripe's calculated tax totals and the pre-created tax rates Piano uses. Even minor discrepancies — fractions of a cent — can trigger out-of-sync states between Piano and Stripe and cause reconciliation failures.
-
This is a low-visibility setting that is easy to overlook, but its effect on tax reconciliation is significant. Confirm it is set to invoice-level rounding before your Switch.
-
Q: What is the Automatic invoice emails setting and where do I find it?
-
-
This setting controls whether Stripe automatically sends invoice and payment-related emails directly to subscribers. When enabled, Stripe sends finalized invoices and, optionally, payment reminders from its own email system, independently of any emails Piano or the client's platform may also send.
-
Location in Stripe: Settings → Billing → Subscriptions and emails → Manage invoices sent to customers
-
Stripe enables two options by default:
-
Send finalized invoices and credit notes to customers — enabled
-
Send reminders if a recurring invoice has not been paid — disabled
-
-
The default past-due behavior (for both invoice past-due scenarios) is: leave the subscription past-due after 60 days.
-
Disable automatic invoice emails. This is the recommended configuration for Piano clients.
-
The Stripe default (emails enabled) is not recommended because Piano also manages subscriber communications. Leaving Stripe emails enabled results in subscribers receiving duplicate emails — one from Stripe and one from Piano or the client's platform.
-
Q: Are there cases where keeping Stripe emails enabled is acceptable?
-
-
Yes, in one specific scenario: if the client does not use non-Stripe payment providers and does not use Stripe payment links, keeping Stripe's invoice emails enabled is acceptable — provided the client is aware and has decided this is their preferred experience.
-
Q: What is BYOP and do I need it?
-
-
A: BYOP (Bring Your Own Processor) is for clients who use a non-Stripe payment processor such as Braintree or Datatrans or Stripe unsupported methods e.g. Zlick. If you currently use Stripe Payments, you do not need BYOP — your setup works natively. If you use a different processor, in order to switch to Stripe Billing for subscription management while keeping your existing processor for charge collection, BYOP is required.
-
Q: Can I have both Stripe-native and BYOP subscribers in the same application?
-
-
A: Yes. Piano supports a mixed fleet — some subscribers can be on Stripe-native payment methods while others are on BYOP. Each subscription's renewal logic is handled according to its payment method type. You can also switch individual subscribers between Stripe and BYOP as needed, although this feature is pending release mid-April.
-
Q: Do I need to disable Stripe invoice emails for BYOP?
-
-
A: Yes — this is required for BYOP. Because Stripe generates a real invoice for every renewal cycle, if invoice emails are enabled, your subscribers will receive a Stripe invoice with a payment link. Since your processor collects the charge out-of-band, that payment link would be non-functional and confusing. Disable "Send finalized invoices and credit notes to customers" in Stripe Billing settings.
-
Q: Our system treats a successful upgrade API response as confirmation that payment was collected. What do we need to change?
-
-
A: You need to decouple payment confirmation from the upgrade response. A 200 OK from POST /publisher/term/change/do now means the plan change was applied in Stripe successfully — not that payment was collected. To confirm payment, poll the subscription state via GET after the upgrade call. Alternatively, implement webhook handling for invoice.paid (payment succeeded for sync methods and invoice.finalized for asynchronous payment methods), and invoice.payment_failed (payment failed, grace period started).
-
Q: Does the subscriber's Stripe subscription ID change when they upgrade?
-
-
A: No. The same Stripe subscription ID is maintained throughout the subscriber's lifecycle regardless of how many plan changes occur.
-
Q: A subscriber upgrades, payment fails, and the grace period expires. What plan are they on?
-
-
A: The subscription is cancelled. It is not reverted to the pre-upgrade plan. If the subscriber wishes to continue, they would need to start a new subscription.
-
Q: Some of our subscribers use direct debit (BYOP async). What happens if their upgrade payment fails?
-
-
A: BYOP async payments do not have a grace period on upgrade failure. If the deferred payment fails after an upgrade, the subscription is cancelled immediately — the same behavior as in legacy Piano billing. Stripe Smart Retries do not apply to BYOP payments. Access is granted at the moment of upgrade, but cancelled if the async payment fails.
-
Q: What happens to a subscriber's 3DS confirmation step when they upgrade?
-
-
A: There is no 3DS step during the upgrade. Payment is off-session using the payment method on file with Stripe. If 3DS is required for the off-session charge, Stripe handles this through its standard retry and authentication request flow.
-
Q: Are bulk upgrades via Action Manager affected?
-
-
A: No. Bulk upgrades via Action Manager are always deferred (end of billing period) and were already off-session. No behavioral change.
-
Q: How do Immediate upgrades behave when Stripe Billing manages a subscription in grace and retry state?
-
-
A: Currently, such Upgrades are allowed for subscription paid by synchronous payment methods only, asynchronous payment methods do not allow upgrading while there is a pending payment nor support grace and retry. In case, an immediate upgrade is made on a subscription in a grace period paid by synchronous payment method, such upgrade is supported, although the original retrying invoice will not be automatically voided, in case of eventual success it may lead to charge. In case subscription upgrade payment fails, because the initial subscription is already in grace and retry, the subscription will be cancelled. Additional enhancements are under evaluation.
-
How do Piano and Stripe work together?
Q: Who is responsible for what in Piano?
-
A: Piano and Stripe share responsibility with clear boundaries. Piano manages your subscriptions, business rules, and customer experience. Stripe handles billing and — when used as your payment provider — payment processing and financial infrastructure. Piano owns the integration across all systems.
Q: What is Piano responsible for?
-
A: Piano is responsible for:
-
Subscription management — creating, upgrading, renewing, and cancelling subscriptions
-
Access control — granting and revoking user access based on subscription status
-
Checkout — the purchase experience, offer presentation, and conversion flow
-
Promotions and pricing — calculating discounts, applying promotional terms, determining what price is charged
-
Grace periods — managing how long access continues while a payment is being retried
-
Upgrade logic — handling plan changes, proration, and scheduling
-
BYOP connector – processing payments on existing Piano payment provider integrations
-
Q: What is Stripe responsible for?
-
A: Stripe is responsible for:
-
Recurring invoicing — generating invoices on each billing cycle via Stripe Billing
-
Payment processing — collecting payments, managing payment methods, handling 3DS authentication (when using Stripe Payments)
-
Payment retries — automatically retrying failed payments using Stripe Smart Retries (when using Stripe Payments)
-
PCI compliance — securing all card and payment data (when using Stripe Payments)
-
Financial reporting — revenue data, payment reconciliation, and reporting via Stripe Dashboard
Note: Payment processing, retries, 3DS, and PCI compliance apply when using Stripe as your payment provider. If you use your own payment provider (BYOP), these responsibilities remain with your provider. See the BYOP section below for details.
In short: Piano manages your subscriptions, business rules, and customer experience. Stripe handles billing and — when used as your payment provider — payment processing and financial infrastructure. Piano owns the integration across all systems.
-
Q: What happens when something goes wrong?
-
A: Piano is your first point of contact for all issues. Our support team triages whether the issue is in Piano's subscription layer or Stripe's payment infrastructure and handles resolution end-to-end.
Issue
Who resolves it
User lost access unexpectedly
Piano
Upgrade didn't apply correctly
Piano
Invoice amount looks wrong
Piano
Payment failures or processing issues
Stripe or 3rd party PSP (Piano as escalation point)
3DS authentication issue
Stripe or 3rd party PSP (Piano as escalation point)
Piano generated objects and/or data in Stripe Dashboard look unexpected
Piano
Smart retries aren't working
Stripe (Piano as escalation point)
Piano is accountable for the full subscription-to-payment flow, including the integration between the two systems.
Q: Is our payment data secure?
-
A: Yes. Piano maintains its own PCI compliance as documented in our existing security documentation. When using Stripe Payments, card data goes directly to Stripe — a PCI Level 1 certified processor — via their client-side SDKs. Piano handles subscription information (what plan, what price, what access) but does not store card numbers, CVVs, or raw payment credentials in the Piano integration flow.
Can I use my own payment provider (BYOP)?
Q: Can we keep our existing payment processor with Piano?
-
A: Yes. Piano supports a Bring Your Own Processor (BYOP) model. In this setup, Stripe handles subscription scheduling and invoicing, while your existing payment provider (e.g., Datatrans, Adyen, Worldpay) continues to process the actual payments.
How it works:
-
When a renewal is due, Stripe generates and finalizes an invoice
-
Piano grants subscription access immediately
-
Piano routes the payment to your payment provider for collection
-
On successful payment, the invoice is reconciled
-
If payment fails, the subscription enters a grace period managed by Piano Passive Churn
Your existing payment provider continues to handle payment collection. Stripe provides the scheduling and invoicing engine. Piano orchestrates everything.
-
Q: Do we have to eventually move to Stripe for payments?
-
A: BYOP is a supported operating mode. You can continue using your existing payment provider as is.That said, using Stripe for both billing and payments offers advantages: automated Smart Retries, native 3DS handling, unified financial reporting in Stripe Dashboard, and consistent grace period behavior across all subscription operations. If you're already evaluating your payment provider setup, this may be a natural moment to consider adopting Stripe Payments.
Q: Can we switch between our provider and Stripe after going live?
-
A: Yes. You can switch payment methods between your provider and Stripe in both directions, and this can be done on a per-subscription basis. This gives you the flexibility to run a hybrid setup — for example, migrating payment processing to Stripe gradually, or keeping specific payment types on your existing provider while moving others to Stripe.
How does Piano handle Stripe customer credit balances?
Q: What is a Stripe customer credit balance?
-
A: A stored amount on a Stripe Customer that Stripe automatically applies to reduce the next invoice. Left unmanaged, this would silently lower the charged amount below the subscription price.
Q: How does Piano handle it during a purchase or Switch?
-
A: Piano temporarily removes the credit balance before creating the subscription invoice, then restores it immediately after finalization. This ensures the invoice is locked at the correct subscription amount before the balance is returned.
The sequence is: remove balance → create draft → finalize → restore balance → attach payment intent.
The balance is removed for seconds only. Piano does not wait for
invoice.paidto restore it.
Q: Does this affect renewal invoices?
-
A: No. Piano does not intervene in Stripe-generated renewal invoices. If a customer has a credit balance at renewal time, Stripe will apply it and the renewal charge may be lower than the full subscription price.
Auto-renewal and retries during grace periods
Q: A subscriber turned off auto-renewal, but we still charged them. Is this a bug?
-
A: No. If the subscription was in a grace period at the time auto-renewal was turned off, retries were still running against an open invoice. If a retry succeeded, the charge is expected behavior — the cancellation is deferred to period end, not applied immediately. If the subscriber did not want the charge, issue a refund.
Q: Why isn't the cancellation immediate when auto-renewal is turned off in a grace period?
-
A: To preserve the subscriber's access and keep the retention flow intact. A subscriber in a grace period who turns off auto-renewal may still reconsider — for example, by updating their payment method through My Account — before the period ends. Voiding the invoice immediately would eliminate that recovery path. The deferred model keeps it open.
Q: Does this affect BYOP subscriptions the same way as Stripe-native payment methods?
-
A: Yes, the cancellation behavior is identical — deferred to end of billing period, retries continue, a charge may still succeed. The only difference is the retry engine: Stripe Smart Retries for Stripe-native methods, Piano's own retry loop for BYOP.
Q: Will a renewal webhook fire if the retry succeeds after auto-renewal was turned off?
-
A: Yes. If a retry succeeds during the grace period, a standard renewal event and webhook will fire. The subscription is then marked to cancel at the next period boundary. Be aware of this when building downstream reporting or fulfillment integrations that key off renewal events.