Introduction
Launching email campaigns in multiple languages is expensive work, and it's usually done wrong. Most marketing teams either hire translators, which costs £1,500 to £5,000 per campaign, or they use machine translation alone, which produces inconsistent tone and cultural mismatches that damage brand voice.
The real problem isn't translation; it's that your campaign copy, subject lines, and call-to-action buttons live in scattered places: some in your email template, some in your CMS, some in spreadsheets. Getting all of it translated, reviewed, and deployed across multiple languages without losing context takes weeks and multiple handoffs between writers, translators, designers, and marketers.
What if you could write one email campaign in English, and have it automatically localised into eight languages with brand-consistent tone, cultural adaptations, and proper visual asset translation, all without touching anything manually? This workflow shows you exactly how to do it using four complementary tools and your choice of orchestration platform.
The Automated Workflow
This workflow works like this: you write your campaign email in plain text or markdown, paste it into a shared folder, and within minutes you have fully localised versions ready to deploy. The automation chain handles tone consistency, checks translations against your brand guidelines, translates images and visual elements, and outputs everything in a format your email service provider can ingest.
Architecture Overview
The workflow has four stages:
- Input: You provide source content (English email copy)
- Tone and Voice Check: ChatGPT Writer analyses your copy against brand guidelines and suggests improvements
- Translation with Context: QuillBot translates each section while preserving tone and technical terms
- Visual Localisation: Visual Translate AI handles image text, button labels, and graphic elements
- Output: All localised versions are compiled into structured JSON ready for your email platform
You'll use an orchestration tool (Zapier, n8n, or Make) to connect these steps. I'll show n8n examples here because it gives you the most control over API payloads and error handling, but the logic works the same in Zapier or Make.
Step 1:
Trigger and Input Handling
Set up a webhook that fires when you drop a file into a shared folder or paste content into a Google Sheet. Here's what a typical trigger payload looks like:
{
"campaign_id": "summer_sale_2024",
"source_language": "en",
"target_languages": ["fr", "de", "es", "it", "nl", "pt", "ja"],
"content": {
"subject": "Summer sale: 40% off everything",
"preview_text": "Don't miss out. Shop now.",
"body": "Hi {{first_name}},\n\nWe're clearing stock this summer...",
"cta_button": "Shop now"
},
"brand_tone": "friendly, conversational, never corporate",
"brand_guidelines": "Always use 'you' not 'we'. Avoid exclamation marks in formal sections."
}
In n8n, create a Webhook node that accepts POST requests. Set it to listen for this structure. Your marketing team can trigger this via a simple form, API call, or even a Zapier button on their phone.
Step 2:
Brand Voice Validation with ChatGPT Writer
Before translating, check that your source content actually matches your brand tone. This step catches problems early. Use the ChatGPT Writer API (or call OpenAI's API directly) to analyse your copy:
{
"model": "gpt-4",
"messages": [
{
"role": "system",
"content": "You are a brand voice auditor. Evaluate the given email copy against these brand guidelines: {{brand_guidelines}}. Flag any tone inconsistencies, corporate jargon, or wording that doesn't fit our voice. Respond with JSON: { issues: [], suggestions: [], approved: boolean }"
},
{
"role": "user",
"content": "Check this email copy:\n\n{{content.subject}}\n{{content.body}}\n{{content.cta_button}}"
}
],
"temperature": 0.3
}
Call this via an HTTP Request node in n8n:
POST https://api.openai.com/v1/chat/completions
Authorization: Bearer {{OPENAI_API_KEY}}
Content-Type: application/json
If the response shows major issues (approved = false), pause the workflow and notify the campaign manager. If approved, continue.
Step 3:
Translation with QuillBot API
QuillBot's API is excellent for maintaining tone across translations, not just mechanical word swaps. You'll make separate API calls for each target language. Here's the pattern:
POST https://api.quillbot.com/translate
Authorization: Bearer {{QUILLBOT_API_KEY}}
Content-Type: application/json
{
"text": "Summer sale: 40% off everything",
"source_language": "en",
"target_language": "fr",
"formality": "friendly",
"context": "Email subject line for retail campaign",
"preserve_formatting": true
}
In n8n, use a Loop node to iterate through your target_languages array. For each language, create an HTTP Request node that sends the full email body, subject, preview text, and CTA button through QuillBot separately. This gives you better control over preserving formatting in each section.
Example loop configuration in n8n:
{
"node": "Loop Over Items",
"settings": {
"items": "{{$json.target_languages}}",
"currentItem": "current_language"
}
}
Then inside the loop, nest an HTTP Request node:
{
"node": "HTTP Request",
"url": "https://api.quillbot.com/translate",
"method": "POST",
"headers": {
"Authorization": "Bearer {{env.QUILLBOT_API_KEY}}"
},
"body": {
"text": "{{$json.content.subject}}",
"source_language": "en",
"target_language": "{{$nodeData['Loop Over Items'].current_language}}",
"formality": "friendly",
"context": "Email subject line"
}
}
Store each translated result in an object keyed by language:
{
"translations": {
"fr": {
"subject": "Soldes d'été: 40% de réduction sur tout",
"preview_text": "Ne manquez pas. Faites vos achats maintenant.",
"body": "...",
"cta_button": "Faites vos achats"
},
"de": { ... },
...
}
}
Step 4:
Visual Asset Localisation with Visual Translate AI
Emails often contain images with text overlays, buttons with labels, or graphics with language-specific content. Visual Translate AI handles this without requiring you to re-create assets manually.
POST https://api.visualtranslate.ai/localize
Authorization: Bearer {{VISUAL_TRANSLATE_API_KEY}}
Content-Type: application/json
{
"image_url": "https://cdn.example.com/summer_sale_banner.jpg",
"target_language": "fr",
"preserve_brand_elements": true,
"text_regions": [
{
"id": "banner_text",
"original_text": "Summer sale",
"translated_text": "Soldes d'été"
},
{
"id": "button_label",
"original_text": "Shop now",
"translated_text": "Faites vos achats"
}
]
}
Add another Loop node (nested inside your language loop) for each image asset. Store the localised image URLs in your output object:
{
"visual_assets": {
"fr": {
"banner": "https://cdn.example.com/summer_sale_banner_fr.jpg",
"button": "https://cdn.example.com/cta_button_fr.jpg"
},
"de": { ... },
...
}
}
Step 5:
Compile and Output
Once all translations and visual assets are ready, create a final output object in a standard format. Most email platforms (Mailchimp, HubSpot, Klaviyo) accept JSON or can ingest data via their APIs. Structure it like this:
{
"campaign_id": "summer_sale_2024",
"created_at": "2024-01-15T14:32:00Z",
"status": "ready_to_deploy",
"localised_versions": {
"en": {
"subject": "Summer sale: 40% off everything",
"preview_text": "Don't miss out. Shop now.",
"body_html": "...",
"cta_url": "https://example.com/shop",
"images": {
"banner": "https://cdn.example.com/summer_sale_banner.jpg"
}
},
"fr": {
"subject": "Soldes d'été: 40% de réduction sur tout",
"preview_text": "Ne manquez pas. Faites vos achats maintenant.",
"body_html": "...",
"cta_url": "https://example.com/shop?lang=fr",
"images": {
"banner": "https://cdn.example.com/summer_sale_banner_fr.jpg"
}
},
"de": { ... },
...
}
}
Write this to a file in Google Drive, upload to S3, or send directly to your email platform's API. In n8n, use a Google Drive node or an S3 node to store the output. In Zapier, you can write to Google Sheets or trigger a Zapier action in your email tool.
Error Handling and Rate Limiting
Real workflows fail. Build in checkpoints:
- API Rate Limits: QuillBot and Visual Translate AI have rate limits. Add delays between requests using n8n's Wait node:
{
"node": "Wait",
"settings": {
"amount": 1,
"unit": "seconds"
}
}
- Failed Translations: If a language fails to translate, log it and send an alert. Use a Conditional node to check response status:
{
"node": "Conditional",
"conditions": [
{
"condition": "===",
"value1": "{{$nodeData['HTTP Request'].status}}",
"value2": 200
}
]
}
- Empty or Missing Fields: Validate that critical fields exist before processing:
if (!content.subject || !content.body) {
throw new Error("Missing required fields: subject or body");
}
Cost Optimisation
This workflow gets expensive if you're translating thousands of emails. Consider:
- Batch Processing: Translate 5-10 emails at once rather than one at a time.
- Cache Results: If you're running campaigns regularly, store translations from previous campaigns. Reuse them if the content is identical.
- Sample-First Approach: Translate only the email subject and preview text first. Only translate full body copy if the subject tests well.
The Manual Alternative
If you want human review at each stage, stop the automation at step 2. After ChatGPT Writer approves tone, export the copy. Have your translation team use QuillBot as a starting point, then manually refine each language version. Upload refined translations back into your n8n workflow at step 4, skipping the automated translation entirely.
This takes longer, but it's appropriate for high-stakes campaigns where brand voice matters more than speed. Many teams run this hybrid approach: automate low-stakes promotional emails, but manually review quarterly newsletters or product announcements.
Pro Tips
1. Test a Single Language First
Don't launch all eight languages at once. Run the workflow for French only, review the output, then scale. Catching a tone inconsistency in one language is easier than fixing it across seven.
2. Use Terminology Glossaries
Add a "brand glossary" input to your workflow. Pass it to QuillBot and ChatGPT Writer so they never mistranslate brand terms. For example, if your company says "Gift Card" not "Voucher", your glossary ensures consistency across all languages.
3. Monitor Translation Quality with A/B Tests
After your first automated campaign deploys, A/B test the automated translations against manually translated versions if you can. This gives you actual performance data on whether automated localisation affects open rates or click-through rates.
4. Handle Time Zones and Currency
Email campaigns usually mention dates, prices, or promotions with deadlines. Build currency conversion and timezone adjustment into your workflow. If your campaign mentions "Sale ends Sunday midnight", that needs to reflect the recipient's actual timezone, not your office timezone.
5. Store Translation Logs
Every successful translation should be logged in a spreadsheet or database. Next time you run a campaign, check if you've already translated similar phrases. This reduces API calls and keeps tone consistent across campaigns.
Cost Breakdown
| Tool | Plan Needed | Monthly Cost | Notes |
|---|---|---|---|
| ChatGPT Writer / OpenAI API | Pay-as-you-go | £5-£15 | Only charged per API call; minimal for tone checks |
| QuillBot API | Professional | £180 | Unlimited API calls; cheaper than manual translation |
| Visual Translate AI | Business | £99-£199 | Depends on image volume; pay per localised image |
| n8n (self-hosted) | Free | £0 | Or £20-£40/month for n8n Cloud |
| Zapier | Professional | £25-£100 | Depends on task volume; alternative to n8n |
| Make (Integromat) | Core | £9-£29 | Cheapest option; fewer features than n8n |
For a typical mid-market company running four campaigns per month across seven languages, expect total monthly costs of £300-£450. Compare this to hiring a freelance translator at £0.10-£0.20 per word, and this workflow breaks even after your first campaign.