Skip to content
Last updated

Shopify Flow Integration

Appstle Subscriptions integrates natively with Shopify Flow, Shopify's built-in automation platform. Use Flow to automate subscription management without any API tokens or external authentication — everything runs securely within Shopify's ecosystem.

ℹ️ Why Shopify Flow? Shopify Flow actions run within Shopify's authenticated context, so there's no need for API tokens or credentials. This makes Flow the most secure way to automate subscription operations — perfect for merchants who want powerful automation without managing API keys.

Getting Started

  1. In the Appstle admin, go to Settings → Integrations → Shopify Flow
  2. Enable the Shopify Flow integration
  3. Open the Shopify Flow editor in your Shopify admin
  4. Create a new workflow using Appstle triggers and actions

Triggers

Triggers fire automatically when subscription events occur. Use them to start Flow workflows.

Subscription Lifecycle

TriggerDescription
Subscription CreatedFires when a new subscription contract is created
Subscription ActivatedFires when a subscription is activated from paused or cancelled status
Subscription CancelledFires when a subscription is cancelled
Subscription PausedFires when a subscription is paused
Subscription UpdatedFires when a subscription is updated (products, quantity, address, etc.)

Billing Events

TriggerDescription
Subscription Billing SuccessFires when a billing attempt (payment) is successful
Subscription Billing FailureFires when a billing attempt (payment) fails
Upcoming Order NotificationFires when an upcoming order notification is sent (based on configured buffer days)

Schedule Changes

TriggerDescription
Subscription Billing Interval ChangedFires when the billing frequency is changed
Subscription Next Order Date ChangedFires when the next billing/order date is modified

Trigger Properties

All triggers include a full set of subscription and customer properties. Some triggers include additional context-specific fields.

Subscription Properties

Included with every trigger:

PropertyTypeDescription
Subscription IDNumberInternal subscription contract ID
GraphQL Subscription IDStringGraphQL ID of the subscription contract
StatusStringCurrent status: ACTIVE, PAUSED, CANCELLED, EXPIRED, FAILED
Next Billing DateStringNext billing date in UTC ISO 8601 (yyyy-MM-dd'T'HH:mm:ss'Z'). Empty string if not ACTIVE.
Billing IntervalStringBilling frequency unit: DAY, WEEK, MONTH, YEAR
Billing Interval CountNumberNumber of intervals between billings (e.g., 2 + MONTH = every 2 months)
Delivery IntervalStringDelivery frequency unit: DAY, WEEK, MONTH, YEAR
Delivery Interval CountNumberNumber of intervals between deliveries
Original Order IDNumberID of the first order. 0 for imported contracts.
Original Order NameStringName of the first order. Empty string for imported contracts.
Cancel ReasonStringReason for cancellation (empty string if not cancelled)
Pause ReasonStringReason for pause (empty string if not paused)
Total Successful OrdersNumberTotal successfully completed orders for this contract
Line ItemsArrayArray of line items (see Line Items schema below)
Order Note AttributesArrayArray of key-value note attributes (see Order Note Attributes schema below)

Customer Properties

Included with every trigger:

PropertyTypeDescription
customer_referenceReferenceShopify customer reference
Customer EmailEmailCustomer's email address
Customer PhoneStringCustomer's phone number (empty string if not available)
Customer Display NameStringCustomer's display name (empty string if not available)
Customer First NameStringCustomer's first name (empty string if not available)
Customer Last NameStringCustomer's last name (empty string if not available)

Billing Event Properties

For Subscription Billing Success, Subscription Billing Failure, and Upcoming Order Notification triggers only:

PropertyTypeDescription
Billing Attempt IDNumberID of the billing attempt
Billing Attempt StatusStringSUCCESS, FAILURE, PENDING, or SCHEDULED
Billing Attempt CountNumberNumber of billing attempts
Billing DateStringScheduled billing date (UTC ISO 8601)
Billing Attempt TimeStringActual attempt timestamp (UTC ISO 8601)

For Subscription Billing Success only:

PropertyTypeDescription
Recurring Order IDNumberOrder ID from successful renewal
Recurring Order NameStringOrder name from successful renewal
order_referenceReferenceShopify order reference

Subscription Updated Properties

For Subscription Updated trigger only:

PropertyTypeDescription
Contract AmountNumberTotal line item amount in contract currency
Contract Amount USDNumberTotal line item amount converted to USD

Line Items Schema

