Run every Gumroad discount code from one campaign desk

By General Input

See every discount code across all your Gumroad products in one table, fix the ones about to run out, and launch new promos an agent plans for you.

Integrations

  • Gumroad
  • Google Sheets

Type

App

Categories

  • Marketing
  • Operations

I sell about a dozen products on Gumroad and I run discounts across all of them, but Gumroad only lets me manage offer codes one product at a time from each product's checkout page, so there is no single place to see what is running. Build me a discount campaign desk: one app where I can see every code across every product, act on them inline, and plan new promos.

The home view is one table. Load every product with the Gumroad List Products operation, then for each product load its codes with List Offer Codes, and use Get Offer Code to fill in the per-code detail the list response does not carry. Group the rows by product so I can scan a product and see all of its codes underneath it. Each code row should show the code itself, the discount (percentage off or a fixed amount off), how many times it has been used, the usage cap, how many uses are left, and the validity window when the code has a start or end date. Gumroad returns money amounts in cents, so divide by 100 and format as currency before displaying anything.

Add a status column that calls out the codes I need to act on. Flag a code as nearly exhausted once it has used most of its cap, defaulting to 80 percent or more and letting me change that threshold, and flag it as dead once the cap is fully used or the validity window has ended. Let me sort and filter the table by status so I can pull up just the codes that need attention, and show counts of nearly exhausted and dead codes at the top of the page.

I want three actions available inline from the table. First, mint a new code on any product with Create Offer Code, using a small form where I set the code text, the discount as either a percentage or a fixed amount off, the usage cap, and an optional validity window. Second, raise or lower the cap on an existing code with Update Offer Code. That operation only adjusts the usage cap, so present it as a cap change rather than a general edit, and make it clear in the interface that the discount amount cannot be changed once the code exists. Third, retire a finished promo with Delete Offer Code. Deleting is permanent in Gumroad, so put a confirmation step in front of it that names both the code and the product.

Put a "Plan a promo" button on every product row that kicks off a background agent scoped to that product. The agent pulls recent sales for the product with List Sales, using the ISO8601 before and after filters to bound a recent window, and works out how the product has actually been selling: volume, revenue, the trend over the window, and what any past discounting looks like. From that it decides what discount depth is justified, creates the code with Create Offer Code, and writes launch copy I can paste straight into an email or a social post. It returns a plan into the app containing its read on the product's sales, the discount it chose and the reasoning behind it, the code it created with its cap and window, and the launch copy.

The plan lands in a review panel inside the app rather than going anywhere else. A newly created code does nothing until I actually share it, so nothing is live until I approve the plan and use the copy. From the review panel let me approve a plan, which marks the campaign as launched, or discard it, which deletes the code the agent created using Delete Offer Code so a rejected plan does not leave a stray code sitting on the product. Keep past plans per product with timestamps so I can look back at what was suggested.

Every code the desk creates, whether I minted it inline or the agent created it, should be appended to a campaign ledger spreadsheet in Google Sheets using the Append Values operation. Each row should carry the launch date, the product name, the code, the discount, the usage cap, whether it came from me or from the agent, and empty columns for the revenue figures that get filled in later. Let me choose the spreadsheet and the tab the ledger writes to.

Add a refresh action on the ledger. It reads the existing rows with Get Values, finds campaigns that launched at least seven days ago and do not have revenue filled in yet, and for each one pulls that product's sales with List Sales, setting the ISO8601 after and before filters to the launch date and seven days after it. Total the revenue for that window, remembering amounts come back in cents, and write the figures back into the matching ledger rows with Update Values. Include both the revenue in the seven days after launch and how many of that code's uses landed in the window, so the ledger ends up showing which discounts actually paid off.

Keep the whole thing tight: the product and code table is the home view, the ledger and the saved promo plans are reachable from it, and every action is available from the row I am already looking at.

Related prompts

Explore more prompts
Call overdue Xero customers with an AI collections agentLocal listing health board for every location you manageLet support send one-off Loops emails without an engineerStop cold emails to anyone with a live deal in PipedriveiMessage campaign console with pre-flight checks and delivery boardLinkedIn Ads budget pacing dashboard for every client accountFront desk appointment confirmation board for the next 3 daysGive your team Looker numbers without buying more seatsBuild audience segments from product usage and push to LoopsTurn the people who engage with your posts into Pipedrive leads