Enable promotional offers
Promotional offers are part of the Workflow Builder preview.- In your Firmhouse project, open New Features.
- Enable Workflow Builder.
- Open Offers from the sidebar.
Create an offer
- Open Offers and select New offer.
- Enter an internal name and choose whether the offer is a draft, active, or archived.
- Set its priority and acceptance window. To let customers accept an offer after initially declining it, select Allow customers to reconsider declined offers. The offer remains available only while the customer is eligible and the acceptance window is open.
- Add the customer-facing headline, explanation, and benefit summary for every language enabled on the project.
- Add any eligibility conditions.
- Choose one benefit and, optionally, a minimum term.
- Save the offer and make it active when it is ready for customers.
Choose who qualifies
You can target an offer using:- Cancellation reason
- Subscription status
- Number of completed deliveries
- Revenue for the current subscription
- Current plan
- Current products
- Synchronized subscription segments
- Shopify order tags
Exclude subscriptions from an offer
In the Eligibility tab, add a condition and choose Exclude when this condition matches:- Exclude a prepaid plan: Choose Current plan, then select the prepaid plan under Plan is. Add a separate exclusion for each plan. New prepaid plans are not excluded automatically.
- Exclude subscriptions that already have a product: Choose Current products, select Has any of, and choose the products. Having any selected product active on the subscription makes it ineligible.
Target subscriptions using Shopify order tags
Choose Shopify order tags as a condition, then search and select one or more tags in the dropdown. The choices come from Shopify tags synchronized to this project’s orders. For example, selectSUMMER_SALE to target subscriptions with an order carrying that campaign tag. Tags already saved on the offer remain selected even if they no longer appear on an order.
A subscription qualifies when any of its orders has any of the entered tags. Tags match exactly, including capitalization. Orders from another subscription do not qualify it, even when both subscriptions use the same email address.
Firmhouse synchronizes tags from Shopify when an order is linked and when Shopify sends an order update. Removing a tag can make the offer unavailable, including for a link sent earlier. Previously linked orders need their tags synchronized before they can qualify; contact Firmhouse if historical campaign orders are missing tags.
For a campaign shown only in the second-order reminder, use the order number to control the email block. Add an order-count condition to the offer only if acceptance should also stop after that order.
Choose the benefit
Each active offer has one benefit:- Apply an existing active promotion
- Add a complimentary one-off product
- Swap a current product
- Switch to another plan in the same plan group
Show offers during cancellation
After a customer selects a cancellation reason, Firmhouse can show the first matching promotional offer before the normal churn-prevention action. The customer can accept or decline the offer, or choose the existing pause, skip, postponement, discount, or cancellation option shown with it. In the offer editor’s Eligibility tab, add a Cancellation reason condition to show an offer during cancellation for that reason. The selected reason shows its configured alternative action and an Edit cancellation reason link. Offers without a cancellation-reason condition are not shown during cancellation. You can also start from Customer Portal → Churn prevention (or Settings → Churn prevention for the legacy portal). Open a reason, check Create an offer for this reason, and choose Save and create offer to open a draft with that reason preselected. Save the offer to return to the reason. Existing offers can be edited from the same reason screen. Only active, automatic offers are selected automatically during cancellation. Draft, archived, and manual offers are not. Inactive or deleted cancellation reasons cannot be selected by customers, and pause-flow reasons do not trigger promotional offers. The reason’s Alternative action is independent of offer eligibility. Pause or skip remains available alongside an eligible promotional offer and when the offer is unavailable or declined. Continue to cancellation adds no pause or skip alternative; it does not prevent a promotional offer from appearing. Accepted offers apply their configured benefit and optional minimum term, and record the churn request as prevented. Declining returns the customer to the normal cancellation flow. When Allow customers to reconsider declined offers is selected, customers can open the same eligible offer again and accept it before its acceptance window closes. For the surrounding cancellation setup, see Cancellation feedback and winback flows.Share an offer outside cancellation
Workflow Builder and the GraphQL API can issue a customer-specific offer and return its plain acceptance URL. In a Liquid email or notification, pipe that URL throughssc_hotlink before sending it to a customer. Configure the project’s public URL before sending offer links.
Show offers in Customer Portal v2
The default Customer Portal v2 dashboard shows the highest-priority pending eligible offer. Custom dashboard templates can use{% promotional_offer %} or loop over subscription.eligible_promotional_offers.
See the dashboard template reference for Liquid examples.
Review issued offers
Open a subscription in Firmhouse to review its issued promotional offers and their current status. An issued offer records whether it was viewed, accepted, rejected, or expired.Find customers by offer interaction
On Offers, click an offer’s issued, accepted, or declined subscription count to open the matching Customers list. Each count represents distinct subscriptions: a subscription that received the same offer several times appears once in that list. You can also open Customers and add these filters:- Offer: Choose the offer, including an archived offer with history.
- Offer interaction: Choose Issued, Accepted, or Declined. Selecting only an offer defaults to Issued.
- Offer interaction date: Optionally choose when the interaction happened. The dates include the whole selected day in Firmhouse’s Amsterdam timezone.
Analyze the group with Claude or Oppy
Connect your agent to Firmhouse MCP, then ask:Find subscriptions that accepted [offer name] between September 1 and September 30. Show their orders after acceptance and their current subscription status. For repeat acceptances, use the first acceptance in that period as the starting point and state that choice.The GraphQL API provides
offerDefinitions to find the offer, subscriptions for distinct subscriptions, and promotionalOffers for the matching offer instances and timestamps. Both connections accept offerDefinitionId, offerEvent, offerEventSince, and offerEventUntil as direct filter arguments. Queries do not issue offers or require tags. Use the same offer filters for the subscription list and offer history, and paginate both connections.
The API event REJECTED corresponds to Declined in the admin. Selecting only offerDefinitionId includes all issued offers, regardless of their current status. Event filters require an offer definition, and date filters require an explicit offerEvent. To retrieve issued-offer history without selecting a particular event or offer, query promotionalOffers without offer filters; optionally use subscriptionId to restrict it to one subscription.
For example, after finding the offer ID:
subscriptionAccountId only when you want account-level analysis instead of subscription-level analysis.
Recorded viewedAt timestamps and the API’s VIEWED filter have incomplete historical coverage. Some portal offers can be displayed without a saved offer record. An absent view timestamp does not prove the customer never saw the offer, and an issued count is not a shown count.
Troubleshooting
- Offers is missing from the sidebar: Enable Workflow Builder under New Features.
- No offer is shown: Confirm that the offer is active, has not expired, and that every condition and selected benefit applies to the subscription.
- A segment condition is unavailable: Confirm that subscription segments have been synchronized for the project.
- An offer hotlink cannot be created: Configure the project’s public URL, ensure the issuing project has Workflow Builder enabled, and apply
ssc_hotlinkto the returned acceptance URL in Liquid.