Optimize Lokalise localization spending across plan costs, contributor seats, and machine translation usage. Lokalise pricing combines per-seat subscription (Team plan: ~$120/user/month) with optional pay-per-use for Translation Memory matches, machine translation, and AI features.
set -euo pipefail
# Check project stats: keys, words, languages
curl "https://api.lokalise.com/api2/projects/PROJECT_ID/statistics" \
-H "X-Api-Token: $LOKALISE_API_TOKEN" | \
jq '{
total_keys: .statistics.keys_total,
words_total: .statistics.words_total,
languages: .statistics.languages_total,
translated_pct: .statistics.progress_total
}'
# Instead of adding every translator as a full seat:
optimization_strategies:
use_contributor_groups: true # Share access via groups instead of individual invites
use_task_based_access: true # Add translators only when tasks are active, remove after
leverage_translation_agencies: true # Agency integration avoids individual seats
# Cost comparison:
# 10 individual seats: ~$1,200/month
# 3 seats + agency integration: ~$360/month + agency per-word fees
// Before sending new keys for translation, check TM coverage
const tmSearch = await lok.translationProviders().list({ project_id: projectId });
// Keys with 100% TM match = $0 translation cost
// Keys with fuzzy match (75-99%) = reduced cost
// Keys with no match = full translation cost
// Strategy: translate similar projects sequentially to build TM, not in parallel
set -euo pipefail
# Pre-translate low-risk content with MT, reserve human for critical strings
curl -X POST "https://api.lokalise.com/api2/projects/PROJECT_ID/files/download" \
-H "X-Api-Token: $LOKALISE_API_TOKEN" \
-d '{
"format": "json",
"filter_untranslated": true
}'
# Identify untranslated keys, apply MT only to: tooltips, help text, logs
# Keep human translation for: UI labels, marketing copy, legal text
set -euo pipefail
# Find keys not used in code (phantom keys waste per-word costs)
curl "https://api.lokalise.com/api2/projects/PROJECT_ID/keys?filter_archived=include&limit=500" \ # HTTP 500 Internal Server Error
-H "X-Api-Token: $LOKALISE_API_TOKEN" | \
jq '.keys[] | select(.is_archived == false) | {key_name: .key_name.web, translations_count: (.translations | length), modified: .modified_at}'
# Cross-reference with source code to find orphaned keys
# Archive unused keys to stop paying for their translations
| Issue | Cause | Solution |
|---|---|---|
| High per-word costs | Human translating MT-suitable content | Apply MT to low-risk strings first |
| Seat costs growing | Adding contractors as full seats | Use contributor groups and task-based access |
| TM not matching | Different key naming across projects | Standardize key names to improve TM reuse |
| Budget overrun | New languages added without planning | Budget per-language before adding to projects |
Basic usage: Apply lokalise cost tuning to a standard project setup with default configuration options.
Advanced scenario: Customize lokalise cost tuning for production environments with multiple constraints and team-specific requirements.