DEV Community

Cover image for Descript bills you on two meters at once. I modeled it in Python to find which plan actually fits.
Tien Nguyen
Tien Nguyen

Posted on

Descript bills you on two meters at once. I modeled it in Python to find which plan actually fits.

Descript is the rare creative tool that earns its hype: you edit video by deleting words in a transcript, and the footage disappears with the text. I have shipped real podcast and talking-head edits through it. But the question that kept tripping me up was not "can it do the edit" — it was "which plan am I supposed to be on," and that turns out to be genuinely hard to answer, because Descript meters you on two independent budgets at once.

I am a builder, so I did what I do with any pricing I do not trust: I modeled it. Here is what fell out, and why the answer is less stable than Descript's pricing table makes it look.

Two meters, not one

In a 2025 overhaul Descript scrapped its old "transcription hours" plans and rebuilt everything on two separate meters you have to track simultaneously:

  • Media Minutes are spent when you upload or record media — transcribed or not, used in the final cut or not.
  • AI Credits are spent per AI action: Studio Sound, filler-word removal, Eye Contact, voice generation, and every Underlord co-editor command.

Two traps live in that design before you write a line of code:

  1. Neither meter rolls over. An unused balance resets on your billing date. You are effectively paying for your heaviest month, every month.
  2. Media Minutes are billed on upload. Import three hours of b-roll, use ten seconds, and you still spent three hours of your allowance. Descript says so directly in the Media library: "each file added uses media minutes."

So picking a tier is a two-dimensional bin-packing problem, not a single-number lookup. That is exactly the kind of thing a tiny model clarifies.

The plans, as data

Here are the four consumer tiers as a dataclass — allowances pulled straight off Descript's live pricing page in June 2026. Two columns deserve a flag before you trust them. The Free plan's 100 credits are one-time, not a monthly refill (a landmine I will come back to). And Creator and Business each advertise a "+bonus" on top of the standing allowance — but with no fine print anywhere on the page saying whether that bonus recurs monthly, applies only to annual billing, or is a one-time signup sweetener. So I model the bonus as a separate, optional ceiling rather than baking it into the headline number:

from dataclasses import dataclass

@dataclass(frozen=True)
class Plan:
    name: str
    price_monthly: float   # USD
    ai_credits: int        # STANDING monthly allowance (Free is one-time)
    media_minutes: int     # STANDING monthly allowance
    bonus_credits: int     # advertised "+N bonus" — recurrence UNDOCUMENTED
    bonus_minutes: int     # advertised "+N bonus hours" -> minutes — same caveat
    topups: bool

    def credits(self, count_bonus: bool) -> int:
        return self.ai_credits + (self.bonus_credits if count_bonus else 0)

    def minutes(self, count_bonus: bool) -> int:
        return self.media_minutes + (self.bonus_minutes if count_bonus else 0)

PLANS = [
    Plan("Free",      0,  100,   60,    0,   0, topups=False),
    Plan("Hobbyist", 24,  400,  600,    0,   0, topups=True),
    Plan("Creator",  35,  800, 1800,  500, 300, topups=True),   # +500 credits / +5 hrs "bonus"
    Plan("Business", 65, 1500, 2400, 1000, 600, topups=True),   # +1000 credits / +10 hrs "bonus"
]
Enter fullscreen mode Exit fullscreen mode

The topups flag matters more than it looks: the only tier with no top-up path is Free — there you just wait for the reset. The paid tiers all let you buy more credits or minutes when you run dry, which is its own trap, because the easiest way to "fix" a too-small plan is to keep buying top-ups until you have quietly out-spent the tier above it.

Describing a month of work

Now model the work the way you actually experience it, not the way the marketing page frames it:

@dataclass
class Workflow:
    episodes_per_month: int
    raw_minutes_per_episode: float    # what you RECORD, not what you keep
    rerecord_factor: float            # 1.2 = you re-upload 20% extra takes
    unused_import_minutes: float      # b-roll you add but never finish
    studio_sound_passes_per_episode: int
    other_ai_actions_per_episode: int     # Underlord, filler removal, eye contact...
    est_credits_per_other_action: int     # YOUR estimate — Descript won't tell you

    def media_minutes(self) -> float:
        recorded = (self.episodes_per_month
                    * self.raw_minutes_per_episode
                    * self.rerecord_factor)
        return recorded + self.unused_import_minutes

    def ai_credits(self) -> int:
        studio = self.studio_sound_passes_per_episode * 10   # the one documented cost
        other = self.other_ai_actions_per_episode * self.est_credits_per_other_action
        return self.episodes_per_month * (studio + other)
Enter fullscreen mode Exit fullscreen mode

