Our work

Cammers sofa factory: from WordPress to an Astro catalogue of 139 pages

How we fully rebuilt the site of this sofa manufacturer from Mechelen, a family business since 1934, in Astro on Cloudflare Workers. With 50 reference projects, 30 sofa models and 29 reupholstering projects, 101 doorway pages we deliberately left behind, and 235 redirects that carried the accumulated search visibility across.

Cammers has been building sofas on the Winketkaai in Mechelen since 1934, today with the third generation at the helm and a team of 25 people. The workshop upholstered the KMSKA museum, Mechelen city hall, Tomorrowland HQ and restaurant Le Pristine. Almost none of that craftsmanship was visible on the old WordPress site.

Challenge

The site ran on WordPress with Breakdance. The collection was scattered, the references could not be filtered by sector or by product type, and the sitemap was inflated with 101 municipality pages of the type upholsterer-town and furniture-shop-town. Exactly the pattern Google files under scaled content abuse.

Approach

A full rebuild in Astro on Cloudflare Workers, with the catalogue as the core rather than an afterthought. Every sofa model, every reference project and every reupholstering job got its own page with its own photos and its own structured data. The doorway pages did not come along, but every old URL did get a 301 based on intent.

A catalogue, not a brochure

The new site holds 139 pages, and most of them are work that needs to be seen: 50 reference projects for architects and professionals, 30 sofa models from the in-house collection, 29 reupholstering projects and seven blog articles. Together more than a thousand photos and seven films from the workshop, all statically built and without a database.

The reference overview filters on two axes at once: by sector (hospitality, office and retail, healthcare, restoration and heritage, residential) and by what was actually made (benches, sofas, beds, walls and panels). An architect looking for upholstered wall panels in healthcare lands on the right example straight away instead of scrolling through fifty projects. The reupholstering pages show the result first and the starting condition after it, because that is the order in which a visitor wants to look.

101 doorway pages we deliberately left behind

The old site carried 101 municipality pages: 50 of the upholsterer-town kind and 51 of the furniture-shop-town kind, each with virtually the same text and a different place name. That earns some longtail traffic in the short run and a problem in the long run, because Google treats such series as scaled content abuse.

So they were not migrated. Every URL did get a 301 to the page that matches the search intent: upholsterer-town to the reupholstering hub, furniture-shop-town to the sofa collection, with an exception for furniture-shop-mechelen because that term genuinely ranks and belongs on the showroom page. There are 235 fixed 301 redirects plus two wildcard rules in total, and after go-live every single one was measured on the real domain: 235 out of 235 land on the right address.

Fast, because there is little to load

Astro serves static HTML from the Cloudflare network, so there is no PHP process and no database between the visitor and the page. The CSS sits inside the HTML instead of in separate files, the Spectral and Jost typefaces are self-hosted with only the weights that are genuinely used above the fold, and the hero image is preloaded.

A Lighthouse run on the live site returns 99 for performance and 100 for accessibility, best practices and SEO, with a largest contentful paint of 0.9 seconds. Accessibility was not a by-product here: every text element on the site was calculated for contrast ratio, including the translucent layers above it, which surfaced 21 places where the brand colours fell below the WCAG threshold.

Findable on Google, quotable by AI

Every page type carries its own machine-readable JSON-LD. The company appears as a FurnitureStore with address, opening hours and service catalogue, every sofa model as a Product, every reference project and reupholstering job as a CreativeWork with its location, the blog articles as BlogPosting and the frequently asked questions as FAQPage.

The blog is built around real questions rather than around keywords: what does it cost to reupholster a sofa, how do you choose upholstery fabric, what does a Martindale rating mean for contract furniture. Those are exactly the questions people put to ChatGPT and Perplexity, and an answer with figures and context attached is an answer that can be cited.

A form without a captcha, and a move without mail downtime

The contact form runs on Astro Actions with server-side validation, a honeypot and a rate limit. No captcha, because there is no open endpoint to abuse and the visitor should not have to point out traffic lights. The enquiry leaves as a formatted email through Resend, with the sender on their own domain and the reply address on the person filling it in, and the confirmation appears in the card where the form stood instead of on a separate thank-you page.

The move to Cloudflare left the mail completely untouched. The MX records, SPF, DMARC and both DKIM selectors of their Microsoft 365 were counted before and after the switch; only the two A records of the website changed. The apex got a redirect rule of its own, because connecting www does not cover cammers.be, and without that rule the old site would simply have stayed there.

The checks live in the build, not in a checklist

For a site with 139 pages and more than a thousand images, checking by hand is not a method. So dedicated scripts run across the entire site: for broken links and missing images, for horizontal overflow and undersized tap targets on mobile, for colour contrast, for JavaScript errors in the console, for the structured data, for the aspect ratio of every gallery image, and for the share image of every page.

Two of them hold up the build when they find something, so a fault cannot quietly slip through to production. That has proved necessary: the first version of the gallery check derived its addresses with a trailing slash while this site does not use one, so it got 404 responses 111 times and cheerfully reported zero problems. A green result with no substance is more dangerous than no check at all, so every gate now has a counter-test that has to fail.

139 pages

50 references, 30 sofa models, 29 reupholstering projects and seven blog articles, statically built and without a database.

235 out of 235 redirects

Every old WordPress URL 301 to its new address, each one measured on the real domain after go-live.

99 on Lighthouse

Performance 99, and 100 for accessibility, best practices and SEO, measured on the live site.

Tools used

Astro
Cloudflare Workers
Astro Actions
Resend API
PhotoSwipe and Swiper
Google Analytics 4
Google Search Console
Claude Code and MCP integrations

Project images

Your project as the next case?

We work with Belgian SMEs that want to grow.

Through Shopify, performance marketing and AI.

Client reviews

What clients experience

Why entrepreneurs love working with ClickForest.

Excellent on Google5.0★★★★★based on 24 reviews