Optimize Supabase costs through tier selection, sampling, and usage monitoring. Use when analyzing Supabase billing, reducing API costs, or implementing usage monitoring and budget alerts. Trigger with phrases like "supabase cost", "supabase billing", "reduce supabase costs", "supabase pricing", "supabase expensive", "supabase budget".
/plugin marketplace add jeremylongshore/claude-code-plugins-plus-skills/plugin install supabase-pack@claude-code-plugins-plusThis skill is limited to using the following tools:
Optimize Supabase costs through smart tier selection, sampling, and usage monitoring.
| Tier | Monthly Cost | Included | Overage |
|---|---|---|---|
| Free | $0 | 500MB database, 1GB storage, 50K MAUs | N/A |
| Pro | $25 | 8GB database, 100GB storage, 100K MAUs | $0.001/request |
| Enterprise | Custom | Unlimited | Volume discounts |
interface UsageEstimate {
requestsPerMonth: number;
tier: string;
estimatedCost: number;
recommendation?: string;
}
function estimateSupabaseCost(requestsPerMonth: number): UsageEstimate {
if (requestsPerMonth <= 1000) {
return { requestsPerMonth, tier: 'Free', estimatedCost: 0 };
}
if (requestsPerMonth <= 100000) {
return { requestsPerMonth, tier: 'Pro', estimatedCost: 25 };
}
const proOverage = (requestsPerMonth - 100000) * 0.001;
const proCost = 25 + proOverage;
return {
requestsPerMonth,
tier: 'Pro (with overage)',
estimatedCost: proCost,
recommendation: proCost > 500
? 'Consider Enterprise tier for volume discounts'
: undefined,
};
}
class SupabaseUsageMonitor {
private requestCount = 0;
private bytesTransferred = 0;
private alertThreshold: number;
constructor(monthlyBudget: number) {
this.alertThreshold = monthlyBudget * 0.8; // 80% warning
}
track(request: { bytes: number }) {
this.requestCount++;
this.bytesTransferred += request.bytes;
if (this.estimatedCost() > this.alertThreshold) {
this.sendAlert('Approaching Supabase budget limit');
}
}
estimatedCost(): number {
return estimateSupabaseCost(this.requestCount).estimatedCost;
}
private sendAlert(message: string) {
// Send to Slack, email, PagerDuty, etc.
}
}
function shouldSample(samplingRate = 0.1): boolean {
return Math.random() < samplingRate;
}
// Use for non-critical telemetry
if (shouldSample(0.1)) { // 10% sample
await supabaseClient.trackEvent(event);
}
// Instead of N individual calls
await Promise.all(ids.map(id => supabaseClient.get(id)));
// Use batch endpoint (1 call)
await supabaseClient.batchGet(ids);
const client = new SupabaseClient({
compression: true, // Enable gzip
});
# Set up billing alerts in Supabase dashboard
# Or use API if available:
# Check Supabase documentation for billing APIs
-- If tracking usage in your database
SELECT
DATE_TRUNC('day', created_at) as date,
COUNT(*) as requests,
SUM(response_bytes) as bytes,
COUNT(*) * 0.001 as estimated_cost
FROM supabase_api_logs
WHERE created_at >= NOW() - INTERVAL '30 days'
GROUP BY 1
ORDER BY 1;
Review Supabase dashboard for usage patterns and costs.
Use the cost estimation function to find the right tier.
Add usage tracking to catch budget overruns early.
Enable batching, caching, and sampling where appropriate.
| Issue | Cause | Solution |
|---|---|---|
| Unexpected charges | Untracked usage | Implement monitoring |
| Overage fees | Wrong tier | Upgrade tier |
| Budget exceeded | No alerts | Set up alerts |
| Inefficient usage | No batching | Enable batch requests |
// Estimate monthly cost for your usage
const estimate = estimateSupabaseCost(yourMonthlyRequests);
console.log(`Tier: ${estimate.tier}, Cost: $${estimate.estimatedCost}`);
if (estimate.recommendation) {
console.log(`💡 ${estimate.recommendation}`);
}
For architecture patterns, see supabase-reference-architecture.