Loading...
Loading...
Guide for implementing Shopify's Billing API, enabling app monetization through subscriptions and one-time charges. Use this skill when the user needs to create recurring application charges, one-time purchases, or check subscription status.
npx skill4agent add toilahuongg/google-antigravity-kit shopify-billing[!IMPORTANT] GraphQL Only: The REST Billing API is deprecated. Always use the GraphQL Admin API for billing operations.
appSubscriptionCreate/* app/routes/app.upgrade.tsx */
import { authenticate } from "../shopify.server";
export const action = async ({ request }) => {
const { admin } = await authenticate.admin(request);
const shop = await admin.graphql(`
mutation AppSubscriptionCreate($name: String!, $lineItems: [AppSubscriptionLineItemInput!]!, $returnUrl: URL!) {
appSubscriptionCreate(name: $name, returnUrl: $returnUrl, lineItems: $lineItems) {
userErrors {
field
message
}
appSubscription {
id
}
confirmationUrl
}
}
`,
{
variables: {
name: "Pro Plan",
returnUrl: "https://myapp.com/app",
lineItems: [{
plan: {
appRecurringPricingDetails: {
price: { amount: 10.00, currencyCode: "USD" },
interval: "EVERY_30_DAYS"
}
}
}]
}
});
const response = await shop.json();
const confirmationUrl = response.data.appSubscriptionCreate.confirmationUrl;
// Redirect merchant to approve charge
return redirect(confirmationUrl);
};appPurchaseOneTimeCreateconst response = await admin.graphql(`
mutation AppPurchaseOneTimeCreate($name: String!, $price: MoneyInput!, $returnUrl: URL!) {
appPurchaseOneTimeCreate(name: $name, returnUrl: $returnUrl, price: $price) {
userErrors { field message }
confirmationUrl
}
}
`, {
variables: {
name: "Concierge Setup",
returnUrl: "https://myapp.com/app",
price: { amount: 50.00, currencyCode: "USD" }
}
});currentAppInstallation/* app/shopify.server.ts (billing config) */
export const billing = {
"Pro Plan": {
amount: 10.00,
currencyCode: "USD",
interval: "EVERY_30_DAYS",
},
};
/* Checking in loader */
const { billing } = await authenticate.admin(request);
const billingCheck = await billing.require({
plans: ["Pro Plan"],
isTest: true, // Use true for development stores
onFailure: async () => billing.request({ plan: "Pro Plan", isTest: true }),
});
const subscription = billingCheck.appSubscriptions[0];query {
currentAppInstallation {
activeSubscriptions {
id
name
status
lineItems {
plan {
pricingDetails {
... on AppRecurringPricing {
price { amount currencyCode }
}
}
}
}
}
}
}test: trueisTestconfirmationUrlapp_subscriptions/update