- Home
- Apps
- Multichannel & PIM Tools
- Website Page Migration
Illustrative previewA build-to-order Odoo module that imports website pages, blog posts, and product records
— with embedded images, per-language translations, and SEO metadata preserved — into your Odoo site.
ECOSIRE scopes, builds, installs, and supports it for you.
What is Website Page Migration?
A build-to-order Odoo module that imports website pages, blog posts, and product records — with embedded images, per-language translations, and SEO metadata preserved — into your Odoo site. ECOSIRE scopes, builds, installs, and supports it for you. Built to order by ECOSIRE for Odoo 17, 18, 19 — indicative price from $999.00 USD; request a quote for a scoped proposal.
Key Features
Built to order, done for you
No DIY setup — a working app, built, installed and supported by ECOSIRE.
- 1
You order
Start with a one-time build price. We scope it with you at kickoff.
- 2
We build & install
ECOSIRE builds, configures and installs it on your Odoo.
- 3
Go live + support
You go live in about one working week, with two weeks of go-live support. Defects in the code we deliver are fixed free of charge.
Technical Specifications
- Odoo Compatibility
- Odoo 17, Odoo 18, Odoo 19
- Editions
- Enterprise & Community
- License
- Licence confirmation required
- Python Requirement
- Python 3.10+
- Database
- PostgreSQL 12+
About this Product
Migrating a website into Odoo usually stalls on the parts nobody budgeted for: hundreds of website.page records, years of blog content, product descriptions, and — the real killers — the images embedded in rich text, the per-language translations, and the SEO metadata (meta titles, descriptions, canonical URLs, redirects) that protect your search rankings. Odoo native gives you a generic import interface for standard models, but it treats a page as a flat row of data. It does not rehydrate <img> sources into ir.attachment records, it does not map your source CMS's language codes onto res.lang and Odoo's field-translation layer, and it has no concept of preserving old URLs so inbound links and Google's index don't break on cutover day. Teams end up copy-pasting page by page, losing alt text and hreflang along the way, and then watching organic traffic dip after launch.
Website Page Migration is a made-to-order Odoo module that ECOSIRE builds around your specific source system and content shape. At its core is a configurable import engine that reads your exported content (CSV, JSON, XML, WXR, or a direct read from your old CMS over its API) and maps it onto Odoo's real models: website.page and its backing ir.ui.view (QWeb arch) for static pages, blog.post/blog.blog for articles, and product.template/product.public.category for the e-commerce catalog. Rich-text bodies are parsed so that every embedded image is downloaded, deduplicated by checksum, stored as an ir.attachment, and re-referenced with a stable /web/image/... URL — alt text and captions carried across. A staged, transactional loader (with idempotent external IDs in ir.model.data) means a re-run updates rather than duplicates, so you can migrate in waves and re-import safely.
Technically, the module is a proper addon with a versioned __manifest__.py depending on website, website_blog, and (when catalog is in scope) website_sale. Translations are handled by resolving each source locale to an active res.lang, then writing the translated values through Odoo's translation API so the front-end language switcher and hreflang tags work correctly. SEO is first-class: we map source meta titles/descriptions and website_meta_keywords, set canonical hints, and generate website.rewrite (301) records from every old path to its new Odoo URL so link equity and bookmarks survive. Access is governed by ir.model.access.csv plus record rules so the migration wizard is limited to administrators, and the whole run is logged for audit. A wizard (TransientModel) drives mapping, dry-run validation, and a preview report; larger jobs run through queued/automated actions so a 20,000-record import doesn't tie up a worker or hit request timeouts. It targets Odoo 17.0, 18.0, and 19.0, and we note Community vs Enterprise differences up front — e.g. multi-website routing and certain website tools differ, and we build to whichever edition you run.
Because this is build-to-order, nothing ships until we've scoped it with you. A short scoping call establishes your source platform, content volume, languages, and catalog complexity; we then confirm a fixed quote and a field mapping, build the module against a copy of your source data, and validate it on a staging database before touching production. Typical delivery is one working week from confirmed scope, depending on source-data cleanliness and volume. Pricing starts from $999 (indicative, single-company base scope); large data-migration volume, additional source platforms, deep multi-language depth, and multi-company or multi-website routing increase the quoted scope. You receive the installable source, so you are never locked to us.
What you get
- Installable, version-pinned module source code (`__manifest__.py`, models, views, security, wizard) for your Odoo edition and version
- Installation and configuration on your staging environment, including source-to-Odoo field mapping setup
- Technical documentation: data model, mapping reference, redirect logic, and re-run/rollback notes
- End-user guide plus a live training session for your team on running and re-running migrations
- UAT on a staging copy with a dry-run validation report, then a controlled production cutover with a documented rollback plan
- Post-go-live support window for defect fixes and mapping adjustments
- Git repository handover with full commit history and tagged release
- Migration run log and reconciliation report (record counts, redirects created, exceptions) for sign-off
Who this is for
Agency or implementation partner replatforming a client
Needs a repeatable, idempotent import that maps a client's legacy CMS pages, blog, and catalog into Odoo without hand-copying — and wants a redirect map generated automatically so the client's SEO survives the move.
In-house Odoo administrator consolidating sites
Runs Odoo already and is folding a separate marketing site or old CMS into the Odoo website. Wants images, translations, and meta preserved, plus the ability to migrate in waves and re-run safely against staging.
Marketing / SEO lead protecting organic traffic
Cares most that meta titles, descriptions, canonicals, hreflang, and 301 redirects come across intact so rankings and inbound links don't break at launch — and wants a reconciliation report to prove nothing was dropped.
Multi-language / multi-company operator
Manages content across several languages and legal entities and needs per-locale translations mapped to `res.lang` and content scoped correctly across companies or websites.
How Website Page Migration Compares
| Criterion | ECOSIRE | Custom Build | Competitor | Odoo Native |
|---|---|---|---|---|
| Nature of solution | Module built to order around your source and content shape | Bespoke scripts written from scratch in-house | Generic off-the-shelf importer with fixed field mapping | Built-in generic import for standard models |
| Embedded image handling | Downloads, dedupes, stores as `ir.attachment`, rewrites URLs with alt text | Possible but must be coded and tested yourself | Usually leaves external image URLs or drops them | Not handled — images stay as raw source links |
| Translations | Locales mapped to `res.lang` via Odoo translation layer, hreflang intact | Doable but complex to implement correctly | Often single-language only | No per-language mapping on import |
| SEO metadata & redirects | Meta, canonical, and 301 `website.rewrite` map generated automatically | Must build redirect logic and meta mapping by hand | Rarely generates redirects | No redirect generation; meta not mapped on import |
| Re-runs / idempotency | Deterministic external IDs — safe re-runs, staged waves | Depends entirely on how you build it | Often creates duplicates on re-import | Re-import risks duplicate records |
| Large-volume jobs | Queued/`ir.cron` batch processing avoids timeouts | You handle batching and worker load | May time out on big datasets | UI import strains on very large files |
| Support & ownership | Scoped quote, support window, full source + git handover | You own and maintain everything | Vendor support, limited customization | No migration-specific support |
| Odoo version coverage | Built and tested for 17.0 / 18.0 / 19.0, Community or Enterprise | Whatever you target and test | Version support varies by listing | Ships with your Odoo version only |
Frequently Asked Questions about Website Page Migration
Is this a ready-made app I can download and install right now?
No. Website Page Migration is build-to-order. We scope it against your specific source platform and content, build the module around your data, validate it on staging, then install it. You are not buying an existing apps.odoo.com download — you are commissioning a module tailored to your migration.
How long does delivery take?
Typical delivery is one working week from confirmed scope. The exact timeline depends on how clean your source data is, the content volume, the number of languages, and whether the e-commerce catalog is included. We confirm a schedule during scoping before any build starts.
How does pricing and scoping work?
Pricing starts from $999 as an indicative figure for a single-company, base-scope migration. After a short scoping call we send a fixed quote. Large data volumes, additional source platforms, deep multi-language work, and multi-company or multi-website routing increase the scope and the quote. The from-price is a starting point, not a firm final price.
What about support and updates after go-live?
Every build includes a post-go-live support window for defect fixes and mapping adjustments. Because you receive the full source and git repo, your team can maintain it, and we offer ongoing support or version-upgrade work (e.g. moving the module to a newer Odoo release) as a follow-on engagement.
Will my SEO rankings and old URLs survive the migration?
Yes — that is a core design goal. We map meta titles, descriptions, keywords, and canonical hints, carry per-language translations so hreflang stays correct, and auto-generate `website.rewrite` 301 redirects from every legacy URL to its new Odoo path so inbound links, bookmarks, and index equity are preserved at cutover.
Which Odoo versions and editions do you support?
We build for Odoo 17.0, 18.0, and 19.0, on either Community or Enterprise. Some website features (multi-website routing and certain tools) differ between editions, so we confirm your edition during scoping and build accordingly.
Can I re-run the migration or do it in stages?
Yes. The loader uses deterministic external IDs in `ir.model.data`, so a re-run updates existing records instead of creating duplicates. That lets you migrate in waves, validate on staging with a dry run, and re-import safely after fixing source-data issues.
Related Modules

