DEV Community

Cover image for Claude Sonnet 5's Introductory Pricing Expires August 31. Your Cost Model Doesn't Know That Yet.
Assili Salim
Assili Salim

Posted on

Claude Sonnet 5's Introductory Pricing Expires August 31. Your Cost Model Doesn't Know That Yet.

11 days from now, Sonnet 5 goes from $2/$10 to $3/$15 per million tokens. A 50% increase across the board.

If you built session budgets, cost estimates, or routing logic around the introductory rate — and you probably did, because it was the correct price when you set it — your cost model breaks on September 1. Not because of a bug. Because the price you hardcoded was always temporary.


This is a different kind of stale pricing problem

Most stale pricing is drift: you hardcode a rate, the provider quietly reprices, your guard spends months being wrong without anyone noticing.

Introductory pricing is different. The price doesn't drift — it snaps. On a specific date. If your registry doesn't update before that date, it wakes up on September 1 with numbers that were accurate yesterday and wrong today.

Same bug. Different failure mode. Harder to catch because you know you set it correctly.


What actually breaks

Hardcoded model prices — anywhere in your codebase that reads sonnetInputPerM: 2.00. That number is wrong in 11 days.

Session budgets calibrated to intro rates — a $0.10 session budget built around $10/M output covers 10,000 output tokens. At $15/M, that same budget covers 6,667. Sessions that were comfortably within limit start breaching it.

Capacity planning — if your team estimated next quarter's AI spend using Sonnet 5 at $2/M, that number is 50% low for anything running after August 31.

Routing decisions — if your model router chose Sonnet 5 over an alternative because it was cheaper at $2/M, that calculation needs to run again at $3/M. The answer might be different.


The fix: update the registry before August 31

// Before August 31
const MODEL_PRICES: Record<string, { inputPerM: number; outputPerM: number; expiresAt?: Date }> = {
  'claude-sonnet-5': {
    inputPerM: 2.00,
    outputPerM: 10.00,
    expiresAt: new Date('2026-08-31'), // introductory rate
  },
  'claude-opus-4-8': {
    inputPerM: 15.00,
    outputPerM: 75.00,
  },
};

// After August 31 — update this entry
'claude-sonnet-5': {
  inputPerM: 3.00,   // was 2.00 — introductory rate expired Aug 31
  outputPerM: 15.00, // was 10.00
},
Enter fullscreen mode Exit fullscreen mode

The expiresAt field is worth adding even if your framework doesn't consume it automatically. A comment that says "introductory rate" without a date gets ignored in sprint reviews. A field with a concrete date gets noticed.


Add this validation to your startup checks

function validatePricingRegistry(
  prices: Record<string, { inputPerM: number; outputPerM: number; expiresAt?: Date }>,
  asOf: Date = new Date()
): { expired: string[]; expiringSoon: string[] } {
  const sevenDaysFromNow = new Date(asOf.getTime() + 7 * 24 * 60 * 60 * 1000);

  const expired: string[] = [];
  const expiringSoon: string[] = [];

  for (const [model, pricing] of Object.entries(prices)) {
    if (!pricing.expiresAt) continue;

    if (pricing.expiresAt <= asOf) {
      expired.push(model);
    } else if (pricing.expiresAt <= sevenDaysFromNow) {
      expiringSoon.push(model);
    }
  }

  return { expired, expiringSoon };
}

// Run today:
const { expired, expiringSoon } = validatePricingRegistry(MODEL_PRICES);
// expiringSoon: ['claude-sonnet-5'] — expires in 11 days
Enter fullscreen mode Exit fullscreen mode

Surface the result somewhere visible — a startup log, a Slack alert, a CI check. The goal is to make the expiration a planned update, not a billing surprise.


One more to watch: DeepSeek

DeepSeek has announced a price increase with no specific date yet. If you're routing to V4-Flash or V4-Pro, flag it now:

'deepseek-v4-flash': {
  inputPerM: 0.27,
  outputPerM: 1.10,
  expiresAt: undefined, // increase announced, date TBD — watch DeepSeek pricing page
},
Enter fullscreen mode Exit fullscreen mode

Not because you know when. Because flagging it as pending means you won't miss it when it lands.


The broader pattern

August 2026 alone: Luna dropped 80% on July 30, Sonnet 5's introductory rate expires August 31, DeepSeek's increase is pending. Three of the most commonly deployed models in production — all with pricing changes in a single month.

This is the environment your cost model lives in. Model prices are not stable configuration. They're versioned inputs that need validation with the same discipline as anything else that drives business-critical calculations.

@salimassili/ai-costguard keeps this in a centralized registry with unknown-model blocking — so when Sonnet 5's rate changes and your registry hasn't caught up yet, the first call surfaces the mismatch immediately instead of billing silently at the wrong rate for a month.

The introductory rate was always temporary. August 31 just makes the deadline concrete.


Repo: github.com/salimassili62-afk/ai-costguard

Top comments (0)