Wavo credits and limits

Last updated: May 19, 2026

Wavo credits and limits

Wavo usage is metered in credits: 1 credit = $0.001. Each message charged at input_cost + output_cost per 1K tokens (per model in chat-models.ts) with MARKUP 1.1× applied. Owner / admin set monthly cap via PUT /api/v1/chat/credits/cap. Top up via Stripe (POST checkout → purchase → confirm 3DS). View at /settings/team/billing.

Who is this for

Anyone wondering "how much does Wavo cost?" or "why am I out of credits?". Admins managing team usage caps.

The pricing model

Per-message cost

Each Wavo message charges based on:

  • Input tokens × input_cost_per_1k (model-specific)

  • Output tokens × output_cost_per_1k (model-specific)

  • MARKUP: 1.1× (10% on top of base provider cost)

Formula:

cost_credits = (input_tokens × input_cost + output_tokens × output_cost) × 1.1

Stored in chat_message.credits_used per message.

Model costs (verified chat-models.ts)

Approximate cost per 1K tokens in credits (input / output):

Provider

Model

Input

Output

Anthropic

claude-opus-4-6

5

25

Anthropic

claude-sonnet-4-5-20250929 (DEFAULT)

3

15

Anthropic

claude-haiku-4-5-20251001

1

5

Google

gemini-2.5-pro

1.25

10

Google

gemini-2.5-flash

0.3

2.5

DeepSeek

deepseek-chat

0.27

1.1

DeepSeek

deepseek-reasoner (no tools)

0.55

2.19

Moonshot

kimi-k2

0.6

2.5

OpenAI

gpt-4.1

2

8

OpenAI

gpt-4.1-mini

0.4

1.6

These are credit values per 1K tokens (1 credit = $0.001). MARKUP 1.1× already factored.

Why some models cost more

  • Premium reasoning (Opus, GPT-4.1, Gemini Pro): better for complex analysis + multi-tool chains

  • Balanced (Sonnet — DEFAULT, GPT-4.1 mini): everyday use

  • Fast + cheap (Haiku, Flash, kimi-k2, deepseek-chat): simple questions, high volume

Pick model per task. For most daily mediabuyer questions: Sonnet (default) is the right balance.

The credit_balance table

Each team has one credit_balance row:

Field

What

owner_id (unique)

team owner user_session_id

balance

current credits

total_purchased

lifetime purchased

total_used

lifetime used

monthly_cap

cap for current period (nullable)

monthly_used

used in current period

cap_reset_at

when monthly_used resets

Same model as Creative Hub credits (ch-112) but separate ledger entries for chat messages.

View balance + history

/settings/team/billing shows:

  • Current balance (in credits + USD equivalent)

  • Monthly usage vs cap

  • Recent chat transactions (per-message cost, model, timestamp)

  • Top up button (opens Stripe)

GET /api/v1/chat/credits returns balance. GET /api/v1/chat/credits/history returns paginated transactions.

Top up via Stripe

For Stripe-enabled workspaces:

  1. /settings/team/billingTop up

  2. Pick amount or custom value

  3. POST /api/v1/chat/credits/checkout → Stripe checkout URL

  4. Complete payment (3DS confirm if required: POST /confirm)

  5. Webhook → credit_transaction credit entry → credit_balance.balance increments

Visible at /settings/team/billing after webhook completes (usually < 1 min).

Monthly cap (admin)

Owner / admin can set a cap to limit per-period usage:

PUT /api/v1/chat/credits/cap body:

  • monthly_cap_credits (integer, in credits)

  • cap_reset_at (typically first of month)

When monthly_used >= monthly_cap: chat messages return 402 with reason monthly_cap_reached.

Reset: at cap_reset_at timestamp, monthly_used resets to 0.

Per-user cap?

Currently: cap is per-team (owner-level), not per-individual-user. All team members draw from the same pool.

For per-user discipline: monitor usage in chat_message aggregations, or use Wevion roles to restrict who can use Wavo.

Cost-saving tips

Use cheaper models for iteration

  • Iterate prompts with Haiku / Flash / GPT-4.1 mini (1-5× cheaper)

  • Switch to Opus / GPT-4.1 / Gemini Pro for final / important questions

Per-session model override in chat UI; per-user preference at /settings → AI preferences.

Use project instructions

Setting context once via project instructions avoids re-typing context per session. Less input tokens = less cost.

Be specific in prompts

Vague prompt → Wavo follow-ups → multiple turns. Specific prompt → single turn, lower total cost.

Avoid unnecessary tool calls

If you already know the data, don't make Wavo re-query. Reference previous answer.

Memory facts persist context

Saving "ROAS target = 3 for ClientA" as a project fact means you don't restate it each session.

Limit output length

"In one sentence" or "Just the number" — reduces output tokens.

What charges, what doesn't

Action

Charges?

User message (input tokens)

Charged

Assistant message (output tokens)

Charged

Tool call (input + output to model)

Charged (Wavo sends tool result back)

Voice transcription (Whisper)

Charged (separate, via Whisper pricing)

File upload

Charged (file content sent to model as part of prompt)

Creating chat_session / project

Free

Searching message history

Free

Viewing approval card

Free

Approving an action (executes downstream)

The action itself doesn't charge Wavo credits, but Creative Hub / Rules / etc. may have their own costs

Failed messages

If a model call fails (provider outage, network):

  • chat_message.status = failed

  • credits_used = 0 (no charge for failed completions)

  • Wavo says "I couldn't complete that — please try again"

Partial outputs may or may not charge depending on what reached the user (typical: charge for tokens streamed).

Compliance + audit

credit_transaction is append-only:

  • Every charge: type + amount (negative) + chat_message_id reference

  • Every top-up: type + amount (positive) + stripe_payment_intent_id

  • Sort by date for monthly reports

For audit: export from /settings/team/billing → CSV.

Common surprises

  • "Used 1000 credits in a day": long sessions with many tool calls + Opus model add up; check usage breakdown

  • "Monthly cap hit early in month": usage spiked (large project audit); raise cap or wait reset

  • "Credit balance after top-up": Stripe webhook can take 1-2 min; refresh page

  • "Failed messages charged me": typically no charge; if charged, check credits_used on the message + contact support if anomalous

Common issues

  • 402 monthly_cap_reached: cap hit; admin raises cap or wait reset

  • Out of balance: top up via Stripe

  • Top up failed: Stripe 3DS required → use POST /confirm flow

  • Different cost vs expected: model + length + tool calls all affect cost; review per-message breakdown in history

Related