Skip to content
Development

Automating Stripe Product Sync: Building the sync_stripe_catalog Command

Learn how to automate your product management by creating a custom Django management command to fetch Products and Prices from the Stripe API and map them to your local Django models.

CodingBowl··2 min read
Photo by Christin Hume on Unsplash

This follow-up guide picks up where the environment setup left off. Now that your Stripe CLI and API keys are ready, we will build the actual logic to mirror your Stripe Product dashboard within your Django database.

Phase 1: Defining the Data Schema

1. Create Stripe-Compatible Models

In your models.py, define structures that match Stripe's object hierarchy. This allows you to store Product and Price data locally for faster queries.

`from django.db import models

class Product(models.Model):
stripe_id = models.CharField(max_length=255, unique=True)
name = models.CharField(max_length=255)
description = models.TextField(blank=True, null=True)
active = models.BooleanField(default=True)

class Price(models.Model):
stripe_id = models.CharField(max_length=255, unique=True)
product = models.ForeignKey(Product, on_delete=models.CASCADE, related_name="prices")
unit_amount = models.IntegerField()  # Stored in cents
currency = models.CharField(max_length=3, default='usd')`

Phase 2: The Sync Logic

2. Create the Management Directory

Django looks for custom commands in a specific folder structure. Create these directories (and empty init.py files) inside your app:

`your_app/management/commands/sync_stripe_catalog.py`

3. Write the Sync Script

Inside sync_stripe_catalog.py, use the update_or_create method to ensure your local database matches the Stripe API without creating duplicates:

`import stripe
from django.conf import settings
from django.core.management.base import BaseCommand
from your_app.models import Product, Price

stripe.api_key = settings.STRIPE_SECRET_KEY

class Command(BaseCommand):
def handle(self, *args, **options):
products = stripe.Product.list(active=True)
for sp in products:
local_product, _ = Product.objects.update_or_create(
stripe_id=sp.id,
defaults={'name': sp.name, 'description': sp.description}
)

prices = stripe.Price.list(product=sp.id, active=True)
for p in prices:
Price.objects.update_or_create(
stripe_id=p.id,
defaults={
'product': local_product,
'unit_amount': p.unit_amount,
'currency': p.currency
}
)
self.stdout.write("Catalog synced successfully.")`

Phase 3: Execution

4. Run the Migration

Apply your model changes to the database:

`python manage.py makemigrations
python manage.py migrate`

5. Perform the Initial Sync

Trigger your new command to pull data from your Stripe Dashboard into your local environment:

`python manage.py sync_stripe_catalog`

6. Verify Local Data

Open the Django shell or Admin panel to confirm that your Product and Price tables are now populated with your Stripe data.