I have always wanted to ability to add products in the shop at £0 (or $ or Euro - whatever your currency is) but was always told by AI that it wasn't possible because Stripe has a minimum payment level. Well, today I finally managed to get that set up on Djangify.
How? I used Claude Cowork and told it I want zero sales what do you have to do to make that happen. Previously, I asked is it possible and it always says no it isn't. So a simple reframe changed that answer.
This is a genuine checkout path built through Stripe, with the same trust signals a paid checkout already has. Here's what changed and why each piece was needed.
A real £0 checkout, not a fake one
Before this update, there wasn't a proper way to hand out a product for free through the store. Now, when a cart total comes to zero, whether through a 100%-off coupon or a product priced at £0, Djangify creates a genuine Stripe Checkout Session for it rather than skipping Stripe altogether. That keeps order records, receipts, and the rest of the checkout plumbing consistent whether someone pays £30 or nothing at all.
Free orders also now land on an on-site confirmation page first, instead of redirecting straight out to Stripe's hosted page. That single change mattered more than it sounds: the paid checkout already asks buyers to opt in to the mailing list right there in the payment form, but the free flow had nowhere to show that same checkbox so it just wasn't a real stop on the way through.
The new confirmation page carries the same order summary, the same marketing opt-in, and the same consent checkbox as the paid version, minus the card fields, so free customers get asked the same questions paid customers do.
The order is available in the dashboard area the same as paid orders are.
Coupons can now be scoped to specific products
Alongside the free-checkout work, coupons got a real gap closed: previously, any active coupon applied to whatever was sitting in the cart, which meant a 100%-off code minted for one lead magnet could technically be used against anything in the store. Coupons can now be restricted to specific products from the admin, using a searchable dual-list picker rather than a single dropdown. Pick nothing and a coupon stays store-wide, or move specific products across to lock it down.
That validation now runs twice: once when a coupon is first applied to the cart, and again at checkout using the cart's actual contents at that moment, so swapping items after applying a coupon can't smuggle the discount onto something else.
Two smaller bugs the scoping fix surfaced
Testing the new scoping turned up two more issues worth fixing at the same time:
Quantity could drain a limited coupon in one order. A coupon scoped to one product still let someone set quantity to 5 or 50 in a single checkout. For a digital download that quantity doesn't actually get the buyer anything extra, but it did mean the usage counter only ticked up by one per order regardless of quantity - so a coupon meant to cover five people could be exhausted by a single checkout. Product-scoped coupons now cap those products to a quantity of 1 in the cart, both when the coupon is applied and again at checkout. Store-wide coupons are untouched.
Coupons could silently carry over between users on the same browser. A coupon lives in the session, and Django only fully clears session data on login when swapping between two already-logged-in users - not when someone applies a coupon anonymously and then logs in afterward. That meant whoever logged in next on that browser could inherit a coupon they never typed in, with no prompt at all. Session-scoped checkout data means the coupon code, discount, and any order bump is now cleared on every login, closing the door for any coupon, not just 100%-off ones.
What this adds up to
Together, these changes mean free products and free-through-coupon products go through a real checkout, get the same mailing-list opt-in as paid orders, and can't be scoped-hopped, quantity-drained, or accidentally inherited by the next person to log in on a shared browser. If you're running lead magnets or free tiers on Djangify, this is what's now backing them.