← back to Dw Seo Report
Self-contained weekly GSC refresh pipeline (MCP fetch + rebuild)
917b718638e5f654a858182c73cc541bbdcb9b0c · 2026-07-20 13:32:21 -0700 · steve
Files touched
M .gitignoreA build.pyM index.htmlA refresh.sh
Diff
commit 917b718638e5f654a858182c73cc541bbdcb9b0c
Author: steve <steve@designerwallcoverings.com>
Date: Mon Jul 20 13:32:21 2026 -0700
Self-contained weekly GSC refresh pipeline (MCP fetch + rebuild)
---
.gitignore | 1 +
build.py | 138 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
index.html | 34 +--------------
refresh.sh | 32 ++++++++++++++
4 files changed, 172 insertions(+), 33 deletions(-)
diff --git a/.gitignore b/.gitignore
index 1bcdbdc..16588c1 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,3 +2,4 @@ node_modules/
.env*
*.log
.DS_Store
+data/
diff --git a/build.py b/build.py
new file mode 100644
index 0000000..5ce81b2
--- /dev/null
+++ b/build.py
@@ -0,0 +1,138 @@
+#!/usr/bin/env python3
+"""Rebuild the DW GSC report from data/*.json (fetched by refresh.sh)."""
+import json, os, datetime
+from collections import defaultdict
+
+DIR = os.path.dirname(os.path.abspath(__file__))
+def load(name):
+ with open(os.path.join(DIR, "data", name)) as f:
+ return json.load(f)["rows"]
+
+q = load("q.json")
+qp = load("qp.json")
+dt = load("date.json")
+
+# ---- Striking distance ----
+strike = []
+for r in q:
+ kw, pos, impr, clk, ctr = r["keys"][0], r["position"], r["impressions"], r["clicks"], r["ctr"]
+ if 4 <= pos <= 15 and impr >= 50:
+ opp = max(0, round(impr * (0.18 - ctr)))
+ strike.append((kw, round(pos,1), impr, clk, round(ctr*100,1), opp))
+strike.sort(key=lambda x: -x[5]); strike = strike[:40]
+
+# ---- Cannibalization ----
+byq = defaultdict(list)
+for r in qp:
+ byq[r["keys"][0]].append((r["keys"][1], r["clicks"], r["impressions"], round(r["position"],1)))
+cann = []
+for kw, pages in byq.items():
+ strong = [p for p in pages if p[2] >= 30]
+ tot = sum(p[2] for p in pages)
+ if len(strong) >= 2 and tot >= 100:
+ strong.sort(key=lambda x:-x[2])
+ cann.append((kw, tot, sum(p[1] for p in pages), strong[:4]))
+cann.sort(key=lambda x:-x[1]); cann = cann[:18]
+
+topq = sorted(q, key=lambda r:-r["clicks"])[:15]
+
+# ---- Monthly trend from daily rows ----
+mon = defaultdict(lambda:[0,0,0.0,0]) # clicks, impr, pos_sum, days
+for r in dt:
+ m = r["keys"][0][:7]
+ mon[m][0]+=r["clicks"]; mon[m][1]+=r["impressions"]; mon[m][2]+=r["position"]; mon[m][3]+=1
+months = sorted(mon.keys())
+trend=[]
+for m in months:
+ c,i,ps,d = mon[m]
+ trend.append((datetime.datetime.strptime(m,"%Y-%m").strftime("%b"), round(c/d) if d else 0, round(ps/d,1) if d else 0))
+trend = trend[-7:]
+
+# ---- static rewrites ----
+rewrites = [
+ ("Homepage /","designer wallpaper / wall coverings","weak head-term CTR at page-2 positions",
+ "Designer Wallcoverings & Luxury Wallpaper | Ralph Lauren, Versace, Lee Jofa",
+ "Shop 40+ luxury wallcovering houses — Ralph Lauren, Versace, Lee Jofa, Missoni & more. Designer wallpaper, grasscloth, velvet & custom murals. Trade pricing & samples."),
+ ("/collections/ralph-lauren-home","ralph lauren wallpaper","page-1, sub-2.5% CTR",
+ "Ralph Lauren Wallpaper & Wallcoverings — Authorized Dealer",
+ "Explore the full Ralph Lauren Home wallpaper collection — signature plaids, florals & heritage patterns. Trade pricing, order samples online."),
+ ("/collections/versace-wallpaper","versace wallpaper","page-1, ~1.4% CTR",
+ "Versace Wallpaper — Official Home Collection",
+ "Authentic Versace Home wallpaper — Baroque, Medusa & Greek-key designs. Luxury Italian wallcoverings with trade pricing & fast samples."),
+ ("/collections/lee-jofa","lee jofa","page-1, ~1.4% CTR",
+ "Lee Jofa Wallpaper & Fabric | Authorized Dealer",
+ "Browse Lee Jofa wallcoverings & fabrics — heritage prints, damasks & wovens. Trade discounts and quick samples."),
+ ("/collections/flocked-velvet-wallpaper","velvet wallpaper","~0.8% CTR, 5.8k impr",
+ "Flocked Velvet Wallpaper | Luxury Textured Wallcoverings",
+ "Rich flocked velvet wallpaper in dozens of colorways — damask, floral & geometric. Add depth & texture. Trade pricing, samples ship fast."),
+ ("Wolf-Gordon pages","wolf gordon wallcovering","~0.9% CTR at pos 6",
+ "Wolf-Gordon Wallcoverings — Contract & Commercial",
+ "Wolf-Gordon commercial wallcoverings & textiles — durable Type II vinyl for contract interiors. Request pricing & samples."),
+ ("Zuber pages","zuber wallpaper","~0.8% CTR at pos 10",
+ "Zuber Wallpaper — Hand-Blocked Scenic Panoramics",
+ "Zuber et Cie hand-block-printed scenic wallpaper & panoramics from original woodblocks. Heritage French wallcoverings, made to order."),
+]
+
+gen = datetime.datetime.now().strftime("%b %d, %Y, %I:%M %p")
+def esc(s): return str(s).replace("&","&").replace("<","<").replace(">",">")
+
+CSS = """:root{--bg:#f6f3ee;--ink:#1c1a17;--muted:#6b6459;--line:#e0d9cd;--card:#fffdf9;--accent:#8a6d3b;--good:#2e7d5b;--bad:#b4472e}*{box-sizing:border-box}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;background:var(--bg);color:var(--ink);line-height:1.5}.wrap{max-width:1120px;margin:0 auto;padding:32px 22px 80px}h1{font-family:Georgia,serif;font-weight:600;font-size:30px;margin:0 0 4px}h2{font-family:Georgia,serif;font-weight:600;font-size:20px;margin:40px 0 12px;padding-bottom:8px;border-bottom:1px solid var(--line)}.sub{color:var(--muted);font-size:13px;margin:0 0 24px}.kpis{display:grid;grid-template-columns:repeat(4,1fr);gap:12px;margin:18px 0}.kpi{background:var(--card);border:1px solid var(--line);border-radius:10px;padding:14px 16px}.kpi .n{font-size:26px;font-weight:700;font-family:Georgia,serif}.kpi .l{font-size:11px;text-transform:uppercase;letter-spacing:.7px;color:var(--muted);margin-top:2px}table{width:100%;border-collapse:collapse;background:var(--card);border:1px solid var(--line);border-radius:10px;overflow:hidden;font-size:13px}th,td{padding:8px 11px;text-align:left;border-bottom:1px solid var(--line)}th{background:#efe9df;font-size:11px;text-transform:uppercase;letter-spacing:.5px;color:var(--muted)}td.num,th.num{text-align:right;font-variant-numeric:tabular-nums}tr:last-child td{border-bottom:none}.tag{display:inline-block;font-size:11px;padding:1px 7px;border-radius:20px;background:#efe9df;color:var(--accent)}.opp{color:var(--good);font-weight:600}.warn{color:var(--bad);font-weight:600}.note{background:var(--card);border:1px solid var(--line);border-left:3px solid var(--accent);border-radius:8px;padding:12px 16px;font-size:13px;margin:12px 0}.bars{display:flex;align-items:flex-end;gap:14px;height:150px;padding:16px 8px 0;background:var(--card);border:1px solid var(--line);border-radius:10px}.bar{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:flex-end;height:100%}.bar .col{width:70%;background:linear-gradient(#b89968,#8a6d3b);border-radius:4px 4px 0 0}.bar .v{font-size:11px;font-weight:600;margin-bottom:3px}.bar .m{font-size:11px;color:var(--muted);margin-top:5px}.cann{background:var(--card);border:1px solid var(--line);border-radius:10px;padding:4px 0;margin-bottom:14px}.cann h3{font-size:14px;margin:12px 16px 2px}.cann .pg{font-size:12px;color:var(--muted);padding:3px 16px;display:flex;justify-content:space-between}.rw{background:var(--card);border:1px solid var(--line);border-radius:10px;padding:14px 16px;margin-bottom:12px}.rw .pth{font-family:ui-monospace,Menlo,monospace;font-size:12px;color:var(--accent)}.rw .meta{font-size:12px;color:var(--muted);margin:2px 0 8px}.rw .lbl{font-size:10px;text-transform:uppercase;letter-spacing:.6px;color:var(--muted);margin-top:6px}.rw .val{font-size:13px;background:var(--bg);border:1px solid var(--line);border-radius:6px;padding:6px 9px;margin-top:2px}footer{margin-top:50px;color:var(--muted);font-size:12px;text-align:center}"""
+
+h=["<!doctype html><html><head><meta charset='utf-8'><meta name='viewport' content='width=device-width,initial-scale=1'><title>DW Search Console Report</title><style>"+CSS+"</style></head><body><div class='wrap'>"]
+h.append("<h1>Designer Wallcoverings — Search Console Intelligence</h1>")
+h.append("<p class='sub'>Live Google Search Console · <b>sc-domain:designerwallcoverings.com</b> · 28-day window + 6-month trend · auto-refreshed weekly · generated "+gen+" · source: GSC (free, $0)</p>")
+
+tc=sum(r["clicks"] for r in q); ti=sum(r["impressions"] for r in q)
+ac=(tc/ti*100) if ti else 0; ap=sum(r["position"] for r in q)/len(q) if q else 0
+h.append("<div class='kpis'>")
+h.append("<div class='kpi'><div class='n'>%s</div><div class='l'>Clicks (28d, queries)</div></div>"%f"{tc:,}")
+h.append("<div class='kpi'><div class='n'>%s</div><div class='l'>Impressions (28d)</div></div>"%f"{ti:,}")
+h.append("<div class='kpi'><div class='n'>%.1f%%</div><div class='l'>Avg CTR</div></div>"%ac)
+h.append("<div class='kpi'><div class='n'>%.1f</div><div class='l'>Avg position</div></div>"%ap)
+h.append("</div>")
+
+# trend
+if len(trend)>=2:
+ first,last=trend[0][1],trend[-1][1]
+ delta = round((last-first)/first*100) if first else 0
+ word = ("down %d%%"%abs(delta)) if delta<0 else ("up %d%%"%delta)
+ cls = "warn" if delta<0 else "opp"
+ h.append("<h2>6-Month Trend</h2>")
+ h.append("<div class='note'>Avg organic clicks/day <b class='%s'>%s</b> from %s to %s (%.1f→%.1f avg position). Watch this reverse as the fixes land.</div>"%(cls,word,trend[0][0],trend[-1][0],trend[0][2],trend[-1][2]))
+ mx=max(t[1] for t in trend) or 1
+ h.append("<div class='bars'>")
+ for m,c,p in trend:
+ h.append("<div class='bar'><div class='v'>%d</div><div class='col' style='height:%d%%'></div><div class='m'>%s<br>pos %.1f</div></div>"%(c,int(c/mx*100),m,p))
+ h.append("</div><p class='sub'>Bars = avg organic clicks/day per month.</p>")
+
+h.append("<h2>Striking-Distance Keywords — fastest wins (pos 4–15)</h2>")
+h.append("<div class='note'>Page-1 but not top-3. “Est. missed clicks/mo” = impressions × (18% target CTR − current CTR). Sorted by opportunity.</div>")
+h.append("<table><tr><th>Keyword</th><th class='num'>Pos</th><th class='num'>Impr</th><th class='num'>Clicks</th><th class='num'>CTR</th><th class='num'>Missed/mo</th></tr>")
+for kw,pos,impr,clk,ctr,opp in strike:
+ h.append("<tr><td>%s</td><td class='num'>%.1f</td><td class='num'>%s</td><td class='num'>%d</td><td class='num'>%.1f%%</td><td class='num opp'>+%d</td></tr>"%(esc(kw),pos,f"{impr:,}",clk,ctr,opp))
+h.append("</table>")
+
+h.append("<h2>Cannibalization — queries split across pages</h2>")
+h.append("<div class='note'>2+ of your pages competing for the same term. Consolidate/internal-link to one canonical page each.</div>")
+for kw,tot,tclk,pages in cann:
+ h.append("<div class='cann'><h3>%s <span class='tag'>%s impr · %d clicks · %d pages</span></h3>"%(esc(kw),f"{tot:,}",tclk,len(pages)))
+ for pg,c,i,p in pages:
+ h.append("<div class='pg'><span>%s</span><span>pos %.1f · %s impr · %d clk</span></div>"%(esc(pg.replace('https://www.designerwallcoverings.com','')),p,f"{i:,}",c))
+ h.append("</div>")
+
+h.append("<h2>Top Queries by Clicks (28d)</h2>")
+h.append("<table><tr><th>Query</th><th class='num'>Clicks</th><th class='num'>Impr</th><th class='num'>CTR</th><th class='num'>Pos</th></tr>")
+for r in topq:
+ h.append("<tr><td>%s</td><td class='num'>%d</td><td class='num'>%s</td><td class='num'>%.1f%%</td><td class='num'>%.1f</td></tr>"%(esc(r["keys"][0]),r["clicks"],f'{r["impressions"]:,}',r["ctr"]*100,r["position"]))
+h.append("</table>")
+
+h.append("<h2>Drafted Title / Meta Rewrites</h2>")
+h.append("<div class='note'>Keyword-front-loaded, benefit-led SEO fields to lift CTR on low-CTR page-1 pages. Paste into each page’s SEO fields (or apply via Shopify — gated).</div>")
+for path,kw,stat,title,meta in rewrites:
+ h.append("<div class='rw'><span class='pth'>%s</span> · <span class='tag'>%s</span><div class='meta'>%s</div><div class='lbl'>Title tag</div><div class='val'>%s</div><div class='lbl'>Meta description</div><div class='val'>%s</div></div>"%(esc(path),esc(kw),esc(stat),title,meta))
+
+h.append("<footer>OpenSEO self-hosted + Google Search Console · read-only, $0 · auto-refreshed weekly · "+gen+"</footer></div></body></html>")
+
+with open(os.path.join(DIR,"index.html"),"w") as f:
+ f.write("".join(h))
+print("rebuilt index.html | strike=%d cann=%d trend=%d 28d_clicks=%d"%(len(strike),len(cann),len(trend),tc))
diff --git a/index.html b/index.html
index b66f127..b50e018 100644
--- a/index.html
+++ b/index.html
@@ -1,33 +1 @@
-<!doctype html><html><head><meta charset='utf-8'><meta name='viewport' content='width=device-width,initial-scale=1'><title>DW Search Console Report</title><style>
-:root{--bg:#f6f3ee;--ink:#1c1a17;--muted:#6b6459;--line:#e0d9cd;--card:#fffdf9;--accent:#8a6d3b;--good:#2e7d5b;--bad:#b4472e;}
-*{box-sizing:border-box}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;background:var(--bg);color:var(--ink);line-height:1.5}
-.wrap{max-width:1120px;margin:0 auto;padding:32px 22px 80px}
-h1{font-family:Georgia,'Times New Roman',serif;font-weight:600;letter-spacing:.2px;font-size:30px;margin:0 0 4px}
-h2{font-family:Georgia,serif;font-weight:600;font-size:20px;margin:40px 0 12px;padding-bottom:8px;border-bottom:1px solid var(--line)}
-.sub{color:var(--muted);font-size:13px;margin:0 0 24px}
-.kpis{display:grid;grid-template-columns:repeat(4,1fr);gap:12px;margin:18px 0}
-.kpi{background:var(--card);border:1px solid var(--line);border-radius:10px;padding:14px 16px}
-.kpi .n{font-size:26px;font-weight:700;font-family:Georgia,serif}
-.kpi .l{font-size:11px;text-transform:uppercase;letter-spacing:.7px;color:var(--muted);margin-top:2px}
-table{width:100%;border-collapse:collapse;background:var(--card);border:1px solid var(--line);border-radius:10px;overflow:hidden;font-size:13px}
-th,td{padding:8px 11px;text-align:left;border-bottom:1px solid var(--line)}
-th{background:#efe9df;font-size:11px;text-transform:uppercase;letter-spacing:.5px;color:var(--muted)}
-td.num,th.num{text-align:right;font-variant-numeric:tabular-nums}
-tr:last-child td{border-bottom:none}
-.tag{display:inline-block;font-size:11px;padding:1px 7px;border-radius:20px;background:#efe9df;color:var(--accent)}
-.opp{color:var(--good);font-weight:600}
-.warn{color:var(--bad);font-weight:600}
-.note{background:var(--card);border:1px solid var(--line);border-left:3px solid var(--accent);border-radius:8px;padding:12px 16px;font-size:13px;margin:12px 0}
-.bars{display:flex;align-items:flex-end;gap:14px;height:150px;padding:16px 8px 0;background:var(--card);border:1px solid var(--line);border-radius:10px}
-.bar{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:flex-end;height:100%}
-.bar .col{width:70%;background:linear-gradient(#b89968,#8a6d3b);border-radius:4px 4px 0 0}
-.bar .v{font-size:11px;font-weight:600;margin-bottom:3px}.bar .m{font-size:11px;color:var(--muted);margin-top:5px}
-.cann{background:var(--card);border:1px solid var(--line);border-radius:10px;padding:4px 0;margin-bottom:14px}
-.cann h3{font-size:14px;margin:12px 16px 2px}.cann .pg{font-size:12px;color:var(--muted);padding:3px 16px;display:flex;justify-content:space-between}
-.rw{background:var(--card);border:1px solid var(--line);border-radius:10px;padding:14px 16px;margin-bottom:12px}
-.rw .pth{font-family:ui-monospace,Menlo,monospace;font-size:12px;color:var(--accent)}
-.rw .meta{font-size:12px;color:var(--muted);margin:2px 0 8px}
-.rw .lbl{font-size:10px;text-transform:uppercase;letter-spacing:.6px;color:var(--muted);margin-top:6px}
-.rw .val{font-size:13px;background:var(--bg);border:1px solid var(--line);border-radius:6px;padding:6px 9px;margin-top:2px}
-footer{margin-top:50px;color:var(--muted);font-size:12px;text-align:center}
-</style></head><body><div class='wrap'><h1>Designer Wallcoverings — Search Console Intelligence</h1><p class='sub'>Live Google Search Console · <b>sc-domain:designerwallcoverings.com</b> · window 6/19–7/17/2026 (28d) · trend 1/17–7/17 (6mo) · generated Jul 20, 2026, 01:25 PM · source: GSC (free, $0)</p><div class='kpis'><div class='kpi'><div class='n'>957</div><div class='l'>Clicks (28d)</div></div><div class='kpi'><div class='n'>49,214</div><div class='l'>Impressions (28d)</div></div><div class='kpi'><div class='n'>1.9%</div><div class='l'>Avg CTR</div></div><div class='kpi'><div class='n'>14.9</div><div class='l'>Avg position</div></div></div><h2>6-Month Trend — the headline finding</h2><div class='note'><b class='warn'>Organic clicks are down ~57% since January</b> (~319/day → ~137/day) and average position has drifted from ~9.8 to ~11. The decline is steady, not a single algorithm hit — consistent with rankings slipping on the head terms the homepage depends on. This is the strategic priority.</div><div class='bars'><div class='bar'><div class='v'>319</div><div class='col' style='height:100%'></div><div class='m'>Jan*<br>pos 10.3</div></div><div class='bar'><div class='v'>318</div><div class='col' style='height:99%'></div><div class='m'>Feb<br>pos 9.8</div></div><div class='bar'><div class='v'>236</div><div class='col' style='height:73%'></div><div class='m'>Mar<br>pos 8.7</div></div><div class='bar'><div class='v'>183</div><div class='col' style='height:57%'></div><div class='m'>Apr<br>pos 8.8</div></div><div class='bar'><div class='v'>158</div><div class='col' style='height:49%'></div><div class='m'>May<br>pos 9.7</div></div><div class='bar'><div class='v'>142</div><div class='col' style='height:44%'></div><div class='m'>Jun<br>pos 10.4</div></div><div class='bar'><div class='v'>137</div><div class='col' style='height:42%'></div><div class='m'>Jul*<br>pos 11.0</div></div></div><p class='sub'>Bars = avg organic clicks/day per month. * = partial month.</p><h2>Striking-Distance Keywords — fastest wins (pos 4–15)</h2><div class='note'>Already on page 1 but not top-3. “Est. missed clicks/mo” = impressions × (18% target CTR − current CTR) — the clicks you’d capture by reaching a top-3 blended CTR. Sorted by that opportunity.</div><table><tr><th>Keyword</th><th class='num'>Pos</th><th class='num'>Impr</th><th class='num'>Clicks</th><th class='num'>CTR</th><th class='num'>Est. missed clicks/mo</th></tr><tr><td>wolf gordon</td><td class='num'>6.3</td><td class='num'>2,420</td><td class='num'>2</td><td class='num'>0.1%</td><td class='num opp'>+434</td></tr><tr><td>ralph lauren wallpaper</td><td class='num'>6.0</td><td class='num'>2,290</td><td class='num'>49</td><td class='num'>2.1%</td><td class='num opp'>+363</td></tr><tr><td>koroseal</td><td class='num'>6.3</td><td class='num'>1,897</td><td class='num'>3</td><td class='num'>0.2%</td><td class='num opp'>+338</td></tr><tr><td>versace wallpaper</td><td class='num'>8.0</td><td class='num'>1,913</td><td class='num'>27</td><td class='num'>1.4%</td><td class='num opp'>+317</td></tr><tr><td>lee jofa</td><td class='num'>5.8</td><td class='num'>1,479</td><td class='num'>20</td><td class='num'>1.4%</td><td class='num opp'>+246</td></tr><tr><td>missoni fabric</td><td class='num'>4.6</td><td class='num'>1,255</td><td class='num'>16</td><td class='num'>1.3%</td><td class='num opp'>+210</td></tr><tr><td>osborne and little</td><td class='num'>8.7</td><td class='num'>1,102</td><td class='num'>2</td><td class='num'>0.2%</td><td class='num opp'>+196</td></tr><tr><td>velvet wallpaper</td><td class='num'>7.1</td><td class='num'>1,121</td><td class='num'>22</td><td class='num'>2.0%</td><td class='num opp'>+180</td></tr><tr><td>wolf gordon wallcovering</td><td class='num'>6.4</td><td class='num'>912</td><td class='num'>8</td><td class='num'>0.9%</td><td class='num opp'>+156</td></tr><tr><td>zuber wallpaper</td><td class='num'>9.9</td><td class='num'>789</td><td class='num'>6</td><td class='num'>0.8%</td><td class='num opp'>+136</td></tr><tr><td>maya romanoff wallpaper</td><td class='num'>10.4</td><td class='num'>759</td><td class='num'>2</td><td class='num'>0.3%</td><td class='num opp'>+135</td></tr><tr><td>ralph lauren fabric</td><td class='num'>11.4</td><td class='num'>786</td><td class='num'>9</td><td class='num'>1.1%</td><td class='num opp'>+132</td></tr><tr><td>zuber</td><td class='num'>8.6</td><td class='num'>683</td><td class='num'>1</td><td class='num'>0.1%</td><td class='num opp'>+122</td></tr><tr><td>innovations wallcovering</td><td class='num'>6.3</td><td class='num'>622</td><td class='num'>2</td><td class='num'>0.3%</td><td class='num opp'>+110</td></tr><tr><td>kneedler fauchere</td><td class='num'>4.9</td><td class='num'>616</td><td class='num'>4</td><td class='num'>0.6%</td><td class='num opp'>+107</td></tr><tr><td>cork wallpaper</td><td class='num'>9.6</td><td class='num'>621</td><td class='num'>7</td><td class='num'>1.1%</td><td class='num opp'>+105</td></tr><tr><td>koroseal wallcovering</td><td class='num'>6.8</td><td class='num'>602</td><td class='num'>3</td><td class='num'>0.5%</td><td class='num opp'>+105</td></tr><tr><td>maya romanoff</td><td class='num'>8.4</td><td class='num'>561</td><td class='num'>2</td><td class='num'>0.4%</td><td class='num opp'>+99</td></tr><tr><td>gracie wallpaper</td><td class='num'>8.1</td><td class='num'>536</td><td class='num'>2</td><td class='num'>0.4%</td><td class='num opp'>+94</td></tr><tr><td>ralph lauren fabrics</td><td class='num'>7.5</td><td class='num'>521</td><td class='num'>5</td><td class='num'>1.0%</td><td class='num opp'>+89</td></tr><tr><td>alligator wallpaper</td><td class='num'>5.9</td><td class='num'>500</td><td class='num'>5</td><td class='num'>1.0%</td><td class='num opp'>+85</td></tr><tr><td>edelman leather</td><td class='num'>5.6</td><td class='num'>533</td><td class='num'>12</td><td class='num'>2.3%</td><td class='num opp'>+84</td></tr><tr><td>lee jofa wallpaper</td><td class='num'>5.7</td><td class='num'>538</td><td class='num'>16</td><td class='num'>3.0%</td><td class='num opp'>+81</td></tr><tr><td>crocodile wallpaper</td><td class='num'>9.5</td><td class='num'>435</td><td class='num'>3</td><td class='num'>0.7%</td><td class='num opp'>+75</td></tr><tr><td>flocked wallpaper</td><td class='num'>9.7</td><td class='num'>418</td><td class='num'>1</td><td class='num'>0.2%</td><td class='num opp'>+74</td></tr><tr><td>equestrian wallpaper</td><td class='num'>4.9</td><td class='num'>424</td><td class='num'>11</td><td class='num'>2.6%</td><td class='num opp'>+65</td></tr><tr><td>osborne & little</td><td class='num'>14.0</td><td class='num'>360</td><td class='num'>1</td><td class='num'>0.3%</td><td class='num opp'>+64</td></tr><tr><td>phillip jeffries wallpaper</td><td class='num'>11.3</td><td class='num'>302</td><td class='num'>3</td><td class='num'>1.0%</td><td class='num opp'>+51</td></tr><tr><td>"salt wallcovering"</td><td class='num'>5.2</td><td class='num'>283</td><td class='num'>0</td><td class='num'>0.0%</td><td class='num opp'>+51</td></tr><tr><td>missoni wallpaper</td><td class='num'>12.5</td><td class='num'>288</td><td class='num'>3</td><td class='num'>1.0%</td><td class='num opp'>+49</td></tr><tr><td>football fabric</td><td class='num'>5.0</td><td class='num'>266</td><td class='num'>1</td><td class='num'>0.4%</td><td class='num opp'>+47</td></tr><tr><td>roberto cavalli wallpaper</td><td class='num'>4.8</td><td class='num'>333</td><td class='num'>14</td><td class='num'>4.2%</td><td class='num opp'>+46</td></tr><tr><td>leejofa</td><td class='num'>5.5</td><td class='num'>245</td><td class='num'>1</td><td class='num'>0.4%</td><td class='num opp'>+43</td></tr><tr><td>basketball fabric</td><td class='num'>5.2</td><td class='num'>239</td><td class='num'>1</td><td class='num'>0.4%</td><td class='num opp'>+42</td></tr><tr><td>seabrook wallpaper</td><td class='num'>8.8</td><td class='num'>237</td><td class='num'>3</td><td class='num'>1.3%</td><td class='num opp'>+40</td></tr><tr><td>innovations wallpaper</td><td class='num'>6.0</td><td class='num'>234</td><td class='num'>3</td><td class='num'>1.3%</td><td class='num opp'>+39</td></tr><tr><td>stark wallpaper</td><td class='num'>5.2</td><td class='num'>255</td><td class='num'>8</td><td class='num'>3.1%</td><td class='num opp'>+38</td></tr><tr><td>candice olson wallpaper</td><td class='num'>8.5</td><td class='num'>228</td><td class='num'>3</td><td class='num'>1.3%</td><td class='num opp'>+38</td></tr><tr><td>ralph lauren fabric by the yard</td><td class='num'>10.5</td><td class='num'>215</td><td class='num'>4</td><td class='num'>1.9%</td><td class='num opp'>+35</td></tr><tr><td>1950s wallpaper</td><td class='num'>11.1</td><td class='num'>205</td><td class='num'>4</td><td class='num'>2.0%</td><td class='num opp'>+33</td></tr></table><h2>Cannibalization — queries split across multiple pages</h2><div class='note'>These queries have <b>2+ of your pages competing</b> for the same term, splitting authority. Consolidate/internal-link toward one canonical page per query to concentrate ranking signal.</div><div class='cann'><h3>versace wallpaper <span class='tag'>2,556 impr · 27 clicks · 2 pages</span></h3><div class='pg'><span>/collections/versace-wallpaper</span><span>pos 9.6 · 1,738 impr · 22 clk</span></div><div class='pg'><span>/products/versace-wallpaper-at-designer-wallcoverings-versace-wallpaper</span><span>pos 3.3 · 817 impr · 4 clk</span></div></div><div class='cann'><h3>wolf gordon <span class='tag'>2,414 impr · 2 clicks · 2 pages</span></h3><div class='pg'><span>/collections/wolf-gordon-wallcoverings</span><span>pos 6.0 · 1,222 impr · 1 clk</span></div><div class='pg'><span>/collections/wolf-gordon</span><span>pos 6.3 · 1,192 impr · 1 clk</span></div></div><div class='cann'><h3>ralph lauren wallpaper <span class='tag'>2,213 impr · 49 clicks · 2 pages</span></h3><div class='pg'><span>/collections/ralph-lauren-home</span><span>pos 6.8 · 2,055 impr · 48 clk</span></div><div class='pg'><span>/en-gb/collections/ralph-lauren-home</span><span>pos 8.7 · 158 impr · 1 clk</span></div></div><div class='cann'><h3>missoni fabric <span class='tag'>2,189 impr · 16 clicks · 2 pages</span></h3><div class='pg'><span>/products/missoni-fabrics-miss-13507</span><span>pos 7.4 · 1,100 impr · 1 clk</span></div><div class='pg'><span>/collections/missoni-home</span><span>pos 4.8 · 1,089 impr · 15 clk</span></div></div><div class='cann'><h3>wolf gordon wallcovering <span class='tag'>922 impr · 8 clicks · 2 pages</span></h3><div class='pg'><span>/collections/wolf-gordon-wallcoverings</span><span>pos 6.1 · 867 impr · 7 clk</span></div><div class='pg'><span>/collections/wolf-gordon</span><span>pos 20.6 · 55 impr · 1 clk</span></div></div><div class='cann'><h3>designer wallcoverings <span class='tag'>515 impr · 61 clicks · 4 pages</span></h3><div class='pg'><span>/</span><span>pos 4.9 · 207 impr · 53 clk</span></div><div class='pg'><span>/pages/contact-us-2</span><span>pos 1.0 · 173 impr · 1 clk</span></div><div class='pg'><span>http://designerwallcoverings.com/</span><span>pos 6.7 · 100 impr · 3 clk</span></div><div class='pg'><span>/en-gb</span><span>pos 1.0 · 30 impr · 2 clk</span></div></div><div class='cann'><h3>equestrian wallpaper <span class='tag'>424 impr · 11 clicks · 2 pages</span></h3><div class='pg'><span>/collections/equestrian-collection</span><span>pos 5.1 · 351 impr · 8 clk</span></div><div class='pg'><span>/en-gb/collections/equestrian-collection</span><span>pos 3.9 · 73 impr · 3 clk</span></div></div><div class='cann'><h3>"salt wallcovering" <span class='tag'>283 impr · 0 clicks · 2 pages</span></h3><div class='pg'><span>/products/ravelle-sea-salt-wallcovering-versa-designed-surfaces</span><span>pos 5.2 · 186 impr · 0 clk</span></div><div class='pg'><span>/products/natural-wood-sea-salt-artmura</span><span>pos 5.2 · 89 impr · 0 clk</span></div></div><div class='cann'><h3>dw wallpaper <span class='tag'>217 impr · 2 clicks · 2 pages</span></h3><div class='pg'><span>/pages/dw-exclusive</span><span>pos 6.5 · 136 impr · 1 clk</span></div><div class='pg'><span>/</span><span>pos 2.5 · 81 impr · 1 clk</span></div></div><div class='cann'><h3>glass bead wallpaper <span class='tag'>146 impr · 4 clicks · 2 pages</span></h3><div class='pg'><span>/products/gleaming-glambeads-cool-black-glass-bead-wallpaper</span><span>pos 3.1 · 78 impr · 2 clk</span></div><div class='pg'><span>/collections/glass-bead</span><span>pos 7.1 · 68 impr · 2 clk</span></div></div><div class='cann'><h3>50s wallpaper <span class='tag'>144 impr · 1 clicks · 2 pages</span></h3><div class='pg'><span>/collections/authentic-1950s-reproduction-vintage-wallcoverings</span><span>pos 11.7 · 104 impr · 1 clk</span></div><div class='pg'><span>/en-gb/collections/authentic-1950s-reproduction-vintage-wallcoverings</span><span>pos 20.5 · 40 impr · 0 clk</span></div></div><h2>Top Queries by Clicks (28d)</h2><table><tr><th>Query</th><th class='num'>Clicks</th><th class='num'>Impr</th><th class='num'>CTR</th><th class='num'>Pos</th></tr><tr><td>designer wallcoverings</td><td class='num'>60</td><td class='num'>227</td><td class='num'>26.4%</td><td class='num'>4.2</td></tr><tr><td>ralph lauren wallpaper</td><td class='num'>49</td><td class='num'>2,290</td><td class='num'>2.1%</td><td class='num'>6.0</td></tr><tr><td>versace wallpaper</td><td class='num'>27</td><td class='num'>1,913</td><td class='num'>1.4%</td><td class='num'>8.0</td></tr><tr><td>velvet wallpaper</td><td class='num'>22</td><td class='num'>1,121</td><td class='num'>2.0%</td><td class='num'>7.1</td></tr><tr><td>lee jofa</td><td class='num'>20</td><td class='num'>1,479</td><td class='num'>1.4%</td><td class='num'>5.8</td></tr><tr><td>lee jofa wallpaper</td><td class='num'>16</td><td class='num'>538</td><td class='num'>3.0%</td><td class='num'>5.7</td></tr><tr><td>missoni fabric</td><td class='num'>16</td><td class='num'>1,255</td><td class='num'>1.3%</td><td class='num'>4.6</td></tr><tr><td>american silk mills</td><td class='num'>14</td><td class='num'>55</td><td class='num'>25.5%</td><td class='num'>2.2</td></tr><tr><td>roberto cavalli wallpaper</td><td class='num'>14</td><td class='num'>333</td><td class='num'>4.2%</td><td class='num'>4.8</td></tr><tr><td>edelman leather</td><td class='num'>12</td><td class='num'>533</td><td class='num'>2.3%</td><td class='num'>5.6</td></tr><tr><td>equestrian wallpaper</td><td class='num'>11</td><td class='num'>424</td><td class='num'>2.6%</td><td class='num'>4.9</td></tr><tr><td>ralph lauren fabric</td><td class='num'>9</td><td class='num'>786</td><td class='num'>1.1%</td><td class='num'>11.4</td></tr><tr><td>designer wall coverings</td><td class='num'>8</td><td class='num'>59</td><td class='num'>13.6%</td><td class='num'>1.1</td></tr><tr><td>designer wallcoverings and fabrics</td><td class='num'>8</td><td class='num'>23</td><td class='num'>34.8%</td><td class='num'>1.7</td></tr><tr><td>stark wallpaper</td><td class='num'>8</td><td class='num'>255</td><td class='num'>3.1%</td><td class='num'>5.2</td></tr></table><h2>Drafted Title / Meta Rewrites — low-CTR page-1 pages</h2><div class='note'>These pages rank well but bleed clicks (CTR <2% at page-1 positions). New titles/metas below are keyword-front-loaded & benefit-led to lift CTR without needing to rank higher. Paste into each page’s SEO fields.</div><div class='rw'><span class='pth'>Homepage /</span> · <span class='tag'>designer wallpaper / wall coverings</span><div class='meta'>pos 19.6 · 31,891 impr · 0.47% CTR</div><div class='lbl'>Title tag</div><div class='val'>Designer Wallcoverings & Luxury Wallpaper | Ralph Lauren, Versace, Lee Jofa</div><div class='lbl'>Meta description</div><div class='val'>Shop 40+ luxury wallcovering houses — Ralph Lauren, Versace, Lee Jofa, Missoni & more. Designer wallpaper, grasscloth, velvet & custom murals. Trade pricing & samples.</div></div><div class='rw'><span class='pth'>/collections/ralph-lauren-home</span> · <span class='tag'>ralph lauren wallpaper</span><div class='meta'>pos 6.0 · 2,290 impr · 2.1% CTR</div><div class='lbl'>Title tag</div><div class='val'>Ralph Lauren Wallpaper & Wallcoverings — Authorized Dealer</div><div class='lbl'>Meta description</div><div class='val'>Explore the full Ralph Lauren Home wallpaper collection — signature plaids, florals & heritage patterns. Trade pricing, order samples online.</div></div><div class='rw'><span class='pth'>/collections/versace-wallpaper</span> · <span class='tag'>versace wallpaper</span><div class='meta'>pos 8.0 · 1,913 impr · 1.4% CTR</div><div class='lbl'>Title tag</div><div class='val'>Versace Wallpaper — Official Home Collection</div><div class='lbl'>Meta description</div><div class='val'>Authentic Versace Home wallpaper — Baroque, Medusa & Greek-key designs. Luxury Italian wallcoverings with trade pricing & fast samples.</div></div><div class='rw'><span class='pth'>/collections/lee-jofa</span> · <span class='tag'>lee jofa</span><div class='meta'>pos 5.8 · 1,479 impr · 1.4% CTR</div><div class='lbl'>Title tag</div><div class='val'>Lee Jofa Wallpaper & Fabric | Authorized Dealer</div><div class='lbl'>Meta description</div><div class='val'>Browse Lee Jofa wallcoverings & fabrics — heritage prints, damasks & wovens. Trade discounts and quick samples.</div></div><div class='rw'><span class='pth'>/collections/flocked-velvet-wallpaper</span> · <span class='tag'>velvet wallpaper</span><div class='meta'>pos 10.3 · 5,820 impr · 0.81% CTR</div><div class='lbl'>Title tag</div><div class='val'>Flocked Velvet Wallpaper | Luxury Textured Wallcoverings</div><div class='lbl'>Meta description</div><div class='val'>Rich flocked velvet wallpaper in dozens of colorways — damask, floral & geometric. Add depth & texture. Trade pricing, samples ship fast.</div></div><div class='rw'><span class='pth'>Wolf-Gordon pages</span> · <span class='tag'>wolf gordon wallcovering</span><div class='meta'>pos 6.4 · 912 impr · 0.88% CTR</div><div class='lbl'>Title tag</div><div class='val'>Wolf-Gordon Wallcoverings — Contract & Commercial</div><div class='lbl'>Meta description</div><div class='val'>Wolf-Gordon commercial wallcoverings & textiles — durable Type II vinyl for contract interiors. Request pricing & samples.</div></div><div class='rw'><span class='pth'>Zuber pages</span> · <span class='tag'>zuber wallpaper</span><div class='meta'>pos 9.9 · 789 impr · 0.76% CTR</div><div class='lbl'>Title tag</div><div class='val'>Zuber Wallpaper — Hand-Blocked Scenic Panoramics</div><div class='lbl'>Meta description</div><div class='val'>Zuber et Cie hand-block-printed scenic wallpaper & panoramics from original woodblocks. Heritage French wallcoverings, made to order.</div></div><footer>Designer Wallcoverings SEO intelligence · OpenSEO self-hosted + Google Search Console · read-only, $0 · Jul 20, 2026, 01:25 PM</footer></div></body></html>
\ No newline at end of file
+<!doctype html><html><head><meta charset='utf-8'><meta name='viewport' content='width=device-width,initial-scale=1'><title>DW Search Console Report</title><style>:root{--bg:#f6f3ee;--ink:#1c1a17;--muted:#6b6459;--line:#e0d9cd;--card:#fffdf9;--accent:#8a6d3b;--good:#2e7d5b;--bad:#b4472e}*{box-sizing:border-box}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Helvetica,Arial,sans-serif;background:var(--bg);color:var(--ink);line-height:1.5}.wrap{max-width:1120px;margin:0 auto;padding:32px 22px 80px}h1{font-family:Georgia,serif;font-weight:600;font-size:30px;margin:0 0 4px}h2{font-family:Georgia,serif;font-weight:600;font-size:20px;margin:40px 0 12px;padding-bottom:8px;border-bottom:1px solid var(--line)}.sub{color:var(--muted);font-size:13px;margin:0 0 24px}.kpis{display:grid;grid-template-columns:repeat(4,1fr);gap:12px;margin:18px 0}.kpi{background:var(--card);border:1px solid var(--line);border-radius:10px;padding:14px 16px}.kpi .n{font-size:26px;font-weight:700;font-family:Georgia,serif}.kpi .l{font-size:11px;text-transform:uppercase;letter-spacing:.7px;color:var(--muted);margin-top:2px}table{width:100%;border-collapse:collapse;background:var(--card);border:1px solid var(--line);border-radius:10px;overflow:hidden;font-size:13px}th,td{padding:8px 11px;text-align:left;border-bottom:1px solid var(--line)}th{background:#efe9df;font-size:11px;text-transform:uppercase;letter-spacing:.5px;color:var(--muted)}td.num,th.num{text-align:right;font-variant-numeric:tabular-nums}tr:last-child td{border-bottom:none}.tag{display:inline-block;font-size:11px;padding:1px 7px;border-radius:20px;background:#efe9df;color:var(--accent)}.opp{color:var(--good);font-weight:600}.warn{color:var(--bad);font-weight:600}.note{background:var(--card);border:1px solid var(--line);border-left:3px solid var(--accent);border-radius:8px;padding:12px 16px;font-size:13px;margin:12px 0}.bars{display:flex;align-items:flex-end;gap:14px;height:150px;padding:16px 8px 0;background:var(--card);border:1px solid var(--line);border-radius:10px}.bar{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:flex-end;height:100%}.bar .col{width:70%;background:linear-gradient(#b89968,#8a6d3b);border-radius:4px 4px 0 0}.bar .v{font-size:11px;font-weight:600;margin-bottom:3px}.bar .m{font-size:11px;color:var(--muted);margin-top:5px}.cann{background:var(--card);border:1px solid var(--line);border-radius:10px;padding:4px 0;margin-bottom:14px}.cann h3{font-size:14px;margin:12px 16px 2px}.cann .pg{font-size:12px;color:var(--muted);padding:3px 16px;display:flex;justify-content:space-between}.rw{background:var(--card);border:1px solid var(--line);border-radius:10px;padding:14px 16px;margin-bottom:12px}.rw .pth{font-family:ui-monospace,Menlo,monospace;font-size:12px;color:var(--accent)}.rw .meta{font-size:12px;color:var(--muted);margin:2px 0 8px}.rw .lbl{font-size:10px;text-transform:uppercase;letter-spacing:.6px;color:var(--muted);margin-top:6px}.rw .val{font-size:13px;background:var(--bg);border:1px solid var(--line);border-radius:6px;padding:6px 9px;margin-top:2px}footer{margin-top:50px;color:var(--muted);font-size:12px;text-align:center}</style></head><body><div class='wrap'><h1>Designer Wallcoverings — Search Console Intelligence</h1><p class='sub'>Live Google Search Console · <b>sc-domain:designerwallcoverings.com</b> · 28-day window + 6-month trend · auto-refreshed weekly · generated Jul 20, 2026, 01:31 PM · source: GSC (free, $0)</p><div class='kpis'><div class='kpi'><div class='n'>957</div><div class='l'>Clicks (28d, queries)</div></div><div class='kpi'><div class='n'>49,214</div><div class='l'>Impressions (28d)</div></div><div class='kpi'><div class='n'>1.9%</div><div class='l'>Avg CTR</div></div><div class='kpi'><div class='n'>14.9</div><div class='l'>Avg position</div></div></div><h2>6-Month Trend</h2><div class='note'>Avg organic clicks/day <b class='warn'>down 57%</b> from Jan to Jul (10.4→11.0 avg position). Watch this reverse as the fixes land.</div><div class='bars'><div class='bar'><div class='v'>319</div><div class='col' style='height:100%'></div><div class='m'>Jan<br>pos 10.4</div></div><div class='bar'><div class='v'>318</div><div class='col' style='height:99%'></div><div class='m'>Feb<br>pos 9.7</div></div><div class='bar'><div class='v'>236</div><div class='col' style='height:73%'></div><div class='m'>Mar<br>pos 8.8</div></div><div class='bar'><div class='v'>183</div><div class='col' style='height:57%'></div><div class='m'>Apr<br>pos 8.8</div></div><div class='bar'><div class='v'>158</div><div class='col' style='height:49%'></div><div class='m'>May<br>pos 9.9</div></div><div class='bar'><div class='v'>142</div><div class='col' style='height:44%'></div><div class='m'>Jun<br>pos 10.3</div></div><div class='bar'><div class='v'>137</div><div class='col' style='height:42%'></div><div class='m'>Jul<br>pos 11.0</div></div></div><p class='sub'>Bars = avg organic clicks/day per month.</p><h2>Striking-Distance Keywords — fastest wins (pos 4–15)</h2><div class='note'>Page-1 but not top-3. “Est. missed clicks/mo” = impressions × (18% target CTR − current CTR). Sorted by opportunity.</div><table><tr><th>Keyword</th><th class='num'>Pos</th><th class='num'>Impr</th><th class='num'>Clicks</th><th class='num'>CTR</th><th class='num'>Missed/mo</th></tr><tr><td>wolf gordon</td><td class='num'>6.3</td><td class='num'>2,420</td><td class='num'>2</td><td class='num'>0.1%</td><td class='num opp'>+434</td></tr><tr><td>ralph lauren wallpaper</td><td class='num'>6.0</td><td class='num'>2,290</td><td class='num'>49</td><td class='num'>2.1%</td><td class='num opp'>+363</td></tr><tr><td>koroseal</td><td class='num'>6.3</td><td class='num'>1,897</td><td class='num'>3</td><td class='num'>0.2%</td><td class='num opp'>+338</td></tr><tr><td>versace wallpaper</td><td class='num'>8.0</td><td class='num'>1,913</td><td class='num'>27</td><td class='num'>1.4%</td><td class='num opp'>+317</td></tr><tr><td>lee jofa</td><td class='num'>5.8</td><td class='num'>1,479</td><td class='num'>20</td><td class='num'>1.4%</td><td class='num opp'>+246</td></tr><tr><td>missoni fabric</td><td class='num'>4.6</td><td class='num'>1,255</td><td class='num'>16</td><td class='num'>1.3%</td><td class='num opp'>+210</td></tr><tr><td>osborne and little</td><td class='num'>8.7</td><td class='num'>1,102</td><td class='num'>2</td><td class='num'>0.2%</td><td class='num opp'>+196</td></tr><tr><td>velvet wallpaper</td><td class='num'>7.1</td><td class='num'>1,121</td><td class='num'>22</td><td class='num'>2.0%</td><td class='num opp'>+180</td></tr><tr><td>wolf gordon wallcovering</td><td class='num'>6.4</td><td class='num'>912</td><td class='num'>8</td><td class='num'>0.9%</td><td class='num opp'>+156</td></tr><tr><td>zuber wallpaper</td><td class='num'>9.9</td><td class='num'>789</td><td class='num'>6</td><td class='num'>0.8%</td><td class='num opp'>+136</td></tr><tr><td>maya romanoff wallpaper</td><td class='num'>10.4</td><td class='num'>759</td><td class='num'>2</td><td class='num'>0.3%</td><td class='num opp'>+135</td></tr><tr><td>ralph lauren fabric</td><td class='num'>11.4</td><td class='num'>786</td><td class='num'>9</td><td class='num'>1.1%</td><td class='num opp'>+132</td></tr><tr><td>zuber</td><td class='num'>8.6</td><td class='num'>683</td><td class='num'>1</td><td class='num'>0.1%</td><td class='num opp'>+122</td></tr><tr><td>innovations wallcovering</td><td class='num'>6.3</td><td class='num'>622</td><td class='num'>2</td><td class='num'>0.3%</td><td class='num opp'>+110</td></tr><tr><td>kneedler fauchere</td><td class='num'>4.9</td><td class='num'>616</td><td class='num'>4</td><td class='num'>0.6%</td><td class='num opp'>+107</td></tr><tr><td>cork wallpaper</td><td class='num'>9.6</td><td class='num'>621</td><td class='num'>7</td><td class='num'>1.1%</td><td class='num opp'>+105</td></tr><tr><td>koroseal wallcovering</td><td class='num'>6.8</td><td class='num'>602</td><td class='num'>3</td><td class='num'>0.5%</td><td class='num opp'>+105</td></tr><tr><td>maya romanoff</td><td class='num'>8.4</td><td class='num'>561</td><td class='num'>2</td><td class='num'>0.4%</td><td class='num opp'>+99</td></tr><tr><td>gracie wallpaper</td><td class='num'>8.1</td><td class='num'>536</td><td class='num'>2</td><td class='num'>0.4%</td><td class='num opp'>+94</td></tr><tr><td>ralph lauren fabrics</td><td class='num'>7.5</td><td class='num'>521</td><td class='num'>5</td><td class='num'>1.0%</td><td class='num opp'>+89</td></tr><tr><td>alligator wallpaper</td><td class='num'>5.9</td><td class='num'>500</td><td class='num'>5</td><td class='num'>1.0%</td><td class='num opp'>+85</td></tr><tr><td>edelman leather</td><td class='num'>5.6</td><td class='num'>533</td><td class='num'>12</td><td class='num'>2.3%</td><td class='num opp'>+84</td></tr><tr><td>lee jofa wallpaper</td><td class='num'>5.7</td><td class='num'>538</td><td class='num'>16</td><td class='num'>3.0%</td><td class='num opp'>+81</td></tr><tr><td>crocodile wallpaper</td><td class='num'>9.5</td><td class='num'>435</td><td class='num'>3</td><td class='num'>0.7%</td><td class='num opp'>+75</td></tr><tr><td>flocked wallpaper</td><td class='num'>9.7</td><td class='num'>418</td><td class='num'>1</td><td class='num'>0.2%</td><td class='num opp'>+74</td></tr><tr><td>equestrian wallpaper</td><td class='num'>4.9</td><td class='num'>424</td><td class='num'>11</td><td class='num'>2.6%</td><td class='num opp'>+65</td></tr><tr><td>osborne & little</td><td class='num'>14.0</td><td class='num'>360</td><td class='num'>1</td><td class='num'>0.3%</td><td class='num opp'>+64</td></tr><tr><td>phillip jeffries wallpaper</td><td class='num'>11.3</td><td class='num'>302</td><td class='num'>3</td><td class='num'>1.0%</td><td class='num opp'>+51</td></tr><tr><td>"salt wallcovering"</td><td class='num'>5.2</td><td class='num'>283</td><td class='num'>0</td><td class='num'>0.0%</td><td class='num opp'>+51</td></tr><tr><td>missoni wallpaper</td><td class='num'>12.5</td><td class='num'>288</td><td class='num'>3</td><td class='num'>1.0%</td><td class='num opp'>+49</td></tr><tr><td>football fabric</td><td class='num'>5.0</td><td class='num'>266</td><td class='num'>1</td><td class='num'>0.4%</td><td class='num opp'>+47</td></tr><tr><td>roberto cavalli wallpaper</td><td class='num'>4.8</td><td class='num'>333</td><td class='num'>14</td><td class='num'>4.2%</td><td class='num opp'>+46</td></tr><tr><td>leejofa</td><td class='num'>5.5</td><td class='num'>245</td><td class='num'>1</td><td class='num'>0.4%</td><td class='num opp'>+43</td></tr><tr><td>basketball fabric</td><td class='num'>5.2</td><td class='num'>239</td><td class='num'>1</td><td class='num'>0.4%</td><td class='num opp'>+42</td></tr><tr><td>seabrook wallpaper</td><td class='num'>8.8</td><td class='num'>237</td><td class='num'>3</td><td class='num'>1.3%</td><td class='num opp'>+40</td></tr><tr><td>innovations wallpaper</td><td class='num'>6.0</td><td class='num'>234</td><td class='num'>3</td><td class='num'>1.3%</td><td class='num opp'>+39</td></tr><tr><td>stark wallpaper</td><td class='num'>5.2</td><td class='num'>255</td><td class='num'>8</td><td class='num'>3.1%</td><td class='num opp'>+38</td></tr><tr><td>candice olson wallpaper</td><td class='num'>8.5</td><td class='num'>228</td><td class='num'>3</td><td class='num'>1.3%</td><td class='num opp'>+38</td></tr><tr><td>ralph lauren fabric by the yard</td><td class='num'>10.5</td><td class='num'>215</td><td class='num'>4</td><td class='num'>1.9%</td><td class='num opp'>+35</td></tr><tr><td>1950s wallpaper</td><td class='num'>11.1</td><td class='num'>205</td><td class='num'>4</td><td class='num'>2.0%</td><td class='num opp'>+33</td></tr></table><h2>Cannibalization — queries split across pages</h2><div class='note'>2+ of your pages competing for the same term. Consolidate/internal-link to one canonical page each.</div><div class='cann'><h3>versace wallpaper <span class='tag'>2,556 impr · 27 clicks · 2 pages</span></h3><div class='pg'><span>/collections/versace-wallpaper</span><span>pos 9.6 · 1,738 impr · 22 clk</span></div><div class='pg'><span>/products/versace-wallpaper-at-designer-wallcoverings-versace-wallpaper</span><span>pos 3.3 · 817 impr · 4 clk</span></div></div><div class='cann'><h3>wolf gordon <span class='tag'>2,414 impr · 2 clicks · 2 pages</span></h3><div class='pg'><span>/collections/wolf-gordon-wallcoverings</span><span>pos 6.0 · 1,222 impr · 1 clk</span></div><div class='pg'><span>/collections/wolf-gordon</span><span>pos 6.3 · 1,192 impr · 1 clk</span></div></div><div class='cann'><h3>ralph lauren wallpaper <span class='tag'>2,213 impr · 49 clicks · 2 pages</span></h3><div class='pg'><span>/collections/ralph-lauren-home</span><span>pos 6.8 · 2,055 impr · 48 clk</span></div><div class='pg'><span>/en-gb/collections/ralph-lauren-home</span><span>pos 8.7 · 158 impr · 1 clk</span></div></div><div class='cann'><h3>missoni fabric <span class='tag'>2,189 impr · 16 clicks · 2 pages</span></h3><div class='pg'><span>/products/missoni-fabrics-miss-13507</span><span>pos 7.4 · 1,100 impr · 1 clk</span></div><div class='pg'><span>/collections/missoni-home</span><span>pos 4.8 · 1,089 impr · 15 clk</span></div></div><div class='cann'><h3>wolf gordon wallcovering <span class='tag'>922 impr · 8 clicks · 2 pages</span></h3><div class='pg'><span>/collections/wolf-gordon-wallcoverings</span><span>pos 6.1 · 867 impr · 7 clk</span></div><div class='pg'><span>/collections/wolf-gordon</span><span>pos 20.6 · 55 impr · 1 clk</span></div></div><div class='cann'><h3>designer wallcoverings <span class='tag'>515 impr · 61 clicks · 4 pages</span></h3><div class='pg'><span>/</span><span>pos 4.9 · 207 impr · 53 clk</span></div><div class='pg'><span>/pages/contact-us-2</span><span>pos 1.0 · 173 impr · 1 clk</span></div><div class='pg'><span>http://designerwallcoverings.com/</span><span>pos 6.7 · 100 impr · 3 clk</span></div><div class='pg'><span>/en-gb</span><span>pos 1.0 · 30 impr · 2 clk</span></div></div><div class='cann'><h3>equestrian wallpaper <span class='tag'>424 impr · 11 clicks · 2 pages</span></h3><div class='pg'><span>/collections/equestrian-collection</span><span>pos 5.1 · 351 impr · 8 clk</span></div><div class='pg'><span>/en-gb/collections/equestrian-collection</span><span>pos 3.9 · 73 impr · 3 clk</span></div></div><div class='cann'><h3>"salt wallcovering" <span class='tag'>283 impr · 0 clicks · 2 pages</span></h3><div class='pg'><span>/products/ravelle-sea-salt-wallcovering-versa-designed-surfaces</span><span>pos 5.2 · 186 impr · 0 clk</span></div><div class='pg'><span>/products/natural-wood-sea-salt-artmura</span><span>pos 5.2 · 89 impr · 0 clk</span></div></div><div class='cann'><h3>dw wallpaper <span class='tag'>217 impr · 2 clicks · 2 pages</span></h3><div class='pg'><span>/pages/dw-exclusive</span><span>pos 6.5 · 136 impr · 1 clk</span></div><div class='pg'><span>/</span><span>pos 2.5 · 81 impr · 1 clk</span></div></div><div class='cann'><h3>glass bead wallpaper <span class='tag'>146 impr · 4 clicks · 2 pages</span></h3><div class='pg'><span>/products/gleaming-glambeads-cool-black-glass-bead-wallpaper</span><span>pos 3.1 · 78 impr · 2 clk</span></div><div class='pg'><span>/collections/glass-bead</span><span>pos 7.1 · 68 impr · 2 clk</span></div></div><div class='cann'><h3>50s wallpaper <span class='tag'>144 impr · 1 clicks · 2 pages</span></h3><div class='pg'><span>/collections/authentic-1950s-reproduction-vintage-wallcoverings</span><span>pos 11.7 · 104 impr · 1 clk</span></div><div class='pg'><span>/en-gb/collections/authentic-1950s-reproduction-vintage-wallcoverings</span><span>pos 20.5 · 40 impr · 0 clk</span></div></div><h2>Top Queries by Clicks (28d)</h2><table><tr><th>Query</th><th class='num'>Clicks</th><th class='num'>Impr</th><th class='num'>CTR</th><th class='num'>Pos</th></tr><tr><td>designer wallcoverings</td><td class='num'>60</td><td class='num'>227</td><td class='num'>26.4%</td><td class='num'>4.2</td></tr><tr><td>ralph lauren wallpaper</td><td class='num'>49</td><td class='num'>2,290</td><td class='num'>2.1%</td><td class='num'>6.0</td></tr><tr><td>versace wallpaper</td><td class='num'>27</td><td class='num'>1,913</td><td class='num'>1.4%</td><td class='num'>8.0</td></tr><tr><td>velvet wallpaper</td><td class='num'>22</td><td class='num'>1,121</td><td class='num'>2.0%</td><td class='num'>7.1</td></tr><tr><td>lee jofa</td><td class='num'>20</td><td class='num'>1,479</td><td class='num'>1.4%</td><td class='num'>5.8</td></tr><tr><td>lee jofa wallpaper</td><td class='num'>16</td><td class='num'>538</td><td class='num'>3.0%</td><td class='num'>5.7</td></tr><tr><td>missoni fabric</td><td class='num'>16</td><td class='num'>1,255</td><td class='num'>1.3%</td><td class='num'>4.6</td></tr><tr><td>american silk mills</td><td class='num'>14</td><td class='num'>55</td><td class='num'>25.5%</td><td class='num'>2.2</td></tr><tr><td>roberto cavalli wallpaper</td><td class='num'>14</td><td class='num'>333</td><td class='num'>4.2%</td><td class='num'>4.8</td></tr><tr><td>edelman leather</td><td class='num'>12</td><td class='num'>533</td><td class='num'>2.3%</td><td class='num'>5.6</td></tr><tr><td>equestrian wallpaper</td><td class='num'>11</td><td class='num'>424</td><td class='num'>2.6%</td><td class='num'>4.9</td></tr><tr><td>ralph lauren fabric</td><td class='num'>9</td><td class='num'>786</td><td class='num'>1.1%</td><td class='num'>11.4</td></tr><tr><td>designer wall coverings</td><td class='num'>8</td><td class='num'>59</td><td class='num'>13.6%</td><td class='num'>1.1</td></tr><tr><td>designer wallcoverings and fabrics</td><td class='num'>8</td><td class='num'>23</td><td class='num'>34.8%</td><td class='num'>1.7</td></tr><tr><td>stark wallpaper</td><td class='num'>8</td><td class='num'>255</td><td class='num'>3.1%</td><td class='num'>5.2</td></tr></table><h2>Drafted Title / Meta Rewrites</h2><div class='note'>Keyword-front-loaded, benefit-led SEO fields to lift CTR on low-CTR page-1 pages. Paste into each page’s SEO fields (or apply via Shopify — gated).</div><div class='rw'><span class='pth'>Homepage /</span> · <span class='tag'>designer wallpaper / wall coverings</span><div class='meta'>weak head-term CTR at page-2 positions</div><div class='lbl'>Title tag</div><div class='val'>Designer Wallcoverings & Luxury Wallpaper | Ralph Lauren, Versace, Lee Jofa</div><div class='lbl'>Meta description</div><div class='val'>Shop 40+ luxury wallcovering houses — Ralph Lauren, Versace, Lee Jofa, Missoni & more. Designer wallpaper, grasscloth, velvet & custom murals. Trade pricing & samples.</div></div><div class='rw'><span class='pth'>/collections/ralph-lauren-home</span> · <span class='tag'>ralph lauren wallpaper</span><div class='meta'>page-1, sub-2.5% CTR</div><div class='lbl'>Title tag</div><div class='val'>Ralph Lauren Wallpaper & Wallcoverings — Authorized Dealer</div><div class='lbl'>Meta description</div><div class='val'>Explore the full Ralph Lauren Home wallpaper collection — signature plaids, florals & heritage patterns. Trade pricing, order samples online.</div></div><div class='rw'><span class='pth'>/collections/versace-wallpaper</span> · <span class='tag'>versace wallpaper</span><div class='meta'>page-1, ~1.4% CTR</div><div class='lbl'>Title tag</div><div class='val'>Versace Wallpaper — Official Home Collection</div><div class='lbl'>Meta description</div><div class='val'>Authentic Versace Home wallpaper — Baroque, Medusa & Greek-key designs. Luxury Italian wallcoverings with trade pricing & fast samples.</div></div><div class='rw'><span class='pth'>/collections/lee-jofa</span> · <span class='tag'>lee jofa</span><div class='meta'>page-1, ~1.4% CTR</div><div class='lbl'>Title tag</div><div class='val'>Lee Jofa Wallpaper & Fabric | Authorized Dealer</div><div class='lbl'>Meta description</div><div class='val'>Browse Lee Jofa wallcoverings & fabrics — heritage prints, damasks & wovens. Trade discounts and quick samples.</div></div><div class='rw'><span class='pth'>/collections/flocked-velvet-wallpaper</span> · <span class='tag'>velvet wallpaper</span><div class='meta'>~0.8% CTR, 5.8k impr</div><div class='lbl'>Title tag</div><div class='val'>Flocked Velvet Wallpaper | Luxury Textured Wallcoverings</div><div class='lbl'>Meta description</div><div class='val'>Rich flocked velvet wallpaper in dozens of colorways — damask, floral & geometric. Add depth & texture. Trade pricing, samples ship fast.</div></div><div class='rw'><span class='pth'>Wolf-Gordon pages</span> · <span class='tag'>wolf gordon wallcovering</span><div class='meta'>~0.9% CTR at pos 6</div><div class='lbl'>Title tag</div><div class='val'>Wolf-Gordon Wallcoverings — Contract & Commercial</div><div class='lbl'>Meta description</div><div class='val'>Wolf-Gordon commercial wallcoverings & textiles — durable Type II vinyl for contract interiors. Request pricing & samples.</div></div><div class='rw'><span class='pth'>Zuber pages</span> · <span class='tag'>zuber wallpaper</span><div class='meta'>~0.8% CTR at pos 10</div><div class='lbl'>Title tag</div><div class='val'>Zuber Wallpaper — Hand-Blocked Scenic Panoramics</div><div class='lbl'>Meta description</div><div class='val'>Zuber et Cie hand-block-printed scenic wallpaper & panoramics from original woodblocks. Heritage French wallcoverings, made to order.</div></div><footer>OpenSEO self-hosted + Google Search Console · read-only, $0 · auto-refreshed weekly · Jul 20, 2026, 01:31 PM</footer></div></body></html>
\ No newline at end of file
diff --git a/refresh.sh b/refresh.sh
new file mode 100755
index 0000000..da2114b
--- /dev/null
+++ b/refresh.sh
@@ -0,0 +1,32 @@
+#!/bin/bash
+# Pull fresh GSC data from the local OpenSEO MCP endpoint and rebuild the report.
+# Self-contained: depends only on the running OpenSEO server at :3001 + python3 + jq.
+set -e
+DIR="$HOME/Projects/dw-seo-report"
+PROJ="20a5b2e9-ea7b-4645-964a-46f04c9992e7"
+MCP="http://localhost:3001/mcp"
+mkdir -p "$DIR/data"
+LOG="$DIR/refresh.log"
+ts() { date "+%Y-%m-%d %H:%M:%S"; }
+
+call() { # $1=arguments-json $2=outfile
+ curl -s -X POST "$MCP" \
+ -H 'Content-Type: application/json' \
+ -H 'Accept: application/json, text/event-stream' \
+ -d "{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"tools/call\",\"params\":{\"name\":\"get_search_console_performance\",\"arguments\":$1}}" \
+ | sed 's/^data: //' | jq -c 'if .result then .result.structuredContent else . end' > "$2"
+}
+
+echo "[$(ts)] refresh start" >> "$LOG"
+call "{\"projectId\":\"$PROJ\",\"dimensions\":[\"query\"],\"dateRange\":\"last_28_days\",\"rowLimit\":1000}" "$DIR/data/q.json"
+call "{\"projectId\":\"$PROJ\",\"dimensions\":[\"query\",\"page\"],\"dateRange\":\"last_28_days\",\"rowLimit\":1000}" "$DIR/data/qp.json"
+call "{\"projectId\":\"$PROJ\",\"dimensions\":[\"date\"],\"dateRange\":\"last_6_months\",\"rowLimit\":200}" "$DIR/data/date.json"
+
+# sanity: all three must have rows
+for f in q qp date; do
+ n=$(jq '.rows|length' "$DIR/data/$f.json" 2>/dev/null || echo 0)
+ if [ "${n:-0}" -lt 1 ]; then echo "[$(ts)] ABORT: $f.json empty (GSC/server down?)" >> "$LOG"; exit 1; fi
+done
+
+python3 "$DIR/build.py" >> "$LOG" 2>&1
+echo "[$(ts)] refresh done" >> "$LOG"
← 74a99ff DW Search Console intelligence report (GSC + DataForSEO)
·
back to Dw Seo Report
·
Weekly George email of report (send_report.py + refresh.sh - e236ac6 →