How to use it
Put one list in each column, one term per line. Commas, semicolons and tabs work as separators too, so a row pasted from a spreadsheet splits cleanly. The columns join left to right, and the arrows move a column earlier or later in the keyword.
Each column is Required, Optional or Off. A Required column appears in every keyword. An Optional one appears both with and without its terms, which is how one pass covers plumber, emergency plumber, plumber leeds and emergency plumber leeds. Off parks a column without deleting it. At least one column has to be Required, so a modifier never ends up as a keyword on its own.
Pick the match types, or switch to Negatives to build a negative list from the same columns. The output updates as you type. The preview shows the first thousand lines; Copy and Download always take the full list.
Built for how matching works now
Modified broad match was retired in 2021, so there is no plus-sign option. Paste an old list of +modified +broad keywords, or keywords already wrapped in brackets and quotes, and the symbols are stripped back to plain terms; the match types you tick are applied fresh.
Word order matters less than it did. Since 2017, exact match has also matched searches with the same words in a different order, and phrase match only cares about order when it changes the meaning. Generating every ordering mostly multiplies the list, so it's an option, off by default.
Every keyword is checked against the limits that apply today. Google Ads won't accept a keyword over 80 characters or 10 words, so those are left out and listed. A keyword over 30 characters can't be placed by keyword insertion in a responsive search ad headline, so the tool counts those and can leave them out. Characters Google rejects, such as ! @ % and parentheses, are removed from your terms, and a combination that says the same word twice (emergency emergency plumber) is skipped.
Negative keywords are where concatenation still does the most work. Negatives don't match close variants, so plurals and misspellings have to be listed by hand: every form of the service against free, cheap and diy is one pass here.
Getting the list into Google Ads
Google Ads format puts the match type's symbols on each keyword, one per line, grouped by match type: exact in brackets, phrase in quotes, broad bare. Paste it into an ad group's keywords, or, for negatives, into the negative keywords box or a negative keyword list.
Editor CSV builds the file for Google Ads Editor, with Campaign, Ad group, Keyword and Criterion Type columns and the match type in a column of its own. Everything can go in one ad group, or in one ad group per term from a chosen column, named from a pattern: {term} is that column's term and {match} the match type, so {term} | {match} gives Leeds | Exact. Written in capitals, {TERM}_{MATCH} gives LEEDS_EXACT for upper-case naming conventions. Negatives can go in at ad group or campaign level.
In Editor, use Account, Import, then From file, or copy the CSV and choose Paste text. Editor shows how it has mapped each column before anything changes, so check that on your first import. Nothing reaches the live account until you post. Once the ad groups are live, the campaign name injection script keeps their names in every tracking URL, so your reports read the same names you built here.
Plain drops the symbols: one keyword per line, for Keyword Planner's search volume and forecasts, or for a sheet. Once the keywords are built, the Ad Copy Battle puts the ad they will serve against three rival angles, scored by an AI-simulated panel built from the search you're bidding on.
Your lists stay in your browser
The tool is plain JavaScript running in this page. It makes no network requests, uses no AI and sends your keywords nowhere, which matters when the lists are a client's. Nothing is saved unless you tick Remember my lists on this device, which keeps them in this browser's local storage until you untick it.
If you've accepted analytics cookies, the site records that output was copied or downloaded, with the format and a rough size band, and never the keywords themselves. The privacy policy has the detail.