The Line Items property is an array of objects, each representing a product line in the subscription:

FieldTypeDescription
lineItemIdStringID of the line item
variantIdFloatShopify variant ID
graphqlVariantIdStringGraphQL variant ID
productIdIDShopify product ID (GraphQL format)
quantityIntQuantity
graphqlSellingPlanIdStringSelling plan ID associated with this line
sellingPlanNameStringSelling plan name
customAttributesArrayKey-value custom attributes on the line item

Order Note Attributes Schema

The Order Note Attributes property is an array of key-value pairs:

FieldTypeDescription
keyStringAttribute key
valueStringAttribute value

Actions

Actions are operations you can perform on subscriptions from within a Flow workflow.

Line Item Management

ActionDescriptionRequired Fields
Add Line ItemAdd a product to a subscriptioncontract_id, product_variant_id, quantity
Remove Line ItemRemove a product from a subscriptioncontract_id, line_id
Update Line Item QuantityChange product quantitycontract_id, line_id, quantity
Update Line Item PriceChange product pricecontract_id, line_id, base_price
Update Line Item AttributesUpdate custom attributes on a line itemcontract_id, line_id, attributes (JSON)
Replace VariantSwap a product variant for anothercontract_id, old_variant_id, new_variant_id

Subscription Management

ActionDescriptionRequired Fields
Update Subscription StatusSet status to Active, Paused, or Cancelledcontract_id, status
Hide SubscriptionHide from customer portalcontract_id
Merge SubscriptionsCombine two subscriptions into onesource_contract_id, destination_contract_id
Split SubscriptionSplit into separate subscriptionscontract_id, line_ids
Update Selling PlanChange the selling plan for a line itemcontract_id, line_id, selling_plan_id
Update Order NoteUpdate the order notecontract_id, order_note
Update Note AttributesUpdate custom note attributescontract_id, note_attributes (JSON)

Billing & Schedule

ActionDescriptionRequired Fields
Update Billing IntervalChange billing frequency (e.g., monthly → weekly)contract_id, billing_interval_count, billing_interval
Update Frequency by Selling PlanChange frequency using an existing selling plancontract_id, selling_plan_id
Update Billing DateReschedule the next billing datecontract_id, next_billing_date (ISO 8601)
Skip OrderSkip the next scheduled ordercontract_id, line_id
Attempt BillingTrigger immediate billing/order placementcontract_id or billing_attempt_id
Update Max CyclesSet maximum billing cyclescontract_id, max_cycles
Update Min CyclesSet minimum billing cyclescontract_id, min_cycles

Discounts & Pricing

ActionDescriptionRequired Fields
Apply Discount CodeApply a discount code to a subscriptioncontract_id, discount_code
Remove DiscountRemove a discount from a subscriptioncontract_id, discount_id
Update Pricing PolicyUpdate pricing policy with cycle-based discountscontract_id, base_price

Delivery & Shipping

ActionDescriptionRequired Fields
Update Delivery IntervalChange delivery frequencycontract_id, delivery_interval_count, delivery_interval
Update Delivery MethodChange the shipping methodcontract_id, delivery_method_title
Update Delivery PriceChange shipping pricecontract_id, delivery_price
Update Shipping AddressUpdate delivery addresscontract_id, address1, city, country_code

Payment

ActionDescriptionRequired Fields
Update Payment MethodSend payment method update to customercontract_id

Output Fields

All actions return output fields that can be used in subsequent Flow steps. Every action returns at minimum a success_message field indicating the result of the operation.


Action Details

Detailed input and output fields for each action. Use the summary tables above for quick reference.

Add Line Item

Add a product variant to an existing subscription.

Input Fields:

FieldTypeRequiredDescription
contract_idStringSubscription contract ID
product_variant_idStringShopify product variant ID to add
quantityStringQuantity to add
is_one_time_productString"true" or "false" — add as a one-time (non-recurring) line item. Default: "false"

Output Fields:

FieldTypeDescription
contract_idStringSubscription contract ID
product_variant_idStringVariant ID that was added
quantityStringQuantity added
is_one_time_productStringWhether the item was added as one-time
success_messageStringResult message

Remove Line Item

Remove a product from a subscription.

Input Fields:

FieldTypeRequiredDescription
contract_idStringSubscription contract ID
line_idStringLine item ID to remove
remove_discountStringWhether to remove the discount associated with this line item

Output Fields:

