Shopify metafields and tags for Appstle Subscriptions
Reference for all Appstle Subscriptions metafields (namespace, keys, types) and customer/order tags, including Liquid template support for dynamic tag values.
Use this file to discover all available pages before exploring further.
Appstle Subscriptions uses Shopify metafields and tags to store subscription data, power the storefront widget, and enable automation workflows. All metafields use the namespace appstle_subscription without an $app: prefix, which means they are publicly readable by other apps, themes, and Liquid templates.
Shop metafields store the app’s configuration and are written whenever a merchant saves settings in the Appstle admin. Updates are synchronous (immediate).
Customer metafield updates are asynchronous. There may be a delay of a few seconds between a contract change and the metafield reflecting that change. Do not rely on this metafield for real-time data in time-sensitive operations.
Customer tags are dynamic — they change as subscription status changes. They follow a strict priority hierarchy: Active > Paused > Inactive. Only one status tag is active at a time.
Status
Condition
Config field
Default value
Active
Customer has 1+ active contracts
customerActiveSubscriptionTag
appstle_subscription_active_customer
Paused
Customer has paused contracts but no active ones
customerPausedSubscriptionTag
appstle_subscription_paused_customer
Inactive
All contracts cancelled
customerInActiveSubscriptionTag
appstle_subscription_inactive_customer
Tags are updated on every subscription lifecycle event: contract created, paused, resumed, cancelled, and billing attempts.
Customer tags support Liquid template syntax. Wrap variables in double curly braces:
active_subscriber_{{contract.sellingPlanNames}}
Available variables:
Variable
Type
Description
Example
{{customer.id}}
String
Shopify customer GID
gid://shopify/Customer/1234567890
{{contract.id}}
String
Subscription contract GID
gid://shopify/SubscriptionContract/9876
{{contract.sellingPlanIds}}
String
Comma-separated selling plan IDs
gid://shopify/SellingPlan/111
{{contract.sellingPlanNames}}
String
Comma-separated selling plan names
Monthly Subscription - 10% off
{{contract.variantIds}}
String
Comma-separated variant IDs
gid://shopify/ProductVariant/222
{{contract.variantNames}}
String
Comma-separated variant names
Default Title
{{contract.currentCycle}}
Number
Current billing cycle number
3
{{contract.cancellationReason}}
String
Cancellation reason if cancelled
Too expensive
{{order.id}}
String
First order GID
gid://shopify/Order/444
{{order.createdAt}}
String
First order creation date (ISO 8601)
2025-01-15T10:30:00Z
Template examples:
# Static tag (default behavior)appstle_subscription_active_customer# Dynamic tag with selling plan nameactive_subscriber_{{contract.sellingPlanNames}}# Result: active_subscriber_Monthly Subscription - 10% off# Dynamic tag with cycle countsubscriber_cycle_{{contract.currentCycle}}# Result: subscriber_cycle_3# Dynamic tag with variant namesubscribed_to_{{contract.variantNames}}# Result: subscribed_to_Default Title
Can I read subscription metafields from my Liquid theme?
Yes. All subscription metafields use the appstle_subscription namespace without an $app: prefix, so they are accessible in Liquid via {{ shop.metafields.appstle_subscription.setting }}, {{ customer.metafields.appstle_subscription.subscriptions }}, and so on.
How quickly are customer metafields updated after a contract change?
Customer metafield updates are processed asynchronously. Typical latency is a few seconds, but during high-traffic periods it may take a bit longer.
What happens to customer tags when a customer has multiple subscriptions?
Tags follow the priority hierarchy Active > Paused > Inactive. If a customer has both active and paused subscriptions, the active tag takes precedence. The inactive tag is only applied when all contracts are cancelled.
Can I backfill order tags for existing orders?
Yes. Use the applyMissedOrderTags API endpoint to apply tags to orders that were created before your tag configuration was set up.