| name | lokalise-cost-tuning |
| description | Optimize Lokalise costs through plan selection, usage monitoring, and efficiency.
Use when analyzing Lokalise billing, reducing costs,
or implementing usage monitoring and budget alerts.
Trigger with phrases like "lokalise cost", "lokalise billing",
"reduce lokalise costs", "lokalise pricing", "lokalise budget".
|
| allowed-tools | Read, Grep |
| version | 1.0.0 |
| license | MIT |
| author | Jeremy Longshore <jeremy@intentsolutions.io> |
Lokalise Cost Tuning
Overview
Optimize Lokalise costs through smart plan selection, usage monitoring, and efficient workflows.
Prerequisites
- Access to Lokalise billing dashboard
- Understanding of current usage patterns
- Database for usage tracking (optional)
- Alerting system configured (optional)
Lokalise Pricing Overview
Plans (2025)
| Plan | Price | Included | Best For |
|---|
| Free | $0 | 1 project, 500 keys | Personal/testing |
| Essential | $120/mo | Unlimited projects, 2K keys/project | Small teams |
| Pro | $400/mo | Unlimited keys, OTA, Figma | Growing teams |
| Enterprise | Custom | SSO, dedicated support, SLA | Large organizations |
Key Cost Factors
- Number of translation keys
- Number of target languages
- Machine translation usage
- Professional translation orders
- OTA bandwidth (mobile apps)
Instructions
Step 1: Analyze Current Usage
import { LokaliseApi } from "@lokalise/node-api";
async function analyzeUsage(): Promise<UsageReport> {
const client = new LokaliseApi({
apiKey: process.env.LOKALISE_API_TOKEN!,
});
const projects = await client.projects().list();
const usage: UsageReport = {
totalProjects: projects.items.length,
totalKeys: 0,
totalLanguages: 0,
projectDetails: [],
};
for (const project of projects.items) {
const stats = project.statistics;
usage.totalKeys += stats.keys_total;
usage.totalLanguages += stats.languages;
usage.projectDetails.push({
name: project.name,
projectId: project.project_id,
keys: stats.keys_total,
languages: stats.languages,
: stats.,
: stats.,
});
}
usage;
}
{
: ;
: ;
: ;
: <{
: ;
: ;
: ;
: ;
: ;
: ;
}>;
}
Step 2: Identify Cost Optimization Opportunities
function analyzeOptimizations(usage: UsageReport): Recommendation[] {
const recommendations: Recommendation[] = [];
for (const project of usage.projectDetails) {
if (project.keys < 10) {
recommendations.push({
type: "unused_project",
severity: "low",
message: `Project "${project.name}" has only ${project.keys} keys. Consider archiving.`,
potentialSavings: "Reduce clutter, potential plan downgrade",
});
}
if (project.keys > 1000) {
recommendations.push({
type: "key_audit",
severity: "medium",
message: `Project "${project.name}" has ${project.keys} keys. Review for duplicates.`,
potentialSavings: "5-15% key reduction typical",
});
}
if (project.progress < 50 && project.languages > ) {
recommendations.({
: ,
: ,
: ,
: ,
});
}
}
(usage. < && usage. <= ) {
recommendations.({
: ,
: ,
: ,
: ,
});
}
recommendations;
}
Step 3: Implement Usage Monitoring
interface UsageMetrics {
date: Date;
keysCreated: number;
keysDeleted: number;
translationsUpdated: number;
mtCharacters: number;
apiCalls: number;
}
class LokaliseUsageMonitor {
private metrics: UsageMetrics[] = [];
trackApiCall(operation: string, details?: any) {
console.log({
timestamp: new Date().toISOString(),
operation,
details,
});
}
async getMonthlyReport(): Promise<MonthlyReport> {
const client = new LokaliseApi({
apiKey: process.env.LOKALISE_API_TOKEN!,
});
const projects = await client.projects().list();
let totalKeys = 0;
let totalMTCharacters = ;
( project projects.) {
totalKeys += project..;
}
{
: ().().(, ),
totalKeys,
: .(totalKeys),
};
}
(: ): {
(keys <= ) ;
(keys <= ) ;
;
}
}
Step 4: Clean Up Unused Resources
async function cleanupUnusedKeys(projectId: string, dryRun = true) {
const client = new LokaliseApi({
apiKey: process.env.LOKALISE_API_TOKEN!,
});
const archivedKeys = await client.keys().list({
project_id: projectId,
filter_archived: "include",
limit: 500,
});
const toDelete = archivedKeys.items.filter(k => k.is_archived);
console.log(`Found ${toDelete.length} archived keys`);
if (dryRun) {
console.log("DRY RUN - would delete:", toDelete.map(k => k.key_name.web));
return { deleted: 0, archived: toDelete.length };
}
for (const key of toDelete) {
await client.().(key., { : projectId });
}
{ : toDelete. };
}
() {
client = ({
: process..!,
});
languages = client.().({ : projectId });
unused = languages..(
(lang.?. ?? ) < threshold && !lang.
);
.(,
unused.( ));
unused;
}
Output
- Usage analysis complete
- Cost optimization recommendations
- Usage monitoring implemented
- Cleanup scripts for unused resources
Error Handling
| Issue | Cause | Solution |
|---|
| Unexpected charges | Untracked MT usage | Monitor orders API |
| Key limit exceeded | Organic growth | Archive or delete unused |
| Overage fees | Wrong plan | Upgrade before hitting limits |
| Budget exceeded | No monitoring | Set up usage alerts |
Examples
Quick Usage Check
const report = await analyzeUsage();
console.log(`Total Projects: ${report.totalProjects}`);
console.log(`Total Keys: ${report.totalKeys}`);
console.log(`Estimated Plan: ${report.totalKeys < 500 ? 'Free' : report.totalKeys < 2000 ? 'Essential' : 'Pro'}`);
Machine Translation Cost Estimate
function estimateMTCost(
characters: number,
provider: "google" | "deepl" | "amazon" = "google"
): number {
const rates: Record<string, number> = {
google: 0.02,
deepl: 0.025,
amazon: 0.015,
};
return (characters / 1_000_000) * rates[provider];
}
Budget Alert Script
async function checkBudget(budgetKeys: number): Promise<boolean> {
const usage = await analyzeUsage();
if (usage.totalKeys > budgetKeys * 0.9) {
console.warn(`WARNING: Approaching key limit (${usage.totalKeys}/${budgetKeys})`);
await sendSlackAlert({
channel: "#billing",
text: `Lokalise key usage at ${Math.round((usage.totalKeys / budgetKeys) * 100)}%`,
});
return false;
}
return true;
}
Cost Comparison Report
## Lokalise Cost Analysis
### Current Usage
- Projects: 5
- Total Keys: 3,500
- Languages: 8
### Current Plan: Pro ($400/mo)
### Recommendations
1. Archive 2 unused projects (-500 keys)
2. Remove 3 low-progress languages
3. Delete 200 archived keys
4. **Potential: Essential plan at $120/mo**
### Annual Savings: $3,360
Resources
Next Steps
For architecture patterns, see lokalise-reference-architecture.