FieldTypeDescription
contract_idStringSubscription contract ID
line_idStringLine item ID that was removed
remove_discountStringWhether discount was removed
success_messageStringResult message

Update Line Item Quantity

Change the quantity of a product in a subscription.

Input Fields:

FieldTypeRequiredDescription
contract_idStringSubscription contract ID
line_idStringLine item ID
quantityStringNew quantity

Output Fields:

FieldTypeDescription
contract_idStringSubscription contract ID
line_idStringLine item ID
quantityStringUpdated quantity
success_messageStringResult message

Update Line Item Price

Change the price of a product in a subscription.

Input Fields:

FieldTypeRequiredDescription
contract_idStringSubscription contract ID
line_idStringLine item ID
base_priceStringNew base price
remove_pricing_policyBooleanWhether to remove the existing pricing policy. Default: false

Output Fields:

FieldTypeDescription
contract_idStringSubscription contract ID
line_idStringLine item ID
base_priceStringUpdated price
remove_pricing_policyBooleanWhether pricing policy was removed
success_messageStringResult message

Update Line Item Attributes

Update custom attributes on a line item.

Input Fields:

FieldTypeRequiredDescription
contract_idStringSubscription contract ID
line_idStringLine item ID
attributesStringJSON array of key-value pairs

Output Fields:

FieldTypeDescription
contract_idStringSubscription contract ID
line_idStringLine item ID
success_messageStringResult message

Replace Variant

Swap a product variant for another in a subscription.

Input Fields:

FieldTypeRequiredDescription
contract_idStringSubscription contract ID
old_variant_idStringComma-separated variant IDs to replace
new_variant_idStringComma-separated variant IDs with optional quantities (e.g., 11111:2,22222:1)
old_line_idStringSpecific line ID to replace (use when multiple lines have the same variant)
carry_forward_discountStringWhether to carry the existing discount to the new variant

Output Fields:

FieldTypeDescription
contract_idStringSubscription contract ID
old_variant_idStringVariant IDs that were replaced
new_variant_idStringNew variant IDs
success_messageStringResult message

Update Subscription Status

Set a subscription's status to Active, Paused, or Cancelled.

Input Fields:

FieldTypeRequiredDescription
contract_idStringSubscription contract ID
statusStringACTIVE, PAUSED, or CANCELLED

Output Fields:

FieldTypeDescription
contract_idStringSubscription contract ID
statusStringUpdated status
success_messageStringResult message

Hide Subscription

Hide a subscription from the customer portal.

Input Fields:

FieldTypeRequiredDescription
contract_idStringSubscription contract ID

Output Fields:

FieldTypeDescription
contract_idStringSubscription contract ID
success_messageStringResult message

Merge Subscriptions

Combine two subscriptions into one.

Input Fields:

FieldTypeRequiredDescription
source_contract_idStringContract ID to merge from
destination_contract_idStringContract ID to merge into

Output Fields:

FieldTypeDescription
source_contract_idStringSource contract ID
destination_contract_idStringDestination contract ID
success_messageStringResult message

Split Subscription

Split specific line items into a new subscription.

Input Fields:

FieldTypeRequiredDescription
contract_idStringSubscription contract ID
line_idsStringComma-separated line item IDs to move
attempt_billingStringWhether to immediately bill the new contract after splitting

Output Fields:

FieldTypeDescription
original_contract_idStringOriginal contract ID
new_contract_idStringNewly created contract ID
line_ids_movedStringLine item IDs that were moved
success_messageStringResult message

Update Selling Plan

Change the selling plan for a line item.

Input Fields:

FieldTypeRequiredDescription
contract_idStringSubscription contract ID
line_idStringLine item ID
selling_plan_idStringNew selling plan ID
selling_plan_nameStringDisplay name for the new selling plan

Output Fields:

FieldTypeDescription
contract_idStringSubscription contract ID
line_idStringLine item ID
selling_plan_idStringUpdated selling plan ID
success_messageStringResult message

Update Order Note

Update the order note on a subscription.

Input Fields:

FieldTypeRequiredDescription
contract_idStringSubscription contract ID
order_noteStringNew order note text

Output Fields:

FieldTypeDescription
contract_idStringSubscription contract ID
success_messageStringResult message

Update Note Attributes

Update custom note attributes on a subscription.

Input Fields:

