🔓 Unlock all 10,000+ workflows & prompts free Join Newsletter →
✅ Full access unlocked — explore all 10,000 AI workflow and prompt templates Browse Templates →
Home n8n Workflow
January 22, 2026

GitHub + Google Sheets: catch missing iOS strings

Lisa Granqvist Partner Workflow Automation Expert

You merge a PR, everything looks fine, and then the build breaks because one locale is missing a single iOS .strings key. Now you’re digging through files, trying to figure out which screen introduced it, and someone pings you asking, “Can translators get a list?”

This kind of mess hits iOS engineers first, but localization managers feel it too, and agency teams shipping white-label apps run into it constantly. With this GitHub Sheets automation, you get a running “missing keys” report plus an optional PR that inserts placeholders so your app still compiles.

Below is what the workflow does, what it saves you, and how you can adapt it for multiple languages or stricter rules.

How This Automation Works

The full n8n workflow, from trigger to final output:

n8n Workflow Template: GitHub + Google Sheets: catch missing iOS strings

The Problem: Missing .strings keys show up too late

Localization gaps rarely fail loudly at the right time. One dev adds a new button label in Base.lproj (or en.lproj), the PR gets merged, and only later does someone notice that fr.lproj (or any other locale) is missing the key. Then you get the worst combo: context switching plus guesswork. You’re comparing files by hand, trying not to miss a duplicate key or a weird formatting edge case, and translators still don’t have a single source of truth. Meanwhile, release pressure doesn’t pause.

The friction compounds.

  • Missing keys get discovered during QA or right before a build, when fixing them is the most disruptive.
  • Manual diffing across Base.lproj, en.lproj, and each locale file is slow, and it’s easy to overlook one key.
  • Translators end up working from screenshots, Slack messages, or stale spreadsheets instead of one current list.
  • Builds can fail (or strings ship blank), which means releases slip for a problem that should be routine.

The Solution: GitHub scanning + a live Google Sheet (plus optional PR)

This workflow listens to GitHub activity (pushes or pull requests) and automatically checks your iOS localization files for missing .strings keys. It scans your repo for source files in Base.lproj or en.lproj, then finds the matching target-language files under *.lproj. After that, it compares keys and builds a clean “what’s missing” list per locale. Those missing entries get appended into a Google Sheet tab (for example, a fr tab), which becomes a shared queue for translation work. If you want, it can also open a GitHub PR that inserts placeholder values like __TODO_TRANSLATE__, so the project stays buildable while translations catch up.

The workflow starts with a GitHub webhook and pulls the repo tree via HTTP requests. It fetches the relevant .strings files, identifies missing keys, and writes a simple report into Google Sheets. If ENABLE_PR is turned on (and you’re not in DRY_RUN), it also prepares the changes needed for a placeholder PR.

What You Get: Automation vs. Results

Example: What This Looks Like

Say your app supports 6 locales and you add 12 new strings for a new screen. Manually, a quick “did we miss anything?” check usually means opening at least 6 files, searching for the new keys, and double-checking formatting, which is easily 10 minutes per locale (about an hour), plus the inevitable follow-up message to translators. With this workflow, you merge as usual and the webhook kicks it off; it scans, logs missing keys to Sheets, and (if enabled) prepares a placeholder PR. Your “time spent” becomes a couple minutes to glance at the sheet, not an hour of diffing.

What You’ll Need

  • n8n instance (try n8n Cloud free)
  • Self-hosting option if you prefer (Hostinger works well)
  • GitHub to trigger runs and open PRs.
  • Google Sheets to store the missing-key report.
  • GitHub token (create it in GitHub developer settings).

Skill level: Intermediate. You’ll copy config values, connect credentials, and adjust file globs to match your repo.

Don’t want to set this up yourself? Talk to an automation expert (free 15-minute consultation).

How It Works

A GitHub webhook fires on push or pull request. You point GitHub to your n8n webhook URL and choose the events you care about, so the scan happens automatically when code changes.

