OpenAI gaat naar de beurs, en jij betaalt de rekening
Wat is er gebeurd?
OpenAI heeft afgelopen maandag confidentieel een S-1 IPO-aanvraag ingediend, exact zoals Anthropic dat een week eerder deed. Twee AI-giganten die tegelijk naar de beurs gaan betekent één ding: aandeelhouders willen rendement, en dat zet druk op de prijzen van de APIs waar jij en ik op bouwen. Geen paniek, maar wel het moment om je eigen kostenplaatje scherp te krijgen.
Wat betekent dit voor jouw project?
Als jouw SaaS gebruikmaakt van AI-calls (via OpenAI, Anthropic of allebei), dan wil je nu weten hoeveel je per gebruiker per maand uitgeeft aan tokens. Niet als spreadsheet-oefening, maar als levend dashboard in je eigen app. Zo zie je direct wanneer een feature te duur wordt of wanneer een prijswijziging van een aanbieder je marge raakt. Met Claude Code bouw je dat in een paar prompts.
Hoe pak je het aan met Claude Code?
Stap 1: geef Claude Code context over je huidige setup
Open Claude Code in je project en begin met een beschrijving van hoe je nu AI-calls doet. Hoe specifieker, hoe beter het resultaat.
Ik heb een Next.js SaaS-app waarbij ik API-calls maak naar OpenAI's GPT-4o. Die calls zitten in
/lib/ai.ts. Ik wil per API-call bijhouden hoeveel input- en output-tokens er gebruikt worden, en dat opslaan in mijn Supabase-database. Maak een wrapper-functie die dit automatisch doet.
Claude Code schrijft dan iets als:
// lib/ai-tracked.ts
import OpenAI from 'openai';
import { createClient } from '@/lib/supabase';
const openai = new OpenAI();
export async function trackedCompletion(
messages: OpenAI.ChatCompletionMessageParam[],
userId: string,
featureName: string
) {
const response = await openai.chat.completions.create({
model: 'gpt-4o',
messages,
});
const usage = response.usage;
if (usage) {
const supabase = createClient();
await supabase.from('ai_usage_log').insert({
user_id: userId,
feature: featureName,
input_tokens: usage.prompt_tokens,
output_tokens: usage.completion_tokens,
model: 'gpt-4o',
created_at: new Date().toISOString(),
});
}
return response;
}
Stap 2: laat Claude Code de database-tabel aanmaken
Maak een Supabase SQL-migratie aan voor de tabel
ai_usage_logdie past bij de wrapper uit stap 1. Voeg ook een berekende kolom toe voor de kosten in euro's, waarbij input-tokens $2,50 per miljoen kosten en output-tokens $10 per miljoen (GPT-4o tarieven).
Je krijgt dan een migratie-bestand:
-- supabase/migrations/20260609_ai_usage_log.sql
CREATE TABLE ai_usage_log (
id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
user_id UUID REFERENCES auth.users(id) ON DELETE CASCADE,
feature TEXT NOT NULL,
model TEXT NOT NULL,
input_tokens INTEGER NOT NULL DEFAULT 0,
output_tokens INTEGER NOT NULL DEFAULT 0,
created_at TIMESTAMPTZ DEFAULT NOW()
);
-- Berekende view voor kosten per call
CREATE VIEW ai_usage_with_cost AS
SELECT
*,
ROUND(
(input_tokens::NUMERIC / 1000000 * 2.50) +
(output_tokens::NUMERIC / 1000000 * 10.00),
6
) AS cost_usd
FROM ai_usage_log;
-- Index voor snelle queries per gebruiker
CREATE INDEX idx_ai_usage_user_id ON ai_usage_log(user_id, created_at DESC);
Stap 3: bouw een simpel kostenoverzicht in je dashboard
Maak een React component
AiCostWidgetdie de totale AI-kosten van de ingelogde gebruiker voor de huidige maand ophaalt uit deai_usage_with_costview en toont als een klein kaartje. Gebruik de Supabase client die al in het project zit.
// components/AiCostWidget.tsx
'use client';
import { useEffect, useState } from 'react';
import { createClient } from '@/lib/supabase';
export function AiCostWidget({ userId }: { userId: string }) {
const [cost, setCost] = useState<number | null>(null);
const supabase = createClient();
useEffect(() => {
const fetchCost = async () => {
const startOfMonth = new Date();
startOfMonth.setDate(1);
startOfMonth.setHours(0, 0, 0, 0);
const { data } = await supabase
.from('ai_usage_with_cost')
.select('cost_usd')
.eq('user_id', userId)
.gte('created_at', startOfMonth.toISOString());
if (data) {
const total = data.reduce((sum, row) => sum + (row.cost_usd ?? 0), 0);
setCost(total);
}
};
fetchCost();
}, [userId]);
return (
<div className="rounded-xl border p-4">
<p className="text-sm text-muted-foreground">AI-kosten deze maand</p>
<p className="text-2xl font-bold">
{cost === null ? '...' : `$${cost.toFixed(4)}`}
</p>
</div>
);
}
Stap 4: vervang je bestaande AI-calls
Zoek alle plekken in dit project waar ik
openai.chat.completions.createaanroep en vervang die door detrackedCompletionwrapper uit/lib/ai-tracked.ts. Geef elke call een logischefeatureNamemee zoals 'summarize', 'generate-email' of 'chat'.
Claude Code zoekt automatisch door je codebase en doet de vervangingen. Check daarna de diff goed - je wilt niet per ongeluk calls missen.
Wat te checken na afloop
- Stuur een test-request naar een van je AI-features en kijk of er een rij verschijnt in de
ai_usage_logtabel in Supabase Studio. - Ga naar de
ai_usage_with_costview en check of decost_usdkolom een logisch getal toont (een korte call van 500 tokens totaal zou rond de $0,000025 moeten uitkomen). - Voeg de
AiCostWidgettoe aan je dashboard en kijk of die na de test-call een bedrag toont. - Als je meerdere modellen gebruikt: pas de kostberekening aan per model in de view, of voeg een
CASE-statement toe op basis van demodel-kolom.
Dit kost je vanavond een uur. En als de tarieven volgend kwartaal omhooggaan omdat Anthropic of OpenAI hun aandeelhouders moet tevreden stellen, heb jij als eerste door wat dat voor jouw marge betekent.
Bij Eighty leer ik je Claude Code in het Nederlands gebruiken, van installatie tot een werkend SaaS-product. Wekelijks een nieuwe module, persoonlijke begeleiding.
