# SEO All in One with 301 Redirects and 404 Monitor

> Keep a redirect table honest: validate a CSV before import, find loops, chains and dead targets, flatten a chain, and let the 404 log propose targets.

- **What it is:** Keep a redirect table honest: validate a CSV before import, find loops, chains and dead targets, flatten a chain, and let the 404 log propose targets.
- **For:** Website
- **Odoo versions:** 16.0, 17.0, 18.0, 19.0, 20.0 - Community and Enterprise
- **Runs on:** Odoo.sh or Odoo you host yourself - not Odoo Online, which accepts no third-party apps
- **Price:** 198 EUR, one-time, on the Odoo Apps Store
- **Technical name:** bambooforge_redirect_pro
- **Not for:** Scanning never changes a rule. Rules change when you press Fix, or Flatten the chain on the rule itself, or accept a suggestion.; Regex rules are scanned like any other rule - the chain walk uses a sample path derived from the pattern - but are never rewritten automatically: the target of a regex rule depends on the URL that matched, so rewriting it from one sample would break every other path it serves.
- **Manual:** https://docs.bambooforge.dev/bambooforge_redirect_pro/
- **Live demo:** https://demo20.bambooforge.dev/odoo/action-bambooforge_redirect_pro.action_bf_redirect_scan
- **Store page:** https://apps.odoo.com/apps/modules/20.0/bambooforge_redirect_pro
- **Manual last updated:** 2026-10-15

---
# SEO All in One with 301 Redirects and 404 Monitor

An add-on for **BambooForge SEO Pro**. SEO Pro gives you the redirect rules;
this keeps them healthy once the migration week is over: a dry run before a
CSV becomes six hundred live rules, a scan that finds the loops, chains and
dead targets already in the table, and a 404 monitor that proposes the
target instead of asking you to type it.

## Install

1. Install **BambooForge Redirect Manager Pro** (it needs *BambooForge SEO Pro*); nothing else changes on install.
2. Open the two entries under *SEO Pro*: **Redirect Health** and, under Configuration, **Scan redirects now**. An *SEO User* can read the findings; an *SEO Manager* can scan, fix, import and accept suggestions.

## Redirect Health

*SEO Pro → Redirect Health*. The list is grouped by finding, worst first.

**Redirect loop**

The visitor is sent in a circle and the browser answers
`ERR_TOO_MANY_REDIRECTS`. SEO Pro refuses to *save* a rule that closes
a loop, which catches the loop somebody writes in one sitting. It cannot
catch the other kind: A to B, B to C, and six months later somebody edits
C. Every rule was legal when it was written. The scan follows the chain
to its end instead, and reports the rule that closes the circle.

**Redirect chain**

A to B to C. Every hop is a round trip for the visitor, and search
engines stop following after a few. **Fix** points the rule straight at
the end of the chain.

**Target does not exist**

The redirect still works, and lands the visitor in a 404 because the
target page was deleted. The finding names the website the target is
missing on - useful when one rule serves six client sites. A target that
answers 410 is reported too: two round trips to be told the page is gone.

**Duplicate origin**

Two rules, same origin. Only one of them ever fires; **Fix** disables the
other.

**Never used**

Created more than six months ago and never hit once. Rules cost a lookup
on every 404, so retiring the ones nobody asks for is free speed. **Fix**
archives the rule; it is not deleted, and un-archiving it brings it back.

The scan runs every Monday at 03:00 server time, and on demand from
*Configuration → Scan redirects now*. It updates findings instead of
duplicating them, closes the ones that went away, and leaves anything you
marked **Ignore** ignored - a report that re-opens every Monday is a report
nobody reads twice.

### What it does not do

Scanning never changes a rule. Rules change when you press **Fix**, or
**Flatten the chain** on the rule itself, or accept a suggestion.

