Shift Happens
Week of Sep 21, 2026
·
7
new
·
23
improved
·
21
fixed
Find which customers received an offer through the API
Shipped
Areas
Subscriptions, Developers, Payments, Orders
Find which customers received an offer through the API
You can now identify exactly which customers received, accepted, or declined a promotional offer through the API. Use offerDefinitions to discover your offer configurations, then filter subscriptions or promotionalOffers by offer, event type (issued, accepted, rejected, or viewed), and a date range, including subscriptions that have since cancelled. Viewed events reflect only offers where a first view was recorded, so treat that signal as partial rather than a complete view history. promotionalOffers also works without any offer filter, so you can pull the full offer history for a single subscription on its own.
Query a subscription’s assigned assets through the API
You can now find which assets are currently assigned to a subscription through the API. Filter the assets query by subscriptionId, or fetch a subscription’s assets directly through getSubscription or subscriptions. Only assets that are currently assigned are returned; assets that have been returned or unassigned are excluded automatically.
Track retention outcomes from your own Customer Portal cancellation flows
If you’ve built a custom cancellation flow in Customer Portal v2, you can now record when it retains a customer so the outcome shows up in Firmhouse’s Churn Prevention reporting. Two authenticated endpoints let your flow start or reuse a cancellation request and mark it as prevented with an optional feedback note, and a small window.Firmhouse.churnRequests helper handles the calls for you.
Replace multiple subscription products in one API request
The GraphQL API’s replaceSubscriptionProducts mutation lets you replace up to 100 active products on a subscription in a single request, so several products on the same subscription can be swapped together instead of one call at a time.
Create fixed-amount discounts in any Shopify store currency
You can now create fixed-amount discounts in any currency your Shopify store supports, in addition to your project’s existing currencies. The discount form automatically adds your Shopify store’s available currencies to the list, so newly supported Shopify currencies show up without extra setup.
Set free shipping thresholds per country
You can now set a different free shipping threshold for each country instead of one threshold for your whole shop. For example, offer free shipping from €19 in the Netherlands and €35 in Belgium, or turn off threshold-based free shipping for specific countries entirely. Any country without an override keeps using your existing shop-wide threshold. You’ll find this under Settings > Shipping.
Maximum and fixed commitment terms for order-based plans
Order-based plans can now use maximum commitments and fixed terms, the same options already available for plan-based subscriptions. A calendar maximum ends the subscription once its configured term has run its course, while a billing-cycle maximum counts the paid signup invoice as the first cycle and each paid recurring invoice afterward toward the limit. If the subscription has a matching Shopify subscription contract, Firmhouse cancels that contract before ending the subscription.
Improvements
·
23
Retry a failed script execution from its notification
Failed script execution notifications now include a Retry script execution button, so you can rerun the script for the same trigger without leaving the notification. Review the script’s output in the linked outgoing webhook, make any needed fixes, and retry directly from there. The button disappears once the retry succeeds.
Filter subscriptions by service channel
You can now filter the Subscriptions overview by service channel directly from the filter menu, on projects that use service channels. Like any other filter, it appears as an active filter and carries through to saved views and CSV exports. Previously the only way in was through a service channel’s own menu.
Preview what Clear non-paying status actually does
The manual action to resolve a non-paying subscription is now called Clear non-paying status, and it shows a preview before you confirm. The preview explains that clearing the status only removes the flag and recovers any skipped products. It doesn’t settle outstanding invoices, cancel queued reminder emails, or prevent a later payment failure from marking the subscription non-paying again. It also shows the next order Firmhouse will attempt.
See when subscriptions were paused from the overview
When you filter the Subscriptions overview to paused subscriptions, you can now see and sort by a Paused at column, so you don’t need to open each subscription to check how long it’s been paused.
Clearer alerts with fewer repeated notifications
Notification errors are now easier to read in your admin and high-severity emails. Shopify shipping alerts name unavailable products so you can reconnect or replace them; View full payload remains available for technical details.
Add custom headers to outgoing webhooks
You can now add custom HTTP headers to an outgoing webhook, such as an authentication token your receiving system expects. Add one header per line under Custom HTTP headers when you configure the webhook. This works for standard HTTP, Shopify Admin, and Shopify Flow deliveries; Klaviyo metric webhooks don’t support custom headers.
Offer Pay by Bank through Adyen
You can now offer Pay by Bank as a payment method through Adyen, on both hosted checkout and Sessions checkout. Turn it on in your Adyen payment method settings to let customers pay directly from their bank account.
Manage and recover payment methods
When you record a manual invoice payment for a subscription with an unhealthy payment method, Store this payment method for future payments is checked by default. A successful payment replaces the unhealthy method, helping the next recurring charge succeed.
Offer your own snooze durations on upcoming-order links
You can now choose which snooze durations customers see on an upcoming-order snooze link by adding a snooze_options parameter with comma-separated day counts, for example 7, 14, and 28. Links without this parameter keep the default seven-day option.
Let customers swap across your full product catalog
The Swap scope setting in your Customer Portal settings now lets you offer your entire product catalog for swaps, including catalogs with more than 100 available products.
More flexible Shopify order tags
You can now use payment details and full Liquid logic in custom Shopify order tags, including conditions, filters, and arithmetic. Tag orders by payment provider or method to help organize fulfillment and accounting exports.
Minimum invoice amounts apply to Shopify subscription discounts
Your configured minimum invoice amount for discounts now also applies to Shopify-billed subscriptions. Discounts stay in sync as subscription products change, with automatic retries if a billing attempt starts before the update is complete.
Set a separate billing address for Shopify-native checkout subscriptions
If your project uses Shopify-native checkout, you can now set a billing address on a subscription that’s different from its shipping address, the same option already available to non-Shopify projects. It’s available from customer details in your admin, and in the Customer Portal.
Trace invoice and payment history through the API
The GraphQL API now exposes more detail about an invoice or payment’s history. Invoices include a chargedBackAt timestamp alongside paidAt, so you keep a record of when an invoice was paid even after it’s later charged back.
Send customers straight to the right Customer Portal page
You can now link customers directly to a subscription by adding subscription_id to the Customer Portal login URL or passing it when generating a login token through the API. Customers must already have access to that subscription; invalid or inaccessible targets use the normal login flow.
Choose whether to bill when confirming an order
When confirming an order in your admin, you can choose to confirm it only or Confirm and process billing. Billing runs only when you select that option and the order is eligible and has not yet been billed.
Add house number suffixes on any project
Every project can now record a house number suffix, such as “A” or “2 hoog,” using the house number addition field in the API or subscription preferences in your Firmhouse Portal. Use address2 for other additional address details.
Turn off checkout availability for a product without hiding it elsewhere
You can now turn off a product’s availability in checkout separately from its availability in the Customer Portal. This is useful when you want to retire an old or direct checkout link for a product while keeping it available to existing customers, or while it stays visible in the Customer Portal.
Custom cancellation and pause pages can skip the extra confirmation step
If you’ve built a custom cancellation or pause page for Customer Portal v2 that already confirms the customer’s choice, it can now complete the request directly instead of sending the customer through an additional Firmhouse confirmation step.
See cohort history all the way back to your project’s start
Cohort Analyses and Lifetime Value in Insights can now show data going all the way back to when your project started, instead of stopping after a fixed number of months.
Find subscriptions and cases by collections status
You can now filter subscriptions by Sent to collections, alongside Marked as non paying, to find customers who still need follow-up.
Show one clear reactivation offer in the Customer Portal
The Customer Portal dashboard no longer shows a duplicate reactivation prompt when a customer already sees a reactivation offer. When an eligible offer would reactivate a cancelled subscription or resume a paused one, the standard reactivation or resume prompt stays hidden until that offer is no longer available.
Clearer status for Script Execution webhooks
Script Execution webhook runs that succeed on the first try no longer show a misleading retry label. You can still check each run’s Queued, Completed, or Failed status and view its output to see exactly what happened.
Fixes
·
21
Shared plan schedules stay in sync when editing a shipment date
Changing a recurring product’s ship date directly, instead of through its subscribed plan, could quietly drift that product out of sync with the plan the rest of the subscription follows, which could then trigger an extra, unintended order a few days later. A product-only date change on a shared plan schedule is now blocked, pointing you to the subscribed plan instead, so the schedule stays in sync.
Reliable Shopify sync when a selling plan’s billing policy changes
Shopify doesn’t allow an existing selling plan to switch between fixed and recurring billing or delivery. When a plan changed policy type this way, the update was previously rejected and the entire selling plan group, including its product associations, stopped syncing. Firmhouse now recreates the selling plan when its policy type changes instead of updating it in place, so the rest of your Shopify sync keeps working.
Ensure correct invoice numbers in Mollie payment descriptions
Mollie payment descriptions now always show the real invoice number, instead of occasionally showing a placeholder like #000000 when an invoice was finalized before its number was assigned. Firmhouse now waits for the actual invoice number before updating Mollie, and repairs the stored description for any invoices this already happened to.
Correct tax treatment on Shopify renewal order prices
Shopify renewal orders with a price override could previously be priced incorrectly, because Firmhouse relied on a shop-wide tax setting instead of checking each order, which could make Shopify treat a net price as tax-inclusive and undercharge the customer. Firmhouse now checks the actual tax treatment of each renewal order before applying a price override, so the customer is always charged the correct total.
More accurate payment failure details for invalid mandates
When Mollie rejects a payment because it can’t find a suitable mandate for the customer, Firmhouse now classifies it with the specific invalid-mandate reason instead of a generic payment failure. The payment_failed webhook also always includes the retry date now, instead of sometimes sending it empty.
Order previews now work for external checkout subscriptions with promotions
Order previews for subscriptions created through external checkout now load correctly when a percentage-based promotion is applied, instead of failing with an error.
Order release follows payment and subscription status
If a payment retry succeeds after a subscription has been cancelled, the linked pending or snoozed order now stays pending. You receive an alert about the payment and can confirm the order manually if you choose to ship it.
More reliable Ship now orders
Using Ship now advances the shared shipping schedule correctly for single-product subscriptions, so the next regular shipment is not sent separately as an extra order.
Recovered recurring orders keep their original shipment details
Recovering a recurring order after a Shopify shipping cost error now creates the order with its original date and products, helping you fulfill the shipment as planned.
Clearer payment retries and recovery
Payment recovery now handles more retry situations with clear next steps:
Churn feedback remains visible for archived subscriptions
Review feedback from archived subscriptions in Analytics > Metrics > Churn Prevention, including the products recorded with that feedback. CSV exports continue to exclude archived subscriptions.
More reliable Customer Portal order details and quantity updates
Customer dashboards and order details now load reliably, including orders containing deleted products. Order details retain the original product title, and upcoming-order previews display correctly in the Customer Portal and your admin.
Checkout prevents duplicate payments from overlapping attempts
When a customer submits checkout more than once for the same subscription—for example, from two browser tabs—only the first attempt can proceed while it is in progress. This prevents overlapping attempts from creating duplicate payments and orders. A new checkout can start once the original attempt finishes.
Customer content uses the correct language
Emails, webhooks, Customer Portal pages, and other templated content now consistently use the language of the relevant subscription or request. This also keeps translated promotion names in the customer’s language when templates use a fallback language setting.
Smoother payments with Adyen checkout
Adyen checkout now shows the payment methods available for the customer’s country, currency, and amount, filtered by your configured selection. This restores eligible methods such as iDEAL and Bancontact; SEPA Direct Debit remains available for initial payments only.
Shopify orders carry their matching Firmhouse references
Shopify orders now use their own Firmhouse order, invoice, subscription, and payment IDs, even when imported subscription metadata contains references from an earlier order. This helps you match orders with the correct records in Firmhouse.
Free shipping discounts apply correctly to Shopify draft orders
Eligible customers now receive free shipping on Shopify draft orders for projects without a Shopify selling plan group, typically older projects not using Shopify’s native subscription billing. Firmhouse-generated free shipping codes apply correctly, allowing these orders to proceed with the intended shipping discount.
Required Extra Fields appear when creating subscriptions manually
The manual subscription creation form in your admin now includes your project’s required Extra Fields, so you can enter the necessary information and complete the subscription.
More accurate and reliable upcoming-order notices
Upcoming-order emails and webhooks now include active one-off add-ons alongside scheduled products, giving customers a complete preview of their next shipment. Add-ons leave the preview once the order is created.
Product ownership stays in sync with Shopify
When a customer takes ownership of a one-time product, the subscription’s ownership status now stays aligned between Firmhouse and Shopify. Affected subscriptions pause when the last remaining product is owned, or continue with the other products kept in sync.
Customer Portal template edits stay visible after saving
Your Customer Portal template edits stay visible after saving, including when a validation error needs your attention.