Contains function used to bill merchants for your app. This object is returned on authenticated Admin requests.
Provides utilities that apps can use to request billing for the app using the Admin API.
Checks if the shop has an active payment for any plan defined in the `billing` config option.
Requests payment for the plan.
Cancels an ongoing subscription, given its ID.
The plans to check for. Must be one of the values defined in the `billing` config option.
How to handle the request if the shop doesn't have an active payment for any plan.
The plan to request. Must be one of the values defined in the `billing` config option.
The ID of the subscription to cancel.
Whether to prorate the cancellation.
Contains function used to bill merchants for your app. This object is returned on authenticated Admin requests.
import { LoaderArgs } from "@remix-run/node";
import { authenticate, MONTHLY_PLAN } from "../shopify.server";
export const loader = async ({ request }: LoaderArgs) => {
const { billing } = await authenticate.admin(request);
await billing.require({
plans: [MONTHLY_PLAN],
isTest: true,
onFailure: async () => billing.request({ plan: MONTHLY_PLAN }),
});
// App logic
};
import { shopifyApp, BillingInterval } from "@shopify/shopify-app-remix/server";
export const MONTHLY_PLAN = 'Monthly subscription';
export const ANNUAL_PLAN = 'Annual subscription';
const shopify = shopifyApp({
// ...etc
billing: {
[MONTHLY_PLAN]: {
amount: 5,
currencyCode: 'USD',
interval: BillingInterval.Every30Days,
},
[ANNUAL_PLAN]: {
amount: 50,
currencyCode: 'USD',
interval: BillingInterval.Annual,
},
}
});
export default shopify;
export const authenticate = shopify.authenticate;
import { LoaderArgs, redirect } from "@remix-run/node";
import { authenticate, MONTHLY_PLAN, ANNUAL_PLAN } from "../shopify.server";
export const loader = async ({ request }: LoaderArgs) => {
const { billing } = await authenticate.admin(request);
const billingCheck = await billing.require({
plans: [MONTHLY_PLAN, ANNUAL_PLAN],
isTest: true,
onFailure: () => redirect('/select-plan'),
});
const subscription = billingCheck.appSubscriptions[0];
console.log(`Shop is on ${subscription.name} (id ${subscription.id})`);
// App logic
};
import { shopifyApp, BillingInterval } from "@shopify/shopify-app-remix/server";
export const MONTHLY_PLAN = 'Monthly subscription';
export const ANNUAL_PLAN = 'Annual subscription';
const shopify = shopifyApp({
// ...etc
billing: {
[MONTHLY_PLAN]: {
amount: 5,
currencyCode: 'USD',
interval: BillingInterval.Every30Days,
},
[ANNUAL_PLAN]: {
amount: 50,
currencyCode: 'USD',
interval: BillingInterval.Annual,
},
}
});
export default shopify;
export const authenticate = shopify.authenticate;
import { LoaderArgs } from "@remix-run/node";
import { authenticate, MONTHLY_PLAN } from "../shopify.server";
export const loader = async ({ request }: LoaderArgs) => {
const { billing } = await authenticate.admin(request);
await billing.require({
plans: [MONTHLY_PLAN],
onFailure: async () => billing.request({
plan: MONTHLY_PLAN,
isTest: true,
returnUrl: '/billing-complete',
}),
});
// App logic
};
import { shopifyApp, BillingInterval } from "@shopify/shopify-app-remix/server";
export const MONTHLY_PLAN = 'Monthly subscription';
export const ANNUAL_PLAN = 'Annual subscription';
const shopify = shopifyApp({
// ...etc
billing: {
[MONTHLY_PLAN]: {
amount: 5,
currencyCode: 'USD',
interval: BillingInterval.Every30Days,
},
[ANNUAL_PLAN]: {
amount: 50,
currencyCode: 'USD',
interval: BillingInterval.Annual,
},
}
});
export default shopify;
export const authenticate = shopify.authenticate;
import { LoaderArgs } from "@remix-run/node";
import { authenticate, MONTHLY_PLAN } from "../shopify.server";
export const loader = async ({ request }: LoaderArgs) => {
const { billing } = await authenticate.admin(request);
const billingCheck = await billing.require({
plans: [MONTHLY_PLAN],
onFailure: async () => billing.request({ plan: MONTHLY_PLAN }),
});
const subscription = billingCheck.appSubscriptions[0];
const cancelledSubscription = await billing.cancel({
subscriptionId: subscription.id,
isTest: true,
prorate: true,
});
// App logic
};
import { shopifyApp, BillingInterval } from "@shopify/shopify-app-remix/server";
export const MONTHLY_PLAN = 'Monthly subscription';
export const ANNUAL_PLAN = 'Annual subscription';
const shopify = shopifyApp({
// ...etc
billing: {
[MONTHLY_PLAN]: {
amount: 5,
currencyCode: 'USD',
interval: BillingInterval.Every30Days,
},
[ANNUAL_PLAN]: {
amount: 50,
currencyCode: 'USD',
interval: BillingInterval.Annual,
},
}
});
export default shopify;
export const authenticate = shopify.authenticate;