62-Page Dental WordPress Build in 53 Days — White-Label Delivery for a US Marketing Agency
A 62-page WordPress build delivered in 53 days — 5 templates, 46 URL-path pairs reconciled during blog migration, 29-row checklist, 58h, no overrun.
Screenshots captured by automated tooling — some elements may not have loaded fully or may layer on top of each other. For the most accurate view, visit the live site →
Build the URLs across the agency's templates, wire the conversion primitive, then work the QA backlogs to closure.
The Craft of a Build
62 pages of a dental-practice WordPress build across five branded templates — 21 blog posts, 26 service pages — where the engagement’s defining task was not page construction but URL-path restructuring. 46 legacy paths under /procedures/ and /about/blog/ were flattened to a new hierarchy and verified against staging row by row, a reconciliation the agency’s workbook had not foreseen with a dedicated redirects tab. 58 hours, 53 days, no overrun.
Snapshot
| Field | Value |
|---|---|
| End-client industry | Healthcare (Dental) |
| End-client | Roman Dental Arts (Hackensack, NJ) |
| Engagement | White-label WordPress build for a US marketing agency specialising in local-business websites |
| Project Type | WordPress build with Elementor on WP Engine, with URL path restructuring and blog content migration |
| Scope | 62 URLs — homepage, 4 about pages, 26 service pages across cosmetic / restorative / family / oral-maxillofacial / implant categories, 21 blog posts, 10 default template pages (patient resources, contact, testimonials, etc.) |
| Timeline | 53 days (18 Mar – 10 May 2025), delivered on schedule |
| Effort | 58 hours against a 58-hour estimate — no overrun |
| Team | 5 specialists (35h dev · 10h QA · 4h PM · 9h content and procedure additions) |
| Templates | 5 reusable templates — Homepage, About Us, Service Page, Blog, Default Template |
| Tech Stack | WordPress · Elementor · Gravity Forms · WP Engine · Screaming Frog · Site Checker (xaverPRO QA plugin) |
| Delivered | 62 URLs built across 5 templates, 46 unique URL-path pairs reconciled, 9/9 Issues Backlog closed as Completed, 29-row checklist signed off |
| Engagement cadence | 9 agency-raised issues · all closed by handoff (1-day active span, 2025-04-07 – 2025-04-07) |
| Review rounds | ≈4 review rounds across the 53-day calendar window |
| Launch checklist | 29 items, signed off before cutover |
The Brief
A US marketing agency retained by Roman Dental Arts — a full-care dental practice in Hackensack offering cosmetic, restorative, family, oral-maxillofacial, and implant dentistry — handed over a Google Sheets workbook with a full URL map, a templates catalogue, a launch checklist, and a pre-populated Issues Backlog. We worked inside the agency’s WP Engine account, laid the pages out in Elementor, and routed the practice’s enquiries through Gravity Forms.
The ask: build 62 URLs across 5 standard templates, restructure the URL paths to consolidate the previous /procedures/ and /about/blog/ hierarchies into flatter, cleaner paths, migrate 21 blog posts to the new path structure, and work down the agency’s issues backlog until the agency accepted the site. Shortly before launch, the agency relayed a client request for new procedure content across an additional set of service pages — a mid-engagement content block that arrived against a live launch date target.
We stayed off the practice’s calls and out of its inbox, kicked any ambiguity back to the agency, and left every call on content wording, menu order, and path structure with the people who owned the SEO plan.
Risk Context. A dental practice with an established blog archive and a deep service taxonomy carries SEO equity distributed across dozens of URLs. The agency’s risk in a build like this is not the homepage or the service landers — it is the 46 URL pairs where the old path and the new path differ:
/procedures/cosmetic-dentistry/veneers/becomes/cosmetic-dentistry/veneers/,/about/blog/post-slug/becomes/blog/post-slug/. Each of those pairs needs to be tracked to a resolved state before the site goes live. Let one slip through as a clerical footnote instead of a launch blocker, and the agency inherits a site where years of accrued ranking on a legacy path has silently drained away. The workbook had no dedicated redirect-tracking tab; each of the 46 URL pairs had to be verified row by row against the staging environment rather than bulk-mapped from a redirects sheet.
How We Did It
1. Five templates, 62 pages, one build pipeline. Roman Dental Arts’ pages spread across a compact, well-defined template library: Homepage, About Us (4 pages — main about, meet the doctors, meet the team, and office tour), Service Page (26 individual service pages across five care categories), Blog (21 migrated posts), and a Default Template (10 supporting pages including patient resources, testimonials, contact, and appointment request). Whatever template a sitemap row named, that is what the page was built on — none of the 62 was assembled freehand outside the library.
2. Spec followed line-for-line, within the hours we scoped. We scoped every sitemap row in hours before the build. The blog corpus at 21 posts was the load-bearing row: blog content migration and path reconciliation across the /about/blog/ → /blog/ restructure drove the dev budget for that template more than the individual post count suggests. We estimated service-page rows at lower hours per page once the template baseline was set.
Here is the logic of it: once a sitemap is scoped, that scope is what both sides sign up to. The developer’s task is to land each page within its quoted row, not to send the blog row back for re-pricing the moment the migration exposes how many posts still point at legacy paths. We chose to absorb the blog-migration complexity inside the agreed row-level hours rather than request a re-estimate, because reopening a costed sitemap mid-build would have shifted calendar pressure onto the agency’s launch window.
3. URL path reconciliation across 46 unique pairs. The sitemap carried 62 rows in the Completed state. Of those, 46 pairs had differing Current URL and New URL values — reflecting the agency’s decision to flatten the /procedures/ service hierarchy and consolidate the /about/blog/ archive. We mapped each source path to its target path, set the internal-link redirects, and verified each pair in the workbook before handoff. All 46 pairs were tracked to resolved status before the launch checklist closed.
4. Mid-engagement procedure content integrated without schedule slip. Late in the engagement, the agency relayed that new procedure content was required across additional service pages — some of which were already built and in the QA queue. The content task was opened as a standalone Redmine issue, tracked with its own hours, and integrated against the live staging environment in a parallel thread to the QA backlog. Pages that received new content were returned to the QA queue for a second pass. The launch date was preserved.
5. Issues Backlog and pre-launch review, closed before go-live. Issues were tracked in the agency’s Issues Backlog (9 rows, all Completed before launch) and the AM QA of Staging Site tab. The 29-row checklist — Design, Functionality, Content, Pre-Migration, and Post-Migration columns — was signed off before the production go-live. The pre-launch review task confirmed the site was ready for the agency’s account manager to give final sign-off before cutover.
The blog-path conflict — posts at date-slugged URLs under /about/blog/ on the source, flattening to /blog/ on the build — had no dedicated redirects tab to bulk-map from; each of the 46 pairs had to be verified against staging in the sitemap Action column before the checklist could close. That row-by-row verification was what kept the URL path equity intact at handoff.
Results
| Metric | Outcome |
|---|---|
| URLs built | 62 across 5 templates (1 Homepage · 4 About Us · 26 Service Pages · 21 Blog Posts · 10 Default Template pages) |
| Templates applied | 5 / 5 from the agency’s standard dental library |
| URL-path pairs reconciled | 46 unique pairs closed (old path → new path, tracked in sitemap Action column) |
| Issues Backlog | 9 / 9 closed as Completed |
| AM QA of Staging Site | Pre-launch review completed and signed off |
| Launch checklist | 29-row checklist signed off across Design / Functionality / Content / Pre-Migration / Post-Migration |
| Timeline | 53 days (18 Mar – 10 May 2025), delivered on schedule |
| Effort | 58h / 58h estimate — no overrun, no scope creep |
| Site status | Live on WP Engine at https://www.romansmiles.com/ — verified April 2026. |
Operational Integrity at handoff
During the pre-handoff QA pass, we found a duplicate-H1 structural defect in the “Related Procedures” block across service-page templates — the block heading was tagged as a second <h1> rather than a <div>, a template-level issue that would have affected every service page in the dental taxonomy. That pass ran through Site Checker. Our QA approach lays out the categories it walks and why a flagged defect can’t reach handoff while it’s still open. Once we’d handed over, the agency put the build through its own toolchain, logging findings into the shared backlog, and we cycled fixes against those entries until sign-off.
Process
| Phase | Duration | Outcome |
|---|---|---|
| Brief & estimation | ~1 week | Workbook reviewed, URL path pairs counted, row-level hours confirmed, 58h quoted and agreed |
| Build phase (pages + templates) | ~3 weeks | All 62 URLs built across 5 templates on staging; path redirects set; Issues Backlog opened |
| Blog migration + path reconciliation | ~2 weeks (in parallel) | 21 blog posts migrated; 46 URL-path pairs tracked to resolved; internal links updated |
| Content integration (procedure pages) | ~1 week (in parallel) | New procedure content received and integrated; affected pages returned to QA |
| Pre-launch review + checklist | Final days | 9/9 Issues Backlog closed; 29-row checklist signed off; AM reviewed and accepted |
Phases overlap — blog migration and path reconciliation ran alongside the service-page build, which is why the calendar is 53 days rather than the sum of individual phases.
Team
Delivery team
- Nikita Tumasevic — lead developer across build, blog migration, and fix phases
- Pavel Sazhin — project management and QA iterations
- Anna Polunina — developer support on service-page content integration and QA rounds
- Alexey Melkov — implementation support
- Anton Hersun, xaverPRO — project lead (estimation, agency-side communication, sign-off)
Project management and every conversation the practice could see stayed on the agency’s side of the line for the whole engagement. The doctors at Roman Dental Arts approved their pages and signed off on the launch with their agency; the developers who migrated 21 blog posts and flattened 46 URL paths stayed off every call and out of every thread the practice could see.
For agencies commissioning a white-label WordPress build
On a dental practice build, the service catalog drives more than navigation — it defines the URL architecture, the schema graph, and the rankings the agency delivers. For this practice — single-location with general and cosmetic services; for others — a multi-location DSO consolidating brand pages. The quiet risks: the URL scheme locks in too early, so a new location in month six won’t fit the pattern; service-category filter pages drop out of the index, taking organic rankings with them; schema markup gets stripped on import, and the rich results the agency audit dashboards depend on vanish.
The question to ask a dev partner before committing is not “can you build the pages?” — it is “how exactly will you structure the taxonomy and schema so the next location or procedure fits without a rebuild?”
Send us a current build workbook, a draft sitemap, or your design files. We will walk the URL plan against your ranking inventory, flag the spots where schema will fight the import, and return a fixed-hours quote. The review is free.
Don't have a spec yet? Send a one-paragraph description — we'll come back with the questions worth asking. Send a description →