Combining two keyword lists means generating the complete Cartesian product — every term from list A paired with every term from list B — with a chosen separator inserted between them, producing one deterministic phrase per line up to a hard ceiling of 10,000 unique pairs. The operation is mechanical: paste, choose order, set the separator, run, and review the summary. It is not keyword research. No search engine, advertising account, or keyword provider is queried, so the resulting phrases are candidates that still need human review for relevance, intent, and actual demand. The tool runs entirely in the current browser tab — your lists are not uploaded — which makes it practical for staging ideas before they are committed to a campaign, a content brief, or a taxonomy review. This article walks through the exact mechanics of building the pair set, reading the summary numbers, and rerunning identical input to get byte-identical output for version control.

When Combining Two Lists Beats Writing Phrases by Hand
Hand-writing combinations gets out of control very quickly. Three base terms and four modifiers are not twelve phrases if you miss a row, and most writers do. A 50-term product list crossed with a 30-term audience list should produce exactly 1,500 phrases, and a list of regional modifiers crossed with service names should produce the same predictable total each time the work is redone. The mechanical act of pairing is the part that benefits from a deterministic tool, because the human value sits in deciding which terms belong on each list, not in concatenating them.
Typical jobs that match this shape include drafting ad groups around product × audience pairs, building location × service pages for a regional site, expanding a content brief from a base topic and a set of angles, and stress-testing an internal taxonomy by pairing categories with attributes. In every case the goal is the same: produce the complete set of pairs once, audit what showed up, and only keep the phrases that fit a real page, ad group, or product.
What the Combination Actually Produces
The output is the Cartesian product of the two lists in the order you select. If list A has three colors — red, blue, green — and list B has two product names — shoes, hats — and the separator is one space, the result is exactly six phrases: red shoes, red hats, blue shoes, blue hats, green shoes, green hats. Switch the order to B-then-A and the loop walks the inner list first, so the same six strings appear but in a different sequence: shoes red, shoes blue, shoes green, hats red, hats blue, hats green. The pairing rule does not change, only the iteration order.
Three colors combined with two product names produce six input pairs, but the unique phrase count can drop when collisions are introduced by the separator. With an empty separator, "ab" + "c" and "a" + "bc" both render as "abc", so the tool drops the second occurrence and reports it in the output-collision count. For readers who want to sanity-check the math behind a 50 × 30 request producing 1,500 pairs, the Excel COMBIN vs COMBINA counts article covers the difference between counting combinations and counting ordered pairs, which is the exact distinction a Cartesian product tool makes.
How to Combine Two Keyword Lists
- Open the Keyword Combiner and paste one keyword or phrase per line into list A. Each non-empty line is trimmed at the outer edges and capped at 100 Unicode code points. Empty lines are ignored, and exact case-sensitive duplicates inside the list collapse to the first occurrence.
- Paste your second list — modifiers, audience terms, locations, or any matching token — into list B with the same one-per-line format. Each editor accepts up to 100,000 UTF-16 code units and 500 unique terms.
- Choose A-then-B if you want the base term to lead, or B-then-A if you want the modifier to lead. The choice changes the loop order and therefore the sequence of the output, not the set of pairs produced.
- Enter the exact separator: a space, a hyphen, a plus sign, an empty string, or another short literal sequence. The separator can hold up to 20 Unicode code points and cannot contain a line break or control character. The tool adds no hidden spacing.
- Run the combine. The pair budget is checked first; if A × B exceeds 10,000 input pairs, the entire request fails before any output is generated. Narrow one of the source lists and try again.
- Read the summary: unique output count, normalized list sizes, theoretical pair count, removed input duplicates, and removed output collisions. Use these numbers to audit what happened.
- Press the copy button to copy the deterministic one-per-line output. Re-running the exact same input produces byte-identical text, which makes diffs and regression checks trivial.
Reading the Summary Numbers
Five numbers describe the run, and each one answers a different audit question. The unique output count is the number of phrases you can copy. The normalized list sizes are A and B after trimming and deduplication, which is what the tool actually iterated over. The theoretical pair count is A × B, computed before any collisions are dropped; if it is above 10,000 the run never started. The removed input duplicates count is how many exact repeated lines your source lists contained. The removed output collisions count is how many pair outputs collapsed onto a phrase already produced by an earlier pair — the "ab" + "c" versus "a" + "bc" case described earlier.
If the unique output count is unexpectedly large, the source lists are larger than they look or contain a term that splits into multiple meaningful phrases after the separator is applied. If it is unexpectedly small, two things are usually happening: the source lists contain exact repeats, or the separator plus the terms are producing many collisions. Tightening the source list is almost always faster than loosening the separator.
Separator Behavior and Hard Limits
The separator is a literal string, not a token or a template. Understanding how it behaves with common inputs prevents the most common downstream surprises.
| Separator input | A term | B term | Resulting phrase |
|---|---|---|---|
| One space | red | shoes | red shoes |
| Empty string | red | shoes | redshoes |
| Hyphen | red | shoes | red-shoes |
| Plus sign | red | shoes | red+shoes |
Limits exist on every input dimension and a single hard ceiling on the output dimension. Knowing them up front prevents the request from being rejected at runtime.
| Limit | Value | What it bounds |
|---|---|---|
| Per-term length | 100 Unicode code points | Each line in A or B after trimming |
| Per-editor text size | 100,000 UTF-16 code units | Total pasted text in each editor |
| Unique terms per list | 500 | Normalized, deduplicated terms in A or B |
| Separator length | 20 Unicode code points | The literal string between A and B |
| Pair budget | 10,000 | Theoretical A × B before output is generated |
The pair budget is checked before any pair is produced, so a request that is nominally too large fails the whole run rather than silently returning a partial list. This is the property that lets you trust the copy action: whatever ends up on the clipboard is the complete set for that input, with exact repeats and collisions already removed.
What the Tool Will Not Do
Several things sound related to combining keywords but are explicitly outside the scope of this tool. The Keyword Combiner does not estimate search volume, competition, cost per click, intent, language, relevance, or grammatical quality. It does not call an advertising account, a search engine, a keyword provider, or an AI service, so a generated phrase is not automatically a good target. It also does not produce platform match-type syntax, add quotation marks, wrap phrases in brackets, normalize capitalization, expand synonyms, stem words, or remove trademarked terms. Apply the rules of the destination system yourself.
Internal spaces, punctuation, accents, emoji, and non-Latin scripts inside a source term are preserved exactly as pasted, and deduplication is case-sensitive — "Shoe" and "shoe" stay as two distinct terms because they may be intentional variants. Control characters and Unicode line or paragraph separators are rejected from both the source lists and the separator.
Reviewing the Output Before You Use It
Even with a clean run, a meaningful share of the phrases will be unusable. Some will sound unnatural, some will overlap in meaning with a phrase already covered by another pair, and some will have no measurable demand at all. The pair budget existed so the generation step would not silently cut off the list, not so the list could be used as-is. The right next step is to remove irrelevant candidates by hand, confirm landing-page fit for the rest, and validate demand through an appropriate source before the list reaches a campaign or a publishing workflow.
For ad groups, that means matching each kept phrase to the ad, the landing page, and the policy constraints of the platform. For content briefs, it means checking that the phrase still describes a page the team is actually planning to write. For internal taxonomy reviews, it means flagging the phrases that would create a category with no content behind it. In all three cases, the deterministic output of the combine step is the input to a human review, not the end of the process.
For a deeper look, see How to Find Keyword Density in Any Text.