# Duplicate SEO plugins: why Yoast and Rank Math together break a site

> Two SEO plugins write two titles, two canonicals, two schema graphs and two sitemaps, and Google ignores the lot. How to pick one, migrate the settings, and confirm the page has a single set of tags.

Updated 2026-09-25 · WordPress & WooCommerce · HTML version: https://getreport.app/guides/duplicate-seo-plugins-yoast-and-rank-math-together

An SEO plugin owns the `<head>` of every page: title, description, canonical, robots directives, social tags, structured data. Two of them active at once both claim that job, and the page ends up with two of everything. Google does not average conflicting tags; it discards the ones it cannot trust. This guide shows what each plugin writes, what happens when both do, how to choose which to keep, and how to move the settings across without losing years of hand-written titles. Plan an hour, with a backup first.

## Quick answer

- Keep **one** SEO plugin. If both are active today, the page source has duplicate tags right now; check `<title>`, `<meta name="description">` and `rel="canonical"`.
- Keep the plugin that holds your history (the one with titles and descriptions for hundreds of pages); import into it from the other.
- Rank Math: Status & Tools → Import & Export lists the other plugin. Yoast: Tools → Import and Export → Import from other SEO plugins.
- Deactivate the loser, purge the page cache, re-run the [WordPress health check](https://getreport.app/tools/wordpress-checker).
- Resubmit the sitemap in Search Console if its address changed.

## Why two SEO plugins matter

Each SEO plugin writes the same set of things into every page, using the same WordPress hooks. Yoast, Rank Math, All in One SEO, SEOPress and The SEO Framework all produce a `<title>`, a meta description, a canonical link, the robots meta tag, Open Graph and Twitter tags, a JSON-LD graph with your Organization and WebSite, an XML sitemap and, usually, breadcrumbs. When two run at once, none of them checks for the other, so the page gets both sets.

What Google does with each duplicate:

| Tag | With two plugins | Effect |
| --- | --- | --- |
| `<title>` | Two title elements, or one plugin's filter wins per template | Search results show whichever Google picks, often the wrong one |
| Meta description | Two descriptions, often different | Google usually takes the first, or writes its own |
| `rel="canonical"` | Two canonical links, sometimes to different URLs | Google ignores both and chooses the canonical itself |
| Robots meta | Two tags; if either says `noindex`, the page is out | A setting in the forgotten plugin can hide pages |
| Open Graph | Two `og:title`, two `og:image` | Sharers take the first; the second plugin's image never shows |
| JSON-LD graph | Two Organization and two WebSite entities with different `@id` | Rich results are withheld rather than doubled |
| Sitemap | Two sitemaps at different or the same address | Search Console errors, or one sitemap that misses half the content |

The canonical row is the expensive one. Google's own guidance is that a page with more than one canonical is treated as having none, so the protection against duplicates (with and without trailing slash, with tracking parameters) is gone on every page of the site. [Canonical tags explained](https://getreport.app/guides/canonical-tags-explained) covers what that costs.

Two plugins also both run on every request, both add their own admin columns and metaboxes, and both keep their own settings, so the person editing a page fills in a title in one box and wonders why the other one shows.

## How getReport checks it

> **Free tool:** [WordPress health check](https://getreport.app/tools/wordpress-checker): Is your WordPress site indexed, up to date and free of the classic launch mistakes? Checks "Discourage search engines", default content and tagline, plain permalinks, attachment pages, the exposed admin user, a public staging copy and the core version, plus security basics.

The check is passive: it reads the page it fetched and nothing else. SEO plugins reveal themselves in two ways, and the report uses both. Asset paths under `/wp-content/plugins/<slug>/` name the plugin (`wordpress-seo`, `seo-by-rank-math`, `all-in-one-seo-pack`, `wp-seopress`, `autodescription`, `squirrly-seo`), and each plugin prints an HTML comment around its output: "This site is optimized with the Yoast SEO plugin", "Search Engine Optimization by Rank Math", the All in One SEO and SEOPress and SEO Framework comments. A free and a premium edition of the same plugin count once (Yoast SEO plus Yoast SEO Premium is one family), so the finding only fires for two different products.

> **Check: One SEO plugin is active.** Two or more SEO plugins all write titles, descriptions, canonicals and schema. Google gets duplicate or conflicting tags and one of them wins at random.
>
> 1. Keep one SEO plugin and deactivate the other; import its settings first (both Yoast and Rank Math have an import tool).
> 2. Check the page source afterwards for a single title, description and canonical.

> **Check: One plugin generates the structured data.** Two plugins each printing Organization, WebSite or Product schema give Google conflicting entities. Rich results are then withheld rather than doubled.
>
> 1. Keep schema output in one plugin: disable schema in the SEO plugin or in the dedicated schema plugin, not both.
> 2. In WooCommerce shops, let WooCommerce print Product schema and let the SEO plugin extend it rather than duplicate it.

![The duplicate SEO plugins finding opened on a WordPress page: the title names both plugins detected, followed by why conflicting tags let Google pick one at random and the fix to import settings into one plugin and deactivate the other](https://getreport.app/guides/img/duplicate-seo-plugins-yoast-and-rank-math-together/duplicate-seo.webp "Both plugins were recognised from their own comments and asset paths; the technical line says which evidence gave each away.")

The schema finding is separate because it catches a subtler case. Each plugin marks its JSON-LD block with a class (`yoast-schema-graph`, `rank-math-schema`, `aioseo-schema`, `seopress-schema`, and Schema Pro's), and the report counts how many different generators printed a block. Two SEO plugins produce two graphs, but so do one SEO plugin and a dedicated schema plugin, which is a legitimate setup as long as only one of them prints the Organization. WooCommerce's Product block is not counted, because it is meant to sit beside the SEO plugin's graph.

The canonical finding is the one that shows the damage:

> **Check: Canonical tag is present.** Without a canonical URL, search engines may index duplicate versions of this page (with and without trailing slash, with UTM parameters) and split its ranking signals.
>
> 1. Add <link rel="canonical" href="https://your-site.com/page/"> in <head>.
> 2. In WordPress, Yoast or Rank Math add this automatically — check it is not disabled for this page.

When two canonicals are present, the report's canonical validity finding lists the count ("2 canonical tags found") and warns, because a doubled canonical is as good as none.

## Step by step

### 1. Confirm it on the page source

Open any page, view the source, and search for `rel="canonical"`, `og:title` and `application/ld+json`. Two of each, or the two plugin comments, confirms the finding. Do this on a post and on the home page: plugins can be set to output nothing on some templates, which is why the report's single-page result is a sample, not a census.

### 2. Find out how it happened

Knowing the cause tells you which plugin holds the real data.

- **A migration that stopped halfway.** Someone installed Rank Math to move off Yoast, ran the import, and never deactivated Yoast. The newer plugin has the data; the old one is dead weight.
- **An agency or freelancer added their favourite.** The new plugin has settings for the pages they touched; the old one has everything else.
- **A theme demo import.** Many theme demos ship with All in One SEO or Yoast configured. The site owner later installed another plugin without noticing.
- **Rank Math installed for one feature** (redirects, 404 monitor, local SEO) while Yoast keeps the titles.

Open Plugins → Installed Plugins and note the "active" date if the site keeps an activity log; otherwise open a few important pages in the editor and see which plugin's box has a hand-written title and description.

### 3. Choose the one to keep

In 2026 the mainstream plugins are at feature parity for what matters: titles and descriptions with variables, canonicals, robots controls, sitemaps, breadcrumbs, Open Graph, a schema graph, redirects in the paid tiers (Rank Math has them free). Choose by data, not by feature list:

1. **Which plugin holds more history?** Years of tuned titles and descriptions are worth more than any feature.
2. **Which one does the team know?** The editor who writes descriptions every day should not learn a new box.
3. **Which one does the rest of the stack expect?** Some themes and WooCommerce extensions integrate with one plugin's breadcrumbs or schema.

If both have data, the one with more of it is the target for the import; the other plugin's data comes across and its unique entries fill the gaps.

### 4. Back up, then import

Take a full backup (the host's backup button or a backup plugin) before importing. Imports overwrite the target plugin's values for every page the source plugin had data for, and there is no undo other than the backup.

**Keeping Rank Math.** Go to Rank Math SEO → Status & Tools → Import & Export. Below the settings backup section Rank Math lists the other SEO plugins it found on the site. Tick what to bring over (Settings, Post Meta, Term Meta, Author Meta and, if offered, Redirections) and click Import. The Setup Wizard offers the same importer on its first step when it detects another plugin.

**Keeping Yoast.** Go to Yoast SEO → Tools → Import and Export and open the Import from other SEO plugins tab. Pick the plugin, click Import, and Yoast reports how many posts, terms and settings came across. The Clean up option on the same tab deletes the other plugin's leftover data; run it only once you are sure, because it is the one step you cannot reverse by reactivating.

Either way, spot-check three important pages in the editor afterwards: the SEO box of the plugin you kept should show the title, description and the index/noindex setting you had in the other one.

### 5. Deal with what the import does not carry

- **Redirects.** Yoast's importer does not bring redirects across; Rank Math's does when the source plugin has them. Export the redirect list from the losing plugin (Redirection-style CSV) before you deactivate it.
- **Sitemap address.** Yoast and Rank Math both serve `/sitemap_index.xml`, so switching between those two changes nothing. All in One SEO serves `/sitemap.xml`. If the address changes, redirect the old one and resubmit in Search Console → Sitemaps:

```nginx
# nginx: old sitemap address → the new plugin's
location = /sitemap.xml {
    return 301 /sitemap_index.xml;
}
```

- **Schema settings.** Organisation name, logo and social profiles live in each plugin's own settings; check them in the kept plugin after the import.
- **Verification codes** for Search Console and Bing, and the `robots.txt` edits some plugins manage.

### 6. Deactivate, purge, delete later

Plugins → Installed Plugins → Deactivate under the losing plugin. Purge the page cache; cached pages still carry both sets of tags until they expire. Leave the plugin installed but inactive for a week in case you need its data, then delete it; a deactivated plugin's settings stay in the database until you use the kept plugin's clean-up tool.

If a dedicated schema plugin stays alongside the SEO plugin, turn the Organization and WebSite output off in one of them. Rank Math: Titles & Meta → Local SEO and the Schema settings per type. Yoast: Settings → Site representation. [Duplicate entities: two plugins, one graph](https://getreport.app/guides/duplicate-entities-two-plugins-one-graph) walks through merging.

## Platform notes

### Managed WordPress hosts

Managed hosts run their own page cache in front of WordPress. After the change, purge it from the host's panel or its admin-bar button; the caching plugin's purge does not always reach it, and the report keeps seeing both plugins until it does.

### Multisite

The SEO plugin can be network-activated on one site and activated per site on another, which is how two end up on the same site without anyone choosing it. Check Network Admin → Plugins for the network-active one.

### WooCommerce

Both Yoast and Rank Math extend WooCommerce's Product schema rather than replacing it. After the switch, run the [WooCommerce checker](https://getreport.app/tools/woocommerce-checker) on a product page: the Product block should still carry `offers.price` and `offers.availability`.

## Verify

- Re-run the WordPress health check. The finding reads "One SEO plugin is active" and the schema finding "One plugin generates the structured data".
- Page source, on a post and on the home page: one `<title>`, one description, one `rel="canonical"`, one plugin comment.
- Search Console → Sitemaps: the sitemap you submitted reads "Success", with a page count that matches what you expect.
- Three important pages keep their hand-written titles in the kept plugin's box.

## Common mistakes

- **Deactivating before importing.** The old plugin's titles vanish from the page overnight and Google rewrites the snippets. Import first, then deactivate.
- **Running Clean up straight away.** It deletes the other plugin's data; if the import missed something, it is gone. Wait a week.
- **Keeping the old plugin "just for redirects".** It still writes every tag. Move the redirects to the kept plugin or to a small redirect plugin and switch the SEO plugin off.
- **Forgetting the page cache.** The report still shows two plugins an hour later because it fetched a cached page. Purge the caching plugin, the host cache and the CDN.
- **Leaving a noindex in the losing plugin.** A page set to noindex in Rank Math stays out of Google even after Yoast takes over, if the import copied the setting. Review the indexability of the important pages afterwards, as in [the WordPress rookie mistakes](https://getreport.app/guides/wordpress-rookie-mistakes).
