The customer self-serve portal.
Six actions every subscriber can take without emailing your support team. Reduces support tickets, gives customers the control they expect, and keeps your subscription data in sync with Shopify.
Daima embeds a Customer Account UI extension into Shopify's native customer portal. When a subscriber logs in to their Shopify account on your store, they see a "Subscriptions" section listing every active contract. Each contract exposes the six actions documented below. No middleware — every action calls Shopify's Subscription APIs directly, so the source of truth stays with Shopify.
Where subscribers find it. The Daima panel appears inside the customer's Shopify Account → Orders area, accessible from the link in any order confirmation email or directly at shop-name.com/account. There's no separate Daima login.
Skip the next delivery
A subscriber clicks Skip next delivery on any active contract. Daima skips the upcoming billing cycle and advances the next billing date by exactly one cycle (a weekly plan moves forward 7 days; a monthly plan moves forward one month).
The contract stays ACTIVE the whole time — only the next charge is skipped. Useful for subscribers who are travelling, overstocked, or just want a one-month break without cancelling.
Pause and resume
Pausing sets the contract's status to PAUSED. No further billing attempts run until the subscriber clicks Resume, which flips it back to ACTIVE and resumes the original schedule from the next eligible billing date.
Pause is the right choice when a subscriber wants to stop indefinitely without cancelling. They keep their pricing, their plan, their order history. When they're ready to come back, one click resumes them.
Cancel
Cancellation is final. The contract status moves to CANCELLED and Shopify stops all future billing attempts. The subscriber's order history stays intact, and they can subscribe again later, but the cancelled contract itself can't be revived — they'd start a new one.
Change the next billing date
Subscribers can shift their next billing date forward or backward within the current billing cycle. The portal shows the valid date range (cycle start to cycle end) and rejects dates outside it — Shopify enforces this constraint at the API level.
The change is recorded as a BUYER_INITIATED schedule edit on the billing cycle, which means it's tracked in Shopify's audit log. Once accepted, the next charge happens on the new date.
Why "within the cycle" not "any future date". Shopify treats each billing cycle as a discrete unit with a start and end. Moving a date across cycles would skip or duplicate a billing event. Daima's panel surfaces the valid range up front so subscribers don't see confusing rejections.
Swap product
Subscribers can swap one subscription line for a different variant. The replacement variant must belong to the same selling plan group as the original — Daima validates this server-side before applying the change.
This means a "Subscribe & Save Coffee" plan that includes Ethiopian Yirgacheffe and Colombian Supremo lets a subscriber swap between the two. It does NOT let them swap to a product on a different plan (e.g. they can't swap their Coffee subscription for a Tea subscription) — the boundary is plan-defined, not catalog-wide.
Under the hood, swap creates a draft of the contract via subscriptionContractUpdate, edits the matching line via subscriptionDraftLineUpdate, and commits via subscriptionDraftCommit. From the subscriber's perspective, it's one click.
Subscriber data isolation
Every customer-facing endpoint Daima exposes verifies the JWT, scopes the query to the authenticated customer ID, and defense-in-depth checks each returned subscription contract's customer.id against the JWT before responding. A subscriber will only ever see their own contracts — never another customer's.
What you see on the merchant side
Every customer-initiated action also fires a Shopify Flow trigger from the merchant side, so you can build automations on top:
- Pause →
subscription_paused - Resume →
subscription_resumed - Cancel →
subscription_cancelled - Skip →
subscription_skipped
A common pattern: trigger a "We hate to see you go — was there an issue?" email on cancel, or a Slack alert when a high-value subscriber pauses. Build whatever your retention strategy needs.