Skip to main content

Billing
object

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.

(options: <Config>) => Promise<BillingCheckResponseObject>
required

Checks if the shop has an active payment for any plan defined in the billing config option.

(options: <Config>) => Promise<never>
required

Requests payment for the plan.

(options: ) => Promise<AppSubscription>
required

Cancels an ongoing subscription, given its ID.

Was this section helpful?

Call billing.request in the onFailure callback to immediately request payment.

Redirect to a different page in the onFailure callback, where the merchant can select a billing plan.

Was this section helpful?

Requesting billing right away

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
};

Change where the merchant is returned to after approving the purchase using the returnUrl option.

Was this section helpful?

Using a custom return URL

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
};

Use the billing.cancel function to cancel an active subscription with the id returned from billing.require.

Was this section helpful?

Cancelling a subscription

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
};