Mattress brand — making blog posts and boards visible in search
Reorganized a design-first site's board structure so its content could finally reach search.
A homepage built quickly with a design-first approach. The content was there, but search engines almost never surfaced it.
This site was a brand homepage for a mattress company. The design was clean, and the informational posts about mattress types, materials, and care were well written. But the client's frustration was that none of it was showing up in search.
The cause became clear the moment I looked at the structure. To ship the design quickly, body content had been dropped into meaningless div blocks as textboxes. Search engines parse body content through semantic structure, so when everything is rendered as flat divs, there's no way to tell what's a heading and what's body text. To a human reader the posts looked well organised; to a search engine they looked nearly blank.
The board itself had a structural problem too. The board index was rendered dynamically by JavaScript, so the first-response HTML didn't contain the post list for the search engine to see. Going into the individual post detail pages, the title tag was the site-wide title ("Mattress Brand — Official Homepage"). In other words, all 100 posts were exposed to search with the same title, making it impossible to tell which post was about what in the SERP.
One more issue — OG meta and meta descriptions weren't being auto-generated per post, so when a post was shared on social media the preview only showed the generic site-wide image. Even with good content, the sharing layer wasn't working, which kills organic traffic from social.
We set the work priorities this way. First, get titles and meta auto-generated per post. Second, fix the body markup with semantic HTML (h1/h2/article/section). Third, make the board index visible to search engines via SSR or a static fallback. Fourth, auto-include post URLs in the sitemap.
We started with per-post meta auto-generation. The post title flowed straight into the page title ('{post title} | Mattress Brand'), and the meta description was extracted automatically from the first 150 characters of the body. OG meta was switched to prefer the post's first image. That single change alone made each post individually identifiable in search results.
The semantic HTML rewrite took longer. We restructured the existing div-based content into article > h1 > h2 > p, and added Article JSON-LD separately to carry the metadata (publish date, author, category). With this in place, the search engine can clearly recognise the body as "article" content, and date metadata transmits accurately.
The board index page had its JavaScript dependency reduced so the post list ships in the first-response HTML. Search engine bots have execution constraints around JavaScript, and they tend to be especially slow to index new posts via JS-rendered listings, so cleaning this up mattered.
Finally, sitemap.xml was switched to a dynamic generation handler so every newly published post is included automatically. The client doesn't have to submit a separate index request for each new post — it flows naturally.
By the time we wrapped, the directly verifiable changes were unambiguous. Around 100 post pages each had unique titles, meta descriptions, and OG images. The board index was exposing the post list in first-response HTML. The sitemap was auto-including post URLs. We'd also fixed some things outside the original scope, which is why the client's review used the phrase "beyond what I expected."
Outcome points
- 01Board and post pages now eligible for search visibility
- 02Better body content recognition
- 03Meta information unified
- 04Adjacent improvements handled at the same time
Problems found
- Design-first build meant search engines couldn't read the body content properly
- Board posts almost never showed up in search results
- Meta information was missing or inconsistent across pages
- Content existed but wasn't converting to traffic
Work performed
- Audited and cleaned up the board and post pages' meta structure
- Improved markup so body content reaches search engines
- Unified per-page titles and meta descriptions
- Reviewed sitemap and robots, requested indexing
- Handled adjacent improvements outside the original scope
Specific edits
- Post page headAuto-generate title, meta description, and OG meta per postStructurally fixes the problem of 100+ posts sharing the same meta. New posts inherit it automatically.
- Post bodyRewrote div-based markup into article > h1 > h2 > pSo search engines can parse the body semantically. Visual design stays the same, only the semantics improve.
- Post headInserted Article JSON-LD (datePublished, author, articleSection)Date, author, and category are passed explicitly to search engines, classifying the content as informational.
- Board indexReduced JS rendering reliance — post list now in the initial HTML responseSearch engine bots find the post list without needing to execute JS, improving indexing speed for new posts.
- sitemap.xmlStatic file -> dynamic handler, posts auto-includedNo more manual sitemap updates on each new post.
- robots.txtAdded Sitemap: with absolute URLLets Search Console and other search engines discover the sitemap automatically.
- Main and About pages (outside original scope)Cleaned up meta and OG, inserted Organization JSON-LDHandling them together reduced effort leakage. Unified the basic SEO foundation.
Before / After
| Item | Before | After |
|---|---|---|
| Post page titles | All 100 posts shared the site-wide title | Auto-generated from the post title ('{post title} | {brand}') |
| Post meta descriptions | Site-wide default or missing | Auto-extracted from the first 150 characters of the post body |
| Body HTML semantic structure | All div-based, no h1/h2/article | Restructured to article > h1 > h2 > p semantic HTML |
| Board index SSR | JS-rendered — initial HTML was empty | Post list included in the initial HTML response |
| Article JSON-LD | Not applied | Applied site-wide with datePublished, author, articleSection |
| Posts in sitemap | Manually maintained, many missing | Dynamically generated, new posts included automatically |
| OG images | All posts used the site-wide default image | Auto-uses the post's first image |
Timeline
- 01Week 0 - Diagnosis
- Audited board and post HTML source (semantic structure / meta / SSR)
- Identified the cause: design-first build with no SEO recognition structure
- Agreed on 4 priority areas (meta automation / semantic / SSR / sitemap)
- 02Week 1 - Post meta automation
- Post page title auto-generated as '{post title} | {brand}'
- Meta description auto-extracted from the first 150 characters
- OG image auto-uses the post's first image
All ~100 posts are now individually identifiable in search results
- 03Week 2 - Semantic HTML + Article schema
- Restructured div-based body into article/h1/h2/p
- Added Article JSON-LD (datePublished, author, articleSection)
- Confirmed via structured data validator
Search engines now recognize the body as 'article' content
- 04Week 3 - Index SSR + dynamic sitemap
- Updated the board index so the post list appears in the initial HTML response
- Introduced a dynamic sitemap.xml handler (auto-includes posts)
- Added a sitemap line to robots.txt
- Registered and verified Search Console, requested indexing
New posts automatically join the indexing flow without manual work
- 05Additional work (outside the original scope)
- Cleaned up main page meta and OG
- Added Organization JSON-LD
- Documented internal linking improvement recommendations
Tidied up the site's broader SEO basics in one pass
Summary
- Content can now reach search engines
- Meta information unified
- Adjacent fixes stabilized site-wide SEO
Client review
Our homepage was built in a rush, design-first, so the content on it wasn't showing up in search at all. I had zero SEO knowledge and had been burned a few times by careless agencies on Kmong, so honestly I had very low expectations. The result was way beyond what I expected. Everything was done in 1-2 days, and they handled extra work I didn't even ask for. It's almost hard to believe an agency works this earnestly. Highly recommended.
- Quality of work5.0
- Helpful consultation5.0
- Quick responses5.0
If you need similar work, start with the free audit or get in touch directly.