Build with AI

I built a printable product with Python — and learned what Gumroad actually takes

The Vibe Gate·August 20, 2026·9 min read

The printables market is one of those corners of the internet that developers walk past without looking. Planner pages. Habit trackers. Meal plans. Grocery lists. People buy them by the thousand on Etsy and Gumroad, print them at home, and fill them in with a pen. It is about as unglamorous as digital products get.

It is also, if you can write code, a strange kind of arbitrage. The people who make these things almost universally make them by hand, in Canva, one page at a time. And a planner page is a rectangle with lines, boxes, and a heading — which is to say, it is a function call. So I wrote the function, ran it 24 times, and put the output up for sale.

This is the build log: what I generated, the print specs that actually matter, how the packaging worked, and the part I was most wrong about — which was not the code at all.

Disclosure: the planner pack linked in this post is my own product — I make money if you buy it. That's not why it's here; it's here because it's the thing this build log is about, and it would be strange to describe a product for 1,800 words and then hide it. The technique is the point, and you can steal all of it for free.

Why code instead of Canva

The honest answer is that I already had the raw material. I had a folder of 32 old low-content PDF templates from a previous project, sitting at a non-standard page size, black and white, unloved. Redrawing 24 of those by hand in a design tool is a weekend of clicking. Regenerating them from a script is an afternoon — and then a second version, in a second paper size, in a second color palette, is free. That last part is the whole argument.

Design tools optimize for the first artifact. Code optimizes for the second through the two-hundredth. The moment your product is a family of similar things rather than one thing, the economics flip hard toward the script.

A design tool makes one page well. A script makes the hundredth page for the same price as the first. Printables are a hundred-page problem wearing a one-page costume.

The stack was about as boring as it gets, deliberately: Python with PIL for drawing, img2pdf for the PDF wrapper, and a single generator script holding one function per template. No design app in the loop at all. Each template is a function that draws a gradient header bar, a script-face title, some ruled rows with alternating tint, a few checkboxes, and a decorative motif. Change the palette constant, rerun, get 24 new pages.

The print specs that actually matter

Here is where a developer's instincts quietly fail, because "make an image" and "make a printable" are different jobs and nothing warns you.

300 DPI is not optional. A screen-resolution export looks perfect on your monitor and prints like a fax. For US Letter at 8.5 × 11 inches that means a 2550 × 3300 pixel canvas. For A4 it's 2480 × 3508. Those two numbers are the entire brief; get them wrong and every other decision is wasted.

Draw big, then shrink. PIL's shape drawing has no anti-aliasing worth the name — draw a rounded box directly at final size and the edges come out stair-stepped. The fix is supersampling: render the whole page at 2× and downscale with a good resampling filter at the end. Every curve and diagonal comes out clean, and the cost is a few seconds of CPU per page. This one trick is the difference between "looks homemade" and "looks bought."

Two paper sizes, not one. The US prints on Letter; most of the rest of the world prints on A4. Shipping only one halves your market for no reason. But — and this is the part I got wrong first — you do not redraw for A4. You fit the existing render into the A4 canvas by width and let the extra height fall as white margin. The layout stays identical, home printers handle it fine, and you did not maintain two designs.

PDF, and also PNG. The PDF is what people print. The PNG is what you use for listing images, previews, and every social post you'll make about it later. Generating both from the same render costs one extra line and saves you from screenshotting PDFs at midnight.

Packaging: the boring half that decides whether you ship

Twenty-four pages × two sizes × two formats is 96 files. Nobody wants to download 96 files, and no marketplace wants to host them individually — so the deliverable is two ZIPs, one per paper size. Mine came out at 3.9 MB for Letter and 4.8 MB for A4, which matters more than it sounds: Etsy caps uploads at 20 MB per file and five files per listing, so staying small keeps every platform's door open even if you don't walk through it today.

The rest of the package is the unglamorous list nobody blogs about: a cover image, a "what's included" grid showing all 24 pages in a 4×6 layout, a license PDF stating what buyers may and may not do with the files, and the listing copy itself. I generated all of those from the same script too — the grid is just the thumbnails composited, and the cover is one more page function.

Then I hit the one thing a script could not do for me, and it is embarrassingly small: Gumroad rejects a non-square thumbnail. The vertical cover I had lovingly generated was fine as the product image and refused as the thumbnail. Solution: crop a square version. Two minutes, but only after several minutes of assuming the upload was broken.

What the platform actually takes

Now the numbers I actually wanted before I started, and had to piece together after. As of 2026, Gumroad has no monthly fee — you pay only when you sell — but the rate depends entirely on how the buyer found you:

Sale typeGumroad feePlus payment processing
Direct (your link, your site, your social)10% + $0.50≈2.9% + $0.30 via Stripe
Discover (Gumroad's own marketplace)30% flat≈2.9% + $0.30 via Stripe
Monthly subscription$0

Read that table as a strategy, not a price list. The 20-point gap between direct and Discover is Gumroad charging you for the traffic it sent. If you have any audience of your own — a blog, a Pinterest board, a TikTok, a mailing list — you should be sending buyers straight to your product link and paying 10%. If you have no audience, Discover's 30% is a customer acquisition cost, and a fairly honest one.

Which brings me to the thing I was most wrong about.

The mistake: I thought shipping was the finish line

I priced the pack at $12 — deliberately under the $19–24 that market research suggested for a bundle this size, because a launch price on an unproven product buys you data faster than margin does. I wrote the listing, uploaded the ZIPs, hit publish, and felt the very specific satisfaction of a thing being done.

It was not done. It was invisible.

Here is the detail that reframes the entire project: a new Gumroad product does not appear in Discover until it has made its first sale and cleared review. So the marketplace half of the platform — the half that finds buyers for you — is locked behind the exact thing you needed it for. Your first customer cannot come from Gumroad. Your first customer has to come from you.

Which means the weekend of code bought me a product, and precisely zero distribution. The actual work — the Pinterest pins, the flip-through video, the posts that put the link in front of someone who wants a habit tracker — is the second project, and it is larger than the first. I had built the easy half with the skill I already had and quietly assumed the hard half would take care of itself.

Writing the generator was the afternoon. Earning the first sale is the quarter. If you're a developer selling something, budget accordingly — you are strong exactly where the work is cheap.

Steal the approach

If you want to try this, the shape of it is small enough to hold in your head:

  1. Find a product category that's secretly a loop. Anything sold as "a pack of N" where the N items share a layout: planner pages, worksheets, checklists, label sets, coloring outlines.
  2. Write one function per variant, sharing a palette and a header. Constants at the top, so a new colorway is a one-line change.
  3. Render at 2× and downscale. Non-negotiable if you want it to look bought rather than made.
  4. Export both PDF and PNG, at 2550×3300 for Letter and 2480×3508 for A4.
  5. Generate the listing assets from the same script — cover, grid, license. They're just more pages.
  6. Then stop and plan distribution, before you congratulate yourself. That's the project.

The pack that came out of this is Aurora Planner — 24 colored templates, Letter and A4, $12 at the time of writing. Buy it if you want the pages; ignore it and build your own if what you wanted was the method. Both are honest outcomes of reading this.

Sources

Fees and platform behavior checked August 20, 2026:

Print specs, file sizes, and the thumbnail rejection are from my own build — measured, not estimated.

Get the next build log, first.

One email when a new build log or review ships. No noise, ever.