Regex rules are scanned like any other rule - the chain walk uses a sample
path derived from the pattern - but are never rewritten automatically: the
target of a regex rule depends on the URL that matched, so rewriting it from
one sample would break every other path it serves.

## Importing a redirect list

*Redirects → Import redirects (CSV)*, then **Check the file**.

The header is SEO Pro's: `url_from,url_to,redirect_type` plus the optional
`is_regex`, `sequence` and `name`. Every row gets a verdict:

| Verdict | Meaning |
|---|---|
| Will be created | Nothing wrong with the row. |
| Duplicate inside the file | An earlier line already redirects that URL. |
| Origin already redirected | A rule for that URL exists; the import would add a second one that never fires. |
| Would create a loop | The target redirects straight back here. |
| Redirects to itself | Origin and target are the same URL. |
| Target does not exist | Not a page and not a route on this site. A warning, not a block - you may be importing ahead of the content. |
| Invalid row | No origin, or a 301 without a target. |

Rows that are blocked come unticked; warnings stay ticked. You can edit a
target in the preview before importing. **Import the ticked rows** creates
exactly those, each in its own savepoint, so one bad row reports itself
instead of sinking the file.

A target that is itself redirected is shortened on the way in: importing
`/a -> /b` when `/b -> /contact` already exists writes `/a -> /contact`
and saves you the chain you would have had to flatten next Monday.

## The 404 monitor proposes a target

*SEO Pro → 404 Monitor*. A dead URL is almost never random: it is yesterday's
slug. Every open 404 is scored against the pages SEO Pro has indexed for that
website:

- the **slug** - the last segment, because that is what a rename touches;
- the **whole path**;
- the **words** the two URLs share, ignoring stop words and numbering.

The best match is shown with a **confidence** between 0 and 1. Below 0.55 the
monitor says nothing at all: a wrong 301 removes the row from the list and
hides the problem from the next person who looks at it.

**Accept suggestion** creates a 301 for the selected rows, marks each 404 as
redirected and links the rule. Rows without a suggestion are skipped, and a
row that cannot be created - because somebody redirected the target back in
the meantime - does not roll back the rows that could.

Scoring runs every four hours for 404s nobody has looked at yet, and on
demand with **Suggest targets**.

## Multi-website and multi-company

- A finding belongs to the **rule**, not to the website that happened to be
  scanned last. A rule that serves every website produces one finding.
- Suggestions never cross sites: a page published on client B is never
  proposed as the target for a 404 on client A.
- The findings list is filtered by the websites the user can see, and by
  company through the website's company.

## Housekeeping

- Findings marked fixed or ignored are deleted 30 days later by the standard
  autovacuum.
- Nothing is crawled and nothing leaves the server: "does this URL exist" is
  answered from SEO Pro's page index and the routes this Odoo really serves.

## How we make sure it works

Before every release, **60 automated checks** run against this app on Odoo 16, 17, 18, 19 and 20.
Among them:

- A read only seo user cannot rewrite the monitor.
- A read only seo user cannot scan.
- A global rule is reported once not once per website.
- A row already handled is not redirected twice.
- A suggestion is never borrowed from another client.

The complete list is in the source you receive.

## Questions people ask

****Which Odoo versions does it run on?****

Odoo 16.0, 17.0, 18.0, 19.0, 20.0, on the series you buy it for; each series is its own listing.

****Community or Enterprise?****

Both. It needs no Enterprise app.

****What does it need?****

The standard Web; seo pro (BambooForge) must be installed first app. No extra Python package.

****Where does it show up?****

Under the **Scan redirects now** menu (Redirect Health).

****Does anything leave my server?****

No. It makes no call outside your Odoo server: no telemetry, no licence check, no third-party service.

****What happens if I uninstall it?****

Odoo drops the app's own tables and fields; the standard records it worked on (contacts, orders, products) stay as they are.

## Support

[support@bambooforge.dev](mailto:support@bambooforge.dev) - the people who wrote it.