See that 10 hardcoded in ai_credits? Studio Sound at 10 credits per use is the only per-action credit cost Descript publishes. Every other AI action — and Underlord, the feature they sell hardest, is the hungriest of them — has no documented price. You discover the cost by watching your balance drop. That single fact is why budgeting Descript feels like guessing, and the model makes the guess explicit instead of hiding it.

Finding the right plan is then: cheapest plan whose both meters cover the month. The count_bonus switch lets me ask the question twice — once trusting only the standing allowance, once believing the advertised bonus — because that ambiguity turns out to be where the money is.

def cheapest_fit(wf, count_bonus):
    need_min, need_cr = wf.media_minutes(), wf.ai_credits()
    for plan in sorted(PLANS, key=lambda p: p.price_monthly):
        if plan.minutes(count_bonus) >= need_min and plan.credits(count_bonus) >= need_cr:
            return plan
    return None   # overflows every plan → top-ups or wait for reset
Enter fullscreen mode Exit fullscreen mode

Running it: the answer moves

Take a concrete creator — a weekly podcast, four 60-minute records a month, 20% re-records. First, leaning on AI only lightly (two Studio Sound passes per episode, nothing else). I print the answer twice: once on standing allowances, once assuming the bonus recurs.

Weekly podcast, Studio Sound only:
  needs 288 media minutes + 80 AI credits / month
  -> standing allowances only : Hobbyist ($24/mo)
  -> if the '+bonus' recurs   : Hobbyist ($24/mo)
Enter fullscreen mode Exit fullscreen mode

Comfortable on Hobbyist, bonus or no bonus. Now the same person starts actually using the features Descript advertises — Underlord rough cuts, filler removal, eye contact — eight AI actions an episode, plus a couple hours of imported b-roll they trim away:

Same creator, leaning on Underlord (est. 25 credits/action):
  needs 408 media minutes + 880 AI credits / month
  -> standing allowances only : Business ($65/mo)
  -> if the '+bonus' recurs   : Creator ($35/mo)
Enter fullscreen mode Exit fullscreen mode

Media minutes barely moved (408, still inside Hobbyist's 600). Credits are what blew up — and look at the split. On the standing 800-credit Creator allowance, 880 overflows and you land on Business at $65. If that "+500 bonus" actually recurs, Creator's real ceiling is 1,300 and the same workflow fits for $35. Whether this costs you $35 or $65 a month turns on a bonus whose recurrence Descript never states. That is not an edge case I engineered; it is the gap between the two numbers the pricing page puts side by side.

Now hold the workflow fixed and sweep the other undocumented number — the per-action credit cost — across both allowance assumptions:

Sensitivity to the undocumented per-action cost (heavy workflow):
  est/action   credits/mo   standing-only   if-bonus-recurs
  10              400       Hobbyist        Hobbyist
  25              880       Business        Creator
  40             1360       Business        Business
Enter fullscreen mode Exit fullscreen mode

Two unpublished numbers, and the middle row swings the bill between three tiers depending on how you guess them. This is not a knock on the editor, which is excellent. It is a warning about the meter. When I dug into where the credits actually go and ran my own projects through every tier, the recurring failure mode was always the same: people priced themselves on the headline allowance, then the AI features they were sold on quietly drained it. I wrote the full hands-on Descript review for the qualitative side — what the editing actually feels like, where Studio Sound earns its keep, and who should skip it — but the pricing is the part you model before you subscribe.

The free-plan landmine the model can't see

One more thing I only caught because I was logged in: on the Free plan, the Plan page calls your allowance "Monthly AI credits: 100," while the Usage page for the same account labels the identical balance "Lifetime AI credits used: 43/100." Those 100 credits are one-time. The product's own UI contradicts itself about whether they refill. If you are evaluating Descript on Free expecting a monthly reset that never arrives, that is a surprise no pricing model catches — you have to read the fine print in two places and notice they disagree.

Takeaways for anyone evaluating metered AI tools

  • Model two-meter pricing before you subscribe. When a tool bills on more than one axis, the binding constraint is rarely the one the marketing leads with. Here it is credits, not minutes.
  • Treat undocumented numbers as ranges, not values — and sweep them. This page has two: the per-action credit cost and whether the "+bonus" recurs. If your tier flips across plausible values of either, you do not have a budget, you have a hope.
  • Read a "+bonus" as marketing until proven recurring. Model the standing allowance; treat any bonus as upside you confirm on your second invoice, not capacity you plan around.
  • Price your heaviest month, not your average. No-rollover meters punish spiky usage.
  • Spend allowances are not refunds. Media-minutes-on-upload means a sloppy import is gone whether or not you use the footage.

The model is ~130 lines of stdlib — fork the Workflow numbers to your own cadence and it will tell you which tier you are really on, under both allowance assumptions. And if you have fought a worse two-meter pricing model than this one, I would genuinely like to read about it in the comments.

Top comments (0)