Something went wrong. Try again.
a tool for shared writing and social publishing
Something went wrong. Try again.
TypeScript
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263import Stripe from "stripe";import { PRODUCT_DEF_ID, PRODUCT_DEFINITION, PRICE_DEFINITIONS } from "./products";
const stripe = new Stripe(process.env.STRIPE_SECRET_KEY as string, { apiVersion: "2026-02-25.clover",});
async function sync() { console.log("Syncing Stripe products and prices...");
// Find or create product let product: Stripe.Product | undefined; const existing = await stripe.products.search({ query: `metadata["product_def_id"]:"${PRODUCT_DEF_ID}"`, });
if (existing.data.length > 0) { product = existing.data[0]; console.log(`Found existing product: ${product.id}`); // Update if name or metadata changed product = await stripe.products.update(product.id, { name: PRODUCT_DEFINITION.name, metadata: PRODUCT_DEFINITION.metadata, }); console.log(`Updated product: ${product.id}`); } else { product = await stripe.products.create({ name: PRODUCT_DEFINITION.name, metadata: PRODUCT_DEFINITION.metadata, }); console.log(`Created product: ${product.id}`); }
// Sync prices by lookup_key for (const [cadence, def] of Object.entries(PRICE_DEFINITIONS)) { const existingPrices = await stripe.prices.list({ lookup_keys: [def.lookup_key], });
if (existingPrices.data.length > 0) { console.log( `Price "${def.lookup_key}" already exists: ${existingPrices.data[0].id}`, ); } else { const price = await stripe.prices.create({ product: product.id, unit_amount: def.unit_amount, currency: def.currency, recurring: def.recurring, lookup_key: def.lookup_key, }); console.log(`Created price "${def.lookup_key}": ${price.id}`); } }
console.log("Sync complete.");}
sync().catch((err) => { console.error("Sync failed:", err); process.exit(1);});