Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Optimize Gamma usage costs and manage API spending. Use when reducing API costs, implementing usage quotas, or planning for scale with budget constraints. Trigger with phrases like "gamma cost", "gamma billing", "gamma budget", "gamma expensive", "gamma pricing".
.claude/skills/jeremylongshore-gamma-cost-tuning/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-03 | ✗→✓ | ▲ Improved | 50% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 52% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 18% | 0% |
| case-12 | ✗→✓ | ▲ Improved | 35% | 0% |
| case-13 | ✗→✓ | ▲ Improved | 24% | 0% |
Optimize Gamma API usage to minimize credit consumption. Gamma uses a credit-based billing system where costs are driven by image generation model tier and content complexity. API access requires Pro or higher subscription.
gamma-install-auth setup| Tier | Credits per Image | Quality Level | |------|-------------------|---------------| | Standard | 2-15 | Good for internal/draft presentations | | Advanced | 20-33 | Higher quality, more detail | | Premium | 34-75 | Best quality images | | Ultra | 30-125 | Highest fidelity, photorealistic |
Card text generation also costs credits based on the AI model used.
| Feature | Pro | Ultra | Teams | Business | |---------|-----|-------|-------|----------| | Monthly credits | Included | More credits | Team pool | Custom | | API access | Yes | Yes | Yes | Yes | | Max cards | Standard | Up to 75 | Standard | Custom | | Ad-hoc credit purchase | Yes | Yes | Yes | Yes | | Auto-recharge | Yes | Yes | Yes | Yes |
typescript// src/gamma/cost-tracker.ts interface UsageEntry { generationId: string; creditsUsed: number; outputFormat: string; timestamp: Date; } class CreditTracker { private usage: UsageEntry[] = []; record(entry: UsageEntry) { this.usage.push(entry); } getDaily(): { total: number; count: number; avg: number } { const today = new Date().toDateString(); const todayUsage = this.usage.filter( (u) => u.timestamp.toDateString() === today ); const total = todayUsage.reduce((sum, u) => sum + u.creditsUsed, 0); return { total, count: todayUsage.length, avg: todayUsage.length > 0 ? Math.round(total / todayUsage.length) : 0, }; } getMonthly(): { total: number; count: number } { const thisMonth = new Date().getMonth(); const monthUsage = this.usage.filter( (u) => u.timestamp.getMonth() === thisMonth ); return { total: monthUsage.reduce((sum, u) => sum + u.creditsUsed, 0), count: monthUsage.length, }; } } // Track after each generation const tracker = new CreditTracker(); async function generateTracked(gamma: GammaClient, request: GenerateRequest) { const { generationId } = await gamma.generate(request); const result = await pollUntilDone(gamma, generationId); tracker.record({ generationId, creditsUsed: result.creditsUsed ?? 0, outputFormat: request.outputFormat ?? "presentation", timestamp: new Date(), }); return result; }
The biggest cost driver is image generation tier. Reduce costs by:
typescript// EXPENSIVE: default image settings (may use Advanced/Premium tier) await gamma.generate({ content: "Company quarterly review", outputFormat: "presentation", // No imageOptions = AI chooses model tier }); // CHEAPER: explicitly use standard tier when quality isn't critical await gamma.generate({ content: "Company quarterly review", outputFormat: "presentation", imageOptions: { style: "simple flat illustration", // Simpler styles use fewer credits }, }); // CHEAPEST: text-focused, minimal images await gamma.generate({ content: "Company quarterly review", outputFormat: "document", // Documents typically use fewer images textAmount: "detailed", // Focus on text, not visuals });
typescript// WASTEFUL: regenerating entire presentations for minor content changes for (const client of clients) { await gamma.generate({ content: `Proposal for ${client.name}: ${fullProposalText}`, outputFormat: "presentation", }); // Each generation costs full credits } // EFFICIENT: use templates for repeated structures // Create a one-page template gamma in the app // Then generate variations with targeted prompts for (const client of clients) { await gamma.generateFromTemplate({ gammaId: "template_proposal_id", prompt: `Customize for ${client.name}. Focus on ${client.industry}.`, exportAs: "pdf", }); // Template generations can be more cost-effective }
typescript// src/gamma/budget.ts const MONTHLY_BUDGET = 5000; // credits const ALERT_THRESHOLDS = [0.5, 0.75, 0.9, 1.0]; // 50%, 75%, 90%, 100% async function checkBudget(tracker: CreditTracker) { const { total } = tracker.getMonthly(); const percentUsed = total / MONTHLY_BUDGET; for (const threshold of ALERT_THRESHOLDS) { if (percentUsed >= threshold) { await sendAlert( `Gamma budget ${(threshold * 100)}% used: ${total}/${MONTHLY_BUDGET} credits` ); } } // Hard stop at 100% if (percentUsed >= 1.0) { throw new Error(`Monthly Gamma budget exceeded: ${total}/${MONTHLY_BUDGET} credits`); } }
typescript// Cache generation results to avoid paying twice for same content import NodeCache from "node-cache"; const generationCache = new NodeCache({ stdTTL: 86400 }); // 24 hour TTL async function generateCached( gamma: GammaClient, request: GenerateRequest ): Promise<GenerateResult> { // Create cache key from request parameters const key = JSON.stringify({ content: request.content, outputFormat: request.outputFormat, themeId: request.themeId, textMode: request.textMode, }); const cached = generationCache.get<GenerateResult>(key); if (cached) { console.log("Cache hit — skipping generation"); return cached; } const result = await generateAndWait(gamma, request); generationCache.set(key, result); return result; }
| Strategy | Credit Savings | Implementation | |----------|---------------|----------------| | Standard image tier | 50-80% on images | Set imageOptions.style to simpler styles | | Templates over ad-hoc | 20-40% | Use generateFromTemplate for repeated content | | Caching results | 100% on duplicates | Cache by content hash | | Text-focused output | 30-50% | Use document format, textAmount: "detailed" | | Budget caps | Prevents overrun | Track credits, alert at thresholds | | Auto-recharge | Avoids disruption | Enable at gamma.app/settings/billing |
| Issue | Cause | Solution | |-------|-------|----------| | Credits exhausted | Over budget | Purchase ad-hoc credits or enable auto-recharge | | Unexpected high cost | Premium image tier | Specify imageOptions.style explicitly | | Budget alert missed | Tracker not running | Verify tracking on all generation paths |
Proceed to gamma-reference-architecture for architecture patterns.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 21,814 | 18,163 | -17% | 1 | 1 | 0% | 4,623 | 4,777 | +3% | 0 | 0 | — |
case-02 | fail→fail | 21,499 | 14,275 | -34% | 1 | 1 | 0% | 4,036 | 4,706 | +17% | 0 | 0 | — |
case-03 | fail→pass | 13,084 | 13,812 | +6% | 1 | 1 | 0% | 2,320 | 3,491 | +50% | 0 | 0 | — |
case-04 | pass→pass | 8,416 | 3,198 | -62% | 1 | 1 | 0% | 1,434 | 2,424 | +69% | 0 | 0 | — |
case-05 | pass→pass | 14,611 | 8,090 | -45% | 1 | 1 | 0% | 1,651 | 2,441 | +48% | 0 | 0 | — |
case-06 | pass→pass | 10,574 | 9,203 | -13% | 1 | 1 | 0% | 1,741 | 2,635 | +51% | 0 | 0 | — |
case-07 | fail→pass | 9,107 | 1,968 | -78% | 1 | 1 | 0% | 1,451 | 2,209 | +52% | 0 | 0 | — |
case-08 | pass→pass | 16,519 | 12,502 | -24% | 1 | 1 | 0% | 1,826 | 3,202 | +75% | 0 | 0 | — |
case-09 | fail→pass | 15,899 | 8,151 | -49% | 1 | 1 | 0% | 3,017 | 3,557 | +18% | 0 | 0 | — |
case-10 | pass→pass | 14,499 | 10,041 | -31% | 1 | 1 | 0% | 2,656 | 2,864 | +8% | 0 | 0 | — |
case-11 | pass→pass | 11,938 | 6,879 | -42% | 1 | 1 | 0% | 2,047 | 2,246 | +10% | 0 | 0 | — |
case-12 | fail→pass | 11,276 | 8,057 | -29% | 1 | 1 | 0% | 1,781 | 2,409 | +35% | 0 | 0 | — |
case-13 | fail→pass | 16,257 | 2,317 | -86% | 1 | 1 | 0% | 1,881 | 2,324 | +24% | 0 | 0 | — |
case-14 | fail→pass | 18,878 | 8,971 | -52% | 1 | 1 | 0% | 2,364 | 2,627 | +11% | 0 | 0 | — |
case-15 | fail→pass | 16,594 | 13,099 | -21% | 1 | 1 | 0% | 2,076 | 3,333 | +61% | 0 | 0 | — |
case-16 | pass→pass | 17,438 | 10,641 | -39% | 1 | 1 | 0% | 1,988 | 3,867 | +95% | 0 | 0 | — |
case-17 | fail→pass | 8,825 | 3,876 | -56% | 1 | 1 | 0% | 1,444 | 2,512 | +74% | 0 | 0 | — |
case-18 | fail→pass | 15,158 | 5,042 | -67% | 1 | 1 | 0% | 2,244 | 2,995 | +33% | 0 | 0 | — |
case-19 | fail→pass | 5,687 | 7,488 | +32% | 1 | 1 | 0% | 1,008 | 2,491 | +147% | 0 | 0 | — |
case-20 | fail→pass | 7,641 | 4,000 | -48% | 1 | 1 | 0% | 1,576 | 2,787 | +77% | 0 | 0 | — |
case-21 | pass→pass | 6,199 | 6,537 | +5% | 1 | 1 | 0% | 1,118 | 2,188 | +96% | 0 | 0 | — |
case-22 | fail→pass | 15,486 | 10,521 | -32% | 1 | 1 | 0% | 2,465 | 2,872 | +17% | 0 | 0 | — |
case-23 | pass→pass | 19,802 | 14,156 | -29% | 1 | 1 | 0% | 2,588 | 4,080 | +58% | 0 | 0 | — |
case-24 | pass→fail | 20,030 | 12,130 | -39% | 1 | 1 | 0% | 2,897 | 4,447 | +54% | 0 | 0 | — |
case-25 | pass→pass | 18,335 | 12,830 | -30% | 1 | 1 | 0% | 3,204 | 4,915 | +53% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 25 cases were attempted. The headline lift of +44 percentage points is the difference between those two pass rates over the 25 comparable cases. 1 case got worse with the skill loaded, and it is included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.