FieldTypeRequiredDescription
contract_idStringSubscription contract ID
note_attributesStringJSON array of key-value pairs
overwrite_existingBooleantrue to replace all existing attributes; false to merge with existing. Default: false

Output Fields:

FieldTypeDescription
contract_idStringSubscription contract ID
attributes_countNumberNumber of attributes after update
overwrite_existingBooleanWhether existing attributes were overwritten
success_messageStringResult message

Update Billing Interval

Change the billing frequency.

Input Fields:

FieldTypeRequiredDescription
contract_idStringSubscription contract ID
billing_interval_countStringNumber of intervals between billings
billing_intervalStringInterval unit: DAY, WEEK, MONTH, YEAR

Output Fields:

FieldTypeDescription
contract_idStringSubscription contract ID
billing_interval_countStringUpdated interval count
billing_intervalStringUpdated interval unit
success_messageStringResult message

Update Frequency by Selling Plan

Change billing and delivery frequency using an existing selling plan.

Input Fields:

FieldTypeRequiredDescription
contract_idStringSubscription contract ID
selling_plan_idStringSelling plan ID to apply

Output Fields:

FieldTypeDescription
contract_idStringSubscription contract ID
selling_plan_idStringApplied selling plan ID
selling_plan_nameStringSelling plan name
billing_interval_countStringUpdated billing interval count
billing_intervalStringUpdated billing interval unit
delivery_interval_countStringUpdated delivery interval count
delivery_intervalStringUpdated delivery interval unit
success_messageStringResult message

Update Billing Date

Reschedule the next billing date.

Input Fields:

FieldTypeRequiredDescription
contract_idStringSubscription contract ID
next_billing_dateStringNew billing date (ISO 8601)

Output Fields:

FieldTypeDescription
contract_idStringSubscription contract ID
next_billing_dateStringUpdated billing date
success_messageStringResult message

Skip Order

Skip (or unskip) the next scheduled order.

Input Fields:

FieldTypeRequiredDescription
contract_idStringSubscription contract ID
line_idStringLine item ID
is_skipBooleantrue to skip, false to unskip. Default: true

Output Fields:

FieldTypeDescription
contract_idStringSubscription contract ID
line_idStringLine item ID
is_skipBooleanWhether the order was skipped
success_messageStringResult message

Attempt Billing

Trigger immediate billing/order placement.

Input Fields:

FieldTypeRequiredDescription
contract_idString✅*Subscription contract ID (*one of contract_id or billing_attempt_id required)
billing_attempt_idString✅*Billing attempt ID (*alternative to contract_id)

Output Fields:

FieldTypeDescription
contract_idStringSubscription contract ID
success_messageStringResult message

Update Max Cycles

Set the maximum number of billing cycles.

Input Fields:

FieldTypeRequiredDescription
contract_idStringSubscription contract ID
max_cyclesStringMaximum billing cycles

Output Fields:

FieldTypeDescription
contract_idStringSubscription contract ID
max_cyclesStringUpdated max cycles
success_messageStringResult message

Update Min Cycles

Set the minimum number of billing cycles.

Input Fields:

FieldTypeRequiredDescription
contract_idStringSubscription contract ID
min_cyclesStringMinimum billing cycles

Output Fields:

FieldTypeDescription
contract_idStringSubscription contract ID
min_cyclesStringUpdated min cycles
success_messageStringResult message

Apply Discount Code

Apply a discount code to a subscription.

Input Fields:

FieldTypeRequiredDescription
contract_idStringSubscription contract ID
discount_codeStringDiscount code to apply

Output Fields:

FieldTypeDescription
contract_idStringSubscription contract ID
discount_codeStringApplied discount code
success_messageStringResult message

Remove Discount

Remove a discount from a subscription.

Input Fields:

FieldTypeRequiredDescription
contract_idStringSubscription contract ID
discount_idString✅*Discount ID to remove (*one of discount_id or discount_code required)
discount_codeStringDiscount code to remove (alternative to discount_id)

Output Fields:

FieldTypeDescription
contract_idStringSubscription contract ID
discount_idStringRemoved discount ID
success_messageStringResult message

Update Pricing Policy

Update pricing policy with cycle-based discounts.

Input Fields:

FieldTypeRequiredDescription
contract_idStringSubscription contract ID
base_priceStringBase price for the line item
line_idStringSpecific line item ID (if not provided, applies to all lines)
cyclesStringJSON defining cycle-based pricing adjustments
overwrite_existingBooleanWhether to replace existing pricing policy or merge. Default: false