The workflow maps your repo and finds localization files. Using your configured glob patterns (like **/Base.lproj/*.strings and **/*.lproj/*.strings), it pulls the repo tree and builds a list of candidate files to compare.

Keys are compared and missing entries are extracted. It fetches the source .strings content, reads keys, then detects what doesn’t exist in each target locale. If you have ignore prefixes configured, those get skipped so internal/debug strings don’t clutter the report.

Results go to Google Sheets (and optionally back to GitHub). Missing keys are appended into a locale-specific sheet tab, which becomes the translator worklist. If PR creation is enabled, the workflow also prepares placeholder values and opens a GitHub PR on a branch like chore/l10n-gap-YYYYMMDD.

You can easily modify the locale list and glob patterns to scan only certain modules, or to loop through 5+ languages in one run. See the full implementation guide below for customization options.

Step-by-Step Implementation Guide

Step 1: Configure the Webhook Trigger

Set up the inbound endpoint that starts the workflow when your system posts a request.

  1. Add and open Inbound Webhook Trigger.
  2. Set HTTP Method to POST.
  3. Set Path to new-pathss.
  4. Copy the production URL from the node after saving to use in your webhook sender.

Step 2: Connect GitHub and Define Repository Parameters

Configure repo parameters and connect GitHub to retrieve the file tree and source files.

  1. Open Parameter Setup and set values: GITHUB_OWNER to github_user_name, GITHUB_REPO to n8n-iOS-Github-repo, BASE_BRANCH to main, SOURCE_LANG to en, TARGET_LANG to fr, and PLACEHOLDER_VALUE to __TODO_TRANSLATE__.
  2. Open Retrieve Repo Tree and confirm the URL expression is set to ={{"https://api.github.com/repos/" + $json.GITHUB_OWNER + "/" + $json.GITHUB_REPO + "/git/trees/" + $json.BASE_BRANCH + "?recursive=1"}}.
  3. Credential Required: Connect your githubApi credentials in Retrieve Repo Tree.
  4. Open Fetch Source File and verify the URL is {{"https://api.github.com/repos/github-user-name/n8n-iOS-Github-repo/contents/" + $json.source.path + "?ref=main"}}.
  5. Credential Required: Connect your githubApi credentials in Fetch Source File.

Step 3: Set Up File Discovery and URL Construction

Parse the repo tree, pick the localization files, and build URLs for retrieval.

  1. Open Analyze File Tree and keep the provided JavaScript Code intact to extract .strings files and map source/target pairs using TARGET_LANG from Parameter Setup.
  2. Open Adjust Fields and confirm the assignments include en.lproj set to https://api.github.com/repos/github-user-name/n8n-iOS-Github-repo/contents/en.lproj/Localizable.strings and fr.lproj set to https://api.github.com/repos/github-user-name/n8n-iOS-Github-repo/contents/fr.lproj/Localizable.strings.
  3. Open Build URL List and verify the code returns the two URLs with lang and url values.
  4. Open Remote API Call and set URL to ={{ $json["url"] }} so each generated URL is fetched.

Remote API Call outputs to both Combine Streams and Combine Streams in parallel, then the merged output flows to Identify Missing Keys.

Step 4: Detect Missing Keys and Append to Google Sheets

Merge source and target localization content, then write missing keys into a Google Sheet for translation tracking.

  1. Open Combine Streams and ensure Mode is combine with Combine By set to combineByPosition.
  2. Open Identify Missing Keys and keep the JavaScript Code intact to compare source/target keys and output missing entries with __TODO_TRANSLATE__.
  3. Open Append to Sheet and set Operation to append.
  4. Set Document to the Google Sheet ID [YOUR_ID] and Sheet Name to localize.
  5. Confirm the column mappings use expressions like ={{ $json["Key"] }}, ={{ $json["File"] }}, ={{ $json["Source Path"] }}, ={{ $json["Target Path"] }}, ={{ $json["Source Value"] }}, and ={{ $json["Placeholder"] }}.
  6. Credential Required: Connect your googleSheetsOAuth2Api credentials in Append to Sheet.

⚠️ Common Pitfall: If the Google Sheet doesn’t have matching column headers, the append will fail or write empty values. Ensure the headers exactly match the field names used in Append to Sheet.

Step 5: Test and Activate Your Workflow

Validate the execution end-to-end and enable the workflow for production.

  1. Click Execute Workflow and send a test POST request to the Inbound Webhook Trigger URL.
  2. Confirm that Retrieve Repo Tree and Fetch Source File return GitHub data and that Identify Missing Keys outputs missing keys.
  3. Check your Google Sheet to verify new rows appended by Append to Sheet.
  4. Toggle the workflow Active to enable continuous webhook processing.
🔒

Unlock Full Step-by-Step Guide

Get the complete implementation guide + downloadable template

Common Gotchas

  • GitHub credentials can expire or need specific permissions. If things break, check your token scopes (repo access) and the n8n credential connection test first.
  • If you’re using Wait nodes or external rendering, processing times vary. Bump up the wait duration if downstream nodes fail on empty responses.
  • Google Sheets updates fail silently when SHEET_ID is wrong or the sheet isn’t shared with the connected Google account. Check the spreadsheet sharing settings and confirm the tab names match your locale codes.

Frequently Asked Questions

How long does it take to set up this GitHub Sheets automation?

About 30 minutes once your GitHub token and Google access are ready.

Do I need coding skills to automate missing iOS strings?

No. You’ll mostly paste configuration values and connect accounts in n8n.

Is n8n free to use for this GitHub Sheets automation workflow?

Yes. n8n has a free self-hosted option and a free trial on n8n Cloud. Cloud plans start at $20/month for higher volume. You’ll also need to factor in Google Sheets usage (usually free) and whatever hosting costs you choose if you self-host.

Where can I host n8n to run this automation?

Two options: n8n Cloud (managed, easiest setup) or self-hosting on a VPS. For self-hosting, Hostinger VPS is affordable and handles n8n well. Self-hosting gives you unlimited executions but requires basic server management.

Can I customize this GitHub Sheets automation workflow for multiple locales at once?

Yes. You can expand your locale list (for example via a TARGET_LANGS_CSV value like fr,de,es) and loop the “append to sheet” action so each language gets its own tab. Many teams also tweak IOS_SOURCE_GLOB and IOS_TARGET_GLOB to scan only specific modules, and add IGNORE_KEY_PREFIXES_CSV so debug strings don’t flood the report.

Why is my GitHub connection failing in this workflow?

Usually it’s an expired token or the token doesn’t have repo scope. Regenerate the GitHub token (or update your GitHub App permissions) and reselect the credential in n8n so the HTTP requests can read the repo tree and create PRs. If failures only happen on busy days, rate limiting can be the culprit; spacing requests and reducing your glob scope helps. Also check that the webhook event you picked (push vs pull request) matches what you’re testing.

How many strings can this GitHub Sheets automation handle?

A typical iOS repo with a few thousand keys is fine, and the real limit is how many webhook events you run each month (on Cloud) or how much CPU your server has (self-hosted).

Is this GitHub Sheets automation better than using Zapier or Make?

Often, yes, because this workflow relies on file-tree scanning, branching logic, and custom comparisons that get awkward (and pricey) in simpler automation tools. n8n is comfortable doing multiple HTTP calls, merging streams, and running “if PR creation is enabled” logic without turning into a fragile chain. You also get the self-hosting option, which is handy when webhooks fire a lot during active development. On the other hand, if all you want is “send a message when a PR opens,” Zapier or Make can be faster to set up. If you want a sanity check, Talk to an automation expert.

Once this is running, missing iOS strings stop being a last-minute scramble and become a tidy, shared list that updates itself. Honestly, that’s the whole win.

Need Help Setting This Up?

Our automation experts can build and customize this workflow for your specific needs. Free 15-minute consultation—no commitment required.

Lisa Granqvist

Workflow Automation Expert

Expert in workflow automation and no-code tools.

×

Use template

Get instant access to this n8n workflow Json file

💬
Launch login modal Launch register modal