The goal
Replace an aging Drupal site with one the business can manage itself, without losing a single indexed URL, and let customers send a full order - sizes, thickness, edge banding, quantities - that the warehouse can price and get signed without phone tag.
The solution
A Nuxt 4 + MongoDB site and admin in Hebrew RTL. A migration script imported the legacy catalog from a scrape: categories, products, articles, the about and contact pages and 273 images, with 405 redirects so every old URL still resolves. Each product page has a cut-to-size form (length, width, thickness, colour, edge banding, quantity) that fills a browser-side order cart. Sending the cart creates an order request and a draft quote priced from an internal price list; the business adjusts it and sends a signing link by email or WhatsApp. The customer reviews the quote, draws a signature and gets the signed PDF. The admin also covers leads, customers, catalog and page editing, roles and permissions, an audit log with restore, and an error log.
Demo video
Highlights
- Every legacy URL kept or redirected - no lost search traffic
- Cut-to-size order requests straight from the product page
- Order request to signed quote without a phone call
- Tamper-evident signatures with the signed PDF archived
- The business edits catalog, pages and prices on its own
The challenge
The old site had years of indexed Hebrew URLs across categories, products and articles. A new site with new paths would have thrown that search traffic away.
Kept the legacy URL shapes exactly, resolved them through one catch-all route that tries page, product, then category, and generated 405 redirects from the import itself for everything that moved. Redirect headers are percent-encoded ASCII so Hebrew paths survive every client.
Wood is sold cut to size, so a product page with only a quantity box cannot describe a real order, and there are no public prices to calculate a total from.
Each product carries its own order fields (dimensions, thickness, colour, edge banding). The request goes in without prices, and the server turns it into a draft quote from the internal price list, with the customer's sizes and notes on each line, ready for the business to adjust and send.
A signed quote has to be the exact document the customer saw, even if someone edits it afterwards.
One renderer feeds both the signing page and the PDF. The SHA-256 of the agreed content is stored with the signature, signing is refused if the quote changed after it was opened, and signed quotes are frozen: they can be duplicated, never edited or deleted.
What was delivered
- Public Hebrew site with catalog, articles, order cart and quote signing page
- Legacy content import with redirect map and import report
- Admin: order requests, quotes, price list, customers, leads, catalog, pages, settings
- Roles and permissions, two-factor login, audit log with restore, error log with email alerts
- SEO and AI-search layer: sitemap, llms.txt, markdown twins, structured data
Results
405
Legacy URLs kept
273
Images migrated
E-signed
Quotes
Hebrew RTL
Layout
What it taught me
- Generating redirects from the import itself is the only way to be sure no old URL was forgotten
- For a business without public prices, a well-structured request that becomes a draft quote saves more time than a checkout would
- Hashing the agreed content is what makes an online signature worth something later