Output Fields:

FieldTypeDescription
contract_idStringSubscription contract ID
line_idStringLine item ID
base_priceStringUpdated base price
success_messageStringResult message

Update Delivery Interval

Change the delivery frequency.

Input Fields:

FieldTypeRequiredDescription
contract_idStringSubscription contract ID
delivery_interval_countStringNumber of intervals between deliveries
delivery_intervalStringInterval unit: DAY, WEEK, MONTH, YEAR

Output Fields:

FieldTypeDescription
contract_idStringSubscription contract ID
delivery_interval_countStringUpdated interval count
delivery_intervalStringUpdated interval unit
success_messageStringResult message

Update Delivery Method

Change the shipping method on a subscription.

Input Fields:

FieldTypeRequiredDescription
contract_idStringSubscription contract ID
delivery_method_titleStringShipping method title
delivery_method_codeStringShipping method code
delivery_method_presentment_titleStringCustomer-facing title for the shipping method
delivery_method_idStringSpecific delivery method ID

Output Fields:

FieldTypeDescription
contract_idStringSubscription contract ID
delivery_method_titleStringUpdated method title
delivery_method_codeStringUpdated method code
success_messageStringResult message

Update Delivery Price

Change the shipping price on a subscription.

Input Fields:

FieldTypeRequiredDescription
contract_idStringSubscription contract ID
delivery_priceStringNew shipping price

Output Fields:

FieldTypeDescription
contract_idStringSubscription contract ID
delivery_priceStringUpdated shipping price
success_messageStringResult message

Update Shipping Address

Update the delivery address on a subscription.

Input Fields:

FieldTypeRequiredDescription
contract_idStringSubscription contract ID
address1StringStreet address
cityStringCity
country_codeStringTwo-letter country code (e.g., US, CA)
address2StringApartment, suite, etc.
provinceStringState/province name
province_codeStringState/province code (e.g., CA, ON)
zipStringPostal/ZIP code
countryStringFull country name
first_nameStringRecipient first name
last_nameStringRecipient last name
phoneStringRecipient phone number
companyStringCompany name
location_idStringShopify location ID
method_typeStringDelivery method type

Output Fields:

FieldTypeDescription
contract_idStringSubscription contract ID
address1StringUpdated street address
cityStringUpdated city
country_codeStringUpdated country code
success_messageStringResult message

Update Payment Method

Send a payment method update request to the customer.

Input Fields:

FieldTypeRequiredDescription
contract_idStringSubscription contract ID

Output Fields:

FieldTypeDescription
contract_idStringSubscription contract ID
success_messageStringResult message

Example Workflows

Auto-pause after 3 failed payments

Trigger: Subscription Billing Failure Condition: Check if this is the 3rd consecutive failure Action: Update Subscription Status → PAUSED

Apply loyalty discount after 6 months

Trigger: Subscription Billing Success Condition: Current billing cycle ≥ 6 Action: Apply Discount Code → LOYAL10

Notify team on high-value cancellation

Trigger: Subscription Cancelled Condition: Subscription value > $100/month Action: Send Slack notification (via Shopify Flow's Slack connector)

Auto-swap seasonal products

Trigger: Scheduled (monthly, via Shopify Flow's scheduler) Action: Replace Variant → swap summer product for winter product

Field Reference

Billing Interval Values

Use these values for billing_interval and delivery_interval fields:

  • DAY
  • WEEK
  • MONTH
  • YEAR

Status Values

Use these values for the status field:

  • ACTIVE
  • PAUSED
  • CANCELLED

Date Format

All date fields use ISO 8601 format: 2026-03-15T10:00:00Z

Attributes Format

For attributes and note_attributes fields, use JSON array format:

[
  {"key": "gift_message", "value": "Happy Birthday!"},
  {"key": "delivery_instructions", "value": "Leave at door"}
]

Replace Variant Format

  • old_variant_id: Comma-separated variant IDs to replace (e.g., 12345,67890)
  • new_variant_id: Comma-separated variant IDs with optional quantities (e.g., 11111:2,22222:1)

Notes

  • Shopify Flow is available on Shopify Basic plan and above
  • Flow actions require the Appstle Subscriptions app to be installed and the Flow integration enabled
  • The Attempt Billing action requires additional permission — contact support to enable
  • All actions are logged in the subscription activity log with source SHOPIFY_FLOW