Website Display Packaging Options
A build-to-order Odoo eCommerce module that lets your online shoppers view, compare and select packaging options (single unit, retail case, pallet, gift-wrap, bulk) directly on the product page, with the chosen packaging flowing through cart, quotation, delivery and invoice. Scoped, built, installed and supported by ECOSIRE.

Website/Portal Returns Self-Service for Odoo
Customers raise and track returns from your Odoo website/portal — auto-creating RMAs and reverse pickings, built and installed by ECOSIRE.

Website Show Price After Login
A made-to-order Odoo eCommerce module that hides product pricing and the Add-to-Cart flow from anonymous visitors, revealing them only to logged-in members you approve. ECOSIRE scopes, builds, installs, and supports it for your Odoo 17/18/19 site.
Website Page Migration
A build-to-order Odoo module that imports website pages, blog posts, and product records — with embedded images, per-language translations, and SEO metadata preserved — into your Odoo site. ECOSIRE scopes, builds, installs, and supports it for you.
- Reads source content from CSV, JSON, XML, or WXR exports, or via a direct read from the legacy CMS API, into a normalized staging layer before load
- Maps static pages onto `website.page` with backing `ir.ui.view` QWeb arch, preserving URL path, publish state, and menu placement
- Migrates articles into `blog.post`/`blog.blog` with author, publish date, cover image, tags, and teaser preserved
- Optional catalog import into `product.template`/`product.public.category` with descriptions, variants, and category tree
