<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Aimiten</title>
    <description>The latest articles on DEV Community by Aimiten (@aimiten).</description>
    <link>https://dev.to/aimiten</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3564405%2F885e284a-ca65-47f2-9ac5-71eb37fe871a.png</url>
      <title>DEV Community: Aimiten</title>
      <link>https://dev.to/aimiten</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/aimiten"/>
    <language>en</language>
    <item>
      <title>52 Clicks in 28 Days. One Page Has a 26% CTR. I Can't See What It Ranks For.</title>
      <dc:creator>Aimiten</dc:creator>
      <pubDate>Sun, 10 May 2026 07:20:07 +0000</pubDate>
      <link>https://dev.to/aimiten/52-clicks-in-28-days-one-page-has-a-26-ctr-i-cant-see-what-it-ranks-for-2k01</link>
      <guid>https://dev.to/aimiten/52-clicks-in-28-days-one-page-has-a-26-ctr-i-cant-see-what-it-ranks-for-2k01</guid>
      <description>&lt;p&gt;52 clicks in 28 days. That's 1.79 per day — and compared to the Week 1 baseline of 45 clicks in 90 days (0.5 per day), it's a genuine 3.5x improvement. I'll take it.&lt;/p&gt;

&lt;p&gt;But as soon as I started drilling into which pages moved and why, the clean narrative fell apart. The best-performing page has a 26% CTR driven by queries I can't see. The commitments I made in Week 5 — reorder the automation queue, fix the og:title bug — didn't happen. And the biggest English-language search market in the world is showing us 6,967 impressions per month and handing back 3 clicks.&lt;/p&gt;

&lt;p&gt;The click rate tripled. The story is messier than that.&lt;/p&gt;

&lt;h2&gt;
  
  
  The setup
&lt;/h2&gt;

&lt;p&gt;The automation has been running every day since early April — one calculator page per night, verified benchmarks added, worked examples, internal links. 40+ pages improved over 90 days. Week 5's post identified that 8 of those pages weren't even getting impressions from Google, and committed to four things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Reorder the queue by impressions — hourly rate calculator first (880 impressions at the time)&lt;/li&gt;
&lt;li&gt;Use the WACC calculator as a two-week control for whether on-page changes move positions&lt;/li&gt;
&lt;li&gt;Watch the ROI calculator for position recovery&lt;/li&gt;
&lt;li&gt;Fix the duplicate og:title tags on every page — treated as a build blocker&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Here's what the 28-day GSC data shows.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I expected vs. what the data showed
&lt;/h2&gt;

&lt;p&gt;I expected the pages the automation touched in early April to start showing movement. And I expected the four action items from Week 5 to have been executed.&lt;/p&gt;

&lt;p&gt;What happened:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Expected&lt;/th&gt;
&lt;th&gt;Actual&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Early-April pages (PE ratio, Funding, Cap Table)&lt;/td&gt;
&lt;td&gt;Some position gain after 4-6 week crawl lag&lt;/td&gt;
&lt;td&gt;PE ratio: 29 → 18.7. Funding: position 11.5, 2 clicks. Cap Table: position 9.5, 1 click.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Recent improvements (CPM, CTR, ROAS, CPA, EBITDA)&lt;/td&gt;
&lt;td&gt;Still too early&lt;/td&gt;
&lt;td&gt;Confirmed buried at position 60-90&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Queue reordered to hourly rate first&lt;/td&gt;
&lt;td&gt;Done&lt;/td&gt;
&lt;td&gt;Automation ran CPM, CTR, ROAS, CPA, EBITDA, AdSpend, ConversionRate instead&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;og:title bug fixed&lt;/td&gt;
&lt;td&gt;Done&lt;/td&gt;
&lt;td&gt;Still 2 og:title tags on every page (curled and confirmed)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Two of four action items sat idle for another week. The automation kept running the queue it had.&lt;/p&gt;

&lt;h2&gt;
  
  
  Finding #1: The best-performing page is hiding its traffic from me
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://valuefy.app/tools/business-plan-generator/" rel="noopener noreferrer"&gt;business plan generator&lt;/a&gt; showed up in the 28-day data with &lt;strong&gt;5 clicks, 19 impressions, 26.32% CTR, position 12.2.&lt;/strong&gt; A 26% CTR would be extraordinary for any page. At position 12 — the top of page 2 — it's essentially impossible under normal distributions.&lt;/p&gt;

&lt;p&gt;So I pulled the query-level breakdown. Here's what GSC returned:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Query&lt;/th&gt;
&lt;th&gt;Clicks&lt;/th&gt;
&lt;th&gt;Impressions&lt;/th&gt;
&lt;th&gt;Position&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;business plan generator&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;97.0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;That's it. One query, two impressions, position 97, zero clicks. The remaining 17 impressions and 5 clicks are below GSC's privacy threshold — queries with fewer than 16 impressions that don't show up in the breakdown at all.&lt;/p&gt;

&lt;p&gt;The 26% CTR isn't what it sounds like. There isn't a single query where one in four searchers clicks our result. What it means is: this page ranks high (probably top 3) for some specific queries that I can't identify, those high-position queries generate clicks, and meanwhile a cloud of long-tail queries at position 50-97 pulls the aggregate position down to 12.2. The aggregate math hides a bimodal distribution. Again.&lt;/p&gt;

&lt;p&gt;The week 1 post had the loan-payment calculator sitting at "position 9.8" that turned out to be a fiction. This is the same trap from the other side — a "26% CTR" that's actually a few invisible top-3 rankings averaged with a long tail of zeros.&lt;/p&gt;

&lt;p&gt;The page is working. I just can't see for what. The title Google is using:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;AI Business Plan Generator — 7 Sections | Valuefy
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The live H1: "Free AI Business Plan Generator — 7 Sections, Instant Output." Those seven-sections hooks are probably matching something specific in the query tail. I won't know until the queries break above the threshold.&lt;/p&gt;

&lt;h2&gt;
  
  
  Finding #2: PE ratio shows improvements work — on a 5-6 week delay
&lt;/h2&gt;

&lt;p&gt;The PE ratio calculator was last improved on &lt;strong&gt;April 2&lt;/strong&gt; — 38 days ago. No automation has touched it since. The 7-day GSC position: &lt;strong&gt;18.7&lt;/strong&gt;. The 28-day average: &lt;strong&gt;21.1&lt;/strong&gt;. Week 1 baseline: roughly position 29 across the 90-day window.&lt;/p&gt;

&lt;p&gt;That's a genuine ~10 position gain. From the back of page 3 to the front of page 2. With 4 clicks and 517 impressions in the 28-day window, it's the second-highest click earner among tool pages.&lt;/p&gt;

&lt;p&gt;The query that moved:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Query&lt;/th&gt;
&lt;th&gt;Impressions&lt;/th&gt;
&lt;th&gt;Position&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;pe ratio calculator&lt;/td&gt;
&lt;td&gt;32&lt;/td&gt;
&lt;td&gt;25.2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;forward pe calculator&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;18.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;p/e ratio calculator&lt;/td&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;35.2&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The "forward pe calculator" query landing at position 18 is why the 7-day average looks better than the 28-day average — it's a low-impression query that happens to be ranking well right now, and it's skewing the recent average toward a better number than the distribution actually represents.&lt;/p&gt;

&lt;p&gt;But the directional trend is real: position moved from ~29 to ~21 over 38 days after a single improvement commit. No follow-up automation. No link building. Just on-page content changes — and then 5-6 weeks of waiting.&lt;/p&gt;

&lt;p&gt;The implication for everything else in the queue: CPM, CTR, ROAS, CPA, EBITDA — improved in early May — shouldn't show anything visible until mid-June. We're flying blind on last week's work for another month.&lt;/p&gt;

&lt;h2&gt;
  
  
  Finding #3: The US is our biggest impression market and worst converter
&lt;/h2&gt;

&lt;p&gt;Country-level 28-day data, sorted by impressions:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Country&lt;/th&gt;
&lt;th&gt;Clicks&lt;/th&gt;
&lt;th&gt;Impressions&lt;/th&gt;
&lt;th&gt;Avg Position&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;United States&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;6,967&lt;/td&gt;
&lt;td&gt;45.6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;India&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;734&lt;/td&gt;
&lt;td&gt;17.4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Canada&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;441&lt;/td&gt;
&lt;td&gt;53.6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Indonesia&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;166&lt;/td&gt;
&lt;td&gt;13.5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pakistan&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;156&lt;/td&gt;
&lt;td&gt;21.7&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The US has 9.5x India's impressions and 3x fewer clicks. At position 45.6 average, we're buried on page 4-5 for US searches — deep enough that even 7,000 impressions converts to almost nothing. India's 17.4 average position is page 2, and at that depth the clicks start coming.&lt;/p&gt;

&lt;p&gt;This isn't a geo-targeting problem. It's an authority problem expressed geographically. The US markets we're showing up in (finance, SaaS, business calculators) are the most competitive on Earth. We get impressions because the search volumes are so large that even position 45 accumulates visibility. We don't get clicks because nobody scrolls to page 5.&lt;/p&gt;

&lt;p&gt;The 3 US clicks in 28 days did come from somewhere — the query data doesn't show which — but at $0 in ad spend and domain authority barely above zero, 3 is what page 4-5 looks like in English at scale.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I'm going to do about it
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Actually run the hourly rate calculator next&lt;/strong&gt; — it was first on the Week 5 priority list and still hasn't been touched. This needs a manual queue intervention, not an assumption that the automation will self-correct.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Don't interpret ROAS, CTR, CPM, or EBITDA results before mid-June&lt;/strong&gt; — the PE ratio example shows the lag is real. Mark the calendar and check those pages on June 15th.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Try to surface the business plan generator queries&lt;/strong&gt; — narrow the GSC query filter by date to find if any query broke the 16-impression threshold in a single week. If not, wait.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fix the og:title tags&lt;/strong&gt; — this is the fourth post mentioning this. At this point the commitment is meaningless until there's a commit that proves it happened.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The uncomfortable lesson
&lt;/h2&gt;

&lt;p&gt;Writing action items in a blog post and then not doing them is a specific kind of self-deception. The items go onto a list, the list gives the impression of progress, and the automation keeps running its queue while the list sits there.&lt;/p&gt;

&lt;p&gt;None of Week 5's four action items made it into git. The WACC calculator — which was supposed to be a controlled experiment — is at position 55.8 with 1 click and 653 impressions. The queue wasn't reordered. The og:title fix didn't ship. The ROI calculator is at position 41.1, still drifting.&lt;/p&gt;

&lt;p&gt;The click rate did triple, which is the genuine good news this week. But the tripling came from early-April improvements starting to surface — not from anything decided or built this week or last week. The lag is long enough that cause and effect barely feel connected.&lt;/p&gt;

&lt;p&gt;The experiment running in the background is working. The promises running in the foreground aren't.&lt;/p&gt;

&lt;p&gt;I'll check back in June on the pages improved in May. If the PE ratio pattern holds, ROAS should be somewhere around position 55-65 by then. If it's still at 74, the pattern doesn't generalize and I'll say that.&lt;/p&gt;




&lt;p&gt;I'm running these experiments on &lt;a href="https://valuefy.app" rel="noopener noreferrer"&gt;valuefy.app&lt;/a&gt; and writing them up as they happen. If you're building programmatic SEO, watching Claude automate your content queue, or trying to make sense of GSC's privacy threshold noise, I'd be glad to compare notes in the comments.&lt;/p&gt;

&lt;p&gt;I also run &lt;a href="https://aimiten.fi" rel="noopener noreferrer"&gt;AImiten&lt;/a&gt;, where we build AI tooling for companies. This project is where I pressure-test the ideas before they touch client work.&lt;/p&gt;

</description>
      <category>seo</category>
      <category>webdev</category>
      <category>ai</category>
      <category>claude</category>
    </item>
    <item>
      <title>30 Days of Daily Automation. The Bot Improved the Wrong Pages.</title>
      <dc:creator>Aimiten</dc:creator>
      <pubDate>Sun, 03 May 2026 07:27:30 +0000</pubDate>
      <link>https://dev.to/aimiten/30-days-of-daily-automation-the-bot-improved-the-wrong-pages-1ag</link>
      <guid>https://dev.to/aimiten/30-days-of-daily-automation-the-bot-improved-the-wrong-pages-1ag</guid>
      <description>&lt;p&gt;The daily automation has been running for 30 consecutive days. One calculator page per day, every day since April 3rd — verified benchmarks, worked examples, internal links added, body content rewritten. 28 different pages touched.&lt;/p&gt;

&lt;p&gt;This week I pulled the GSC data to see what actually happened.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;8 of those pages don't appear in the 200-page snapshot of the last 28 days.&lt;/strong&gt; Not low impressions. Absent entirely.&lt;/p&gt;

&lt;p&gt;The automation ran every day, made measurable improvements, and spent most of its effort on pages Google isn't showing to anyone.&lt;/p&gt;

&lt;h2&gt;
  
  
  The setup
&lt;/h2&gt;

&lt;p&gt;The routine picks a calculator from a queue, fetches the current page, asks Claude to add verified benchmarks and worked examples, commits the result. Runs at 9 PM UTC. Has not missed a day since April 3.&lt;/p&gt;

&lt;p&gt;This week's batch: NOI (Apr 26), DSCR (Apr 27), Cash-on-Cash Return (Apr 28), GRM (Apr 29), Occupancy Rate (Apr 30), WACC (May 1), CPC (May 2). All real estate and finance metrics. Each one is genuinely a better page now — the content is real, the benchmarks are verified.&lt;/p&gt;

&lt;p&gt;The question I didn't ask until this week: which pages should have been first?&lt;/p&gt;

&lt;h2&gt;
  
  
  What I expected vs what the data showed
&lt;/h2&gt;

&lt;p&gt;I expected the earliest-improved pages — improved in the first week of April, now four weeks old — to show some position movement. Google crawl cycles at this authority level run roughly 2–4 weeks. Four weeks should be enough to see something.&lt;/p&gt;

&lt;p&gt;Here's what the 28-day GSC data shows for the early-April batch:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Page&lt;/th&gt;
&lt;th&gt;Improved&lt;/th&gt;
&lt;th&gt;Impressions 28d&lt;/th&gt;
&lt;th&gt;Clicks&lt;/th&gt;
&lt;th&gt;Position&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;arr-calculator&lt;/td&gt;
&lt;td&gt;Apr 10&lt;/td&gt;
&lt;td&gt;46&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;8.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;cac-calculator&lt;/td&gt;
&lt;td&gt;Apr 8&lt;/td&gt;
&lt;td&gt;115&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;22.5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;burn-rate-calculator&lt;/td&gt;
&lt;td&gt;Apr 6&lt;/td&gt;
&lt;td&gt;28&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;6.8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ltv-calculator&lt;/td&gt;
&lt;td&gt;Apr 9&lt;/td&gt;
&lt;td&gt;26&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;6.5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;mrr-calculator&lt;/td&gt;
&lt;td&gt;Apr 11&lt;/td&gt;
&lt;td&gt;not in top 200&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;runway-calculator&lt;/td&gt;
&lt;td&gt;Apr 7&lt;/td&gt;
&lt;td&gt;not in top 200&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Zero clicks across all of them. The pages that appear have positions between 6.5 and 22.5 — but at impression volumes this low, average position is again the arithmetic mean of a ghost distribution. The query-level breakdown for ARR returns zero visible queries. For LTV, the same.&lt;/p&gt;

&lt;p&gt;No movement. Four weeks of crawl time, and the positions are where they were before the improvements.&lt;/p&gt;

&lt;h2&gt;
  
  
  Finding #1: The site's highest-impression tool page hasn't been touched
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://valuefy.app/tools/hourly-rate-calculator/" rel="noopener noreferrer"&gt;hourly rate calculator&lt;/a&gt; has &lt;strong&gt;880 impressions&lt;/strong&gt; in the last 28 days. That's the highest impression count of any tool page on the site. It sits at position 57.4 — page 6 of Google — generating a steady drip of impressions and converting none of them into clicks.&lt;/p&gt;

&lt;p&gt;The automation has never touched it.&lt;/p&gt;

&lt;p&gt;Git log confirms: no commits to &lt;code&gt;hourly-rate-calculator.tsx&lt;/code&gt; in at least 90 days. I also curled the live page:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;title&amp;gt;&lt;/span&gt;Hourly Rate Calculator for Freelancers | Valuefy&lt;span class="nt"&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"description"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"Free hourly rate calculator for freelancers and
  consultants. Convert salary to hourly, add overhead and taxes, and set a rate
  that covers every cost."&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Reasonable title. Reasonable description. The page also carries the og:title duplicate bug — two competing &lt;code&gt;og:title&lt;/code&gt; tags, one static from the shell HTML, one injected by React Helmet. Every page on the site has this; I've now verified it on the homepage, the WACC calculator, and the hourly rate page. It's been there since Week 1.&lt;/p&gt;

&lt;p&gt;The automation queue did not sort by impression count. It ran through a list. The list didn't cross-reference GSC.&lt;/p&gt;

&lt;h2&gt;
  
  
  Finding #2: The five pages that should have been first
&lt;/h2&gt;

&lt;p&gt;When I sorted tool pages by 28-day impressions and filtered for pages the automation hasn't touched, this is what came out:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Page&lt;/th&gt;
&lt;th&gt;Impressions 28d&lt;/th&gt;
&lt;th&gt;Clicks&lt;/th&gt;
&lt;th&gt;Position&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;hourly-rate-calculator&lt;/td&gt;
&lt;td&gt;880&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;57.4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;pe-ratio-calculator&lt;/td&gt;
&lt;td&gt;546&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;22.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;purchase-order-generator&lt;/td&gt;
&lt;td&gt;395&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;39.6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;roas-calculator&lt;/td&gt;
&lt;td&gt;357&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;62.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;markup-calculator&lt;/td&gt;
&lt;td&gt;345&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;43.0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These five pages together have 2,523 impressions and 11 clicks in 28 days. The four with clicks have CTR between 0.5% and 0.8%. The hourly rate page has 880 impressions and zero clicks — meaning someone searched, saw the result, decided not to click. A title or meta description problem, not a ranking problem. All of them sit between position 22 and 62 — basement-level, but visible. If any one of them converts at even 2% instead of sub-1%, that's a measurable weekly click increase from pages that already exist in Google's view.&lt;/p&gt;

&lt;p&gt;The automation improved pages that averaged fewer than 30 impressions per month. These five averaged 505.&lt;/p&gt;

&lt;h2&gt;
  
  
  Finding #3: The ROI calculator — the Week 1 flagship — has nearly disappeared
&lt;/h2&gt;

&lt;p&gt;In the &lt;a href="https://dev.to/aimiten/i-ran-a-full-seo-audit-on-my-side-project-45-clicks-in-90-days-heres-what-i-found-41pl"&gt;Week 1 audit&lt;/a&gt;, &lt;code&gt;/tools/roi-calculator/&lt;/code&gt; led the table: 1,483 impressions over 90 days at position 58. The most visible tool page on the site at the time.&lt;/p&gt;

&lt;p&gt;The automation improved it on April 20. Thirteen days ago.&lt;/p&gt;

&lt;p&gt;It no longer appears in the top 200 pages in the 28-day data. When I ran a query-level breakdown specifically for that URL, I got 10 visible queries with roughly 20 total impressions. At the same run rate as Week 1, I'd expect about 490 impressions in a 28-day window. It's now at 20 plus whatever sits below GSC's privacy threshold.&lt;/p&gt;

&lt;p&gt;I don't know the cause. The April 22 editorial redesign — a full visual overhaul cascading to 143+ pages — happened two days after the ROI improvement. CSS variable remaps and font changes don't affect rankings directly, but a full site re-render can trigger a recrawl cycle that temporarily disrupts signals. That's a more plausible cause than the content improvement itself.&lt;/p&gt;

&lt;p&gt;What I know: the page dropped. I'll check it again in two weeks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Finding #4: The WACC calculator has the most impressions — and was just improved
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://valuefy.app/tools/wacc-calculator/" rel="noopener noreferrer"&gt;WACC calculator&lt;/a&gt; has 560 impressions in 28 days, position 56, one click. It's the second-highest impression tool page after the hourly rate calculator.&lt;/p&gt;

&lt;p&gt;The automation improved it on May 1 — two days ago. Too early to see any effect in GSC. I curled the page:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;title&amp;gt;&lt;/span&gt;WACC Calculator: Cost of Capital Formula | Valuefy&lt;span class="nt"&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"description"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"Calculate your weighted average cost of capital
  from debt, equity, and tax rate. Used in DCF models and capital structure decisions."&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is one of the rare cases where the automation hit a high-impression page by coincidence — WACC was next in the queue, and it happened to be second-highest in impressions. I'll use this as a natural experiment: if the content improvement moves the position in the next two weeks, it's the strongest evidence so far that on-page work does anything at this authority level. If it doesn't, that's also data.&lt;/p&gt;

&lt;p&gt;The query breakdown confirms the impression distribution is real here — 11 visible queries, 508 visible impressions, with "wacc calculator" alone driving 188 impressions at position 59.9. This is not another averaged ghost. It's a real query cluster with real search volume, sitting on page 6 with a 0.18% CTR.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I'm going to do about it
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Reorder the queue by impressions&lt;/strong&gt; — sort descending, cross-referenced against GSC, starting with hourly rate (880), then P/E (546), then purchase-order generator (395). The queue already works; it just needs the right priority.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use the WACC calculator as a control&lt;/strong&gt; — check its position in two weeks. If it moves, on-page optimization is doing something at this domain's authority level. If not, the Week 1 conclusion still holds.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Watch the ROI calculator&lt;/strong&gt; — if it recovers from the post-redesign dip, the April 22 redesign was the variable. If it keeps dropping, something else is happening.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fix the og:title duplicate&lt;/strong&gt; — I keep saying this. This time I'm treating it as a blocker for any further queue runs, not a nice-to-have.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The uncomfortable lesson
&lt;/h2&gt;

&lt;p&gt;Automation removes friction from a decision you've already made. If the decision was wrong, the automation executes it more consistently than you'd have done it manually.&lt;/p&gt;

&lt;p&gt;The queue existed. It worked through a list. Nobody asked whether the list matched the data.&lt;/p&gt;

&lt;p&gt;30 days later, 28 pages are better, 8 of them have fewer monthly impressions than a single Reddit comment gets views, and the site's highest-impression tool page still looks like it did in February.&lt;/p&gt;

&lt;p&gt;I said in Week 1: "I'd rather run one audit routine that tells me which pages improved week over week than ship more content into a pile Google has already rated." I then ran 30 more improvements without that audit. These things are not actually hard to do — they're hard to prioritize when the automation is already running and producing tidy green commits.&lt;/p&gt;

&lt;p&gt;I'll reorder the queue this week. In two weeks I'll report whether the WACC experiment moved. If the answer is "no detectable movement at position 56 with 560 impressions," I'll say that too.&lt;/p&gt;




&lt;p&gt;I'm running these experiments on &lt;a href="https://valuefy.app" rel="noopener noreferrer"&gt;valuefy.app&lt;/a&gt; and writing the findings as I go. If you're building programmatic SEO or trying to figure out whether automated content work is actually doing anything, I'd be glad to compare notes — drop a comment.&lt;/p&gt;

&lt;p&gt;I also run &lt;a href="https://aimiten.fi" rel="noopener noreferrer"&gt;AImiten&lt;/a&gt;, where we build AI tooling for companies. This side project is where ideas get stress-tested before they touch client work.&lt;/p&gt;

</description>
      <category>seo</category>
      <category>webdev</category>
      <category>ai</category>
      <category>claude</category>
    </item>
    <item>
      <title>The og:title Bug Was Deliberate. The Code Already Explained Why It Would Fail.</title>
      <dc:creator>Aimiten</dc:creator>
      <pubDate>Sun, 26 Apr 2026 07:23:44 +0000</pubDate>
      <link>https://dev.to/aimiten/the-ogtitle-bug-was-deliberate-the-code-already-explained-why-it-would-fail-542f</link>
      <guid>https://dev.to/aimiten/the-ogtitle-bug-was-deliberate-the-code-already-explained-why-it-would-fail-542f</guid>
      <description>&lt;p&gt;In Week 1 of this series, I found a duplicate &lt;code&gt;og:title&lt;/code&gt; bug on valuefy.app and wrote: "Fix: strip the static &lt;code&gt;og:&lt;/code&gt; tags out of &lt;code&gt;index.html&lt;/code&gt;. About 15 minutes of work, touches one file."&lt;/p&gt;

&lt;p&gt;That was twelve days ago.&lt;/p&gt;

&lt;p&gt;I curled the homepage this morning. Two &lt;code&gt;og:title&lt;/code&gt; tags. Still there.&lt;/p&gt;

&lt;p&gt;I went to figure out why.&lt;/p&gt;

&lt;h2&gt;
  
  
  The setup
&lt;/h2&gt;

&lt;p&gt;Here's what was running this week:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Eight content automation commits in seven days: "SEO: improve [X] calculator content — add verified benchmarks, examples, internal links." NPV, ROI, Payback Period, CAPM, Dividend Yield, EPS, DCF, Cap Rate, Rental Yield — one calculator per day, every day.&lt;/li&gt;
&lt;li&gt;One site-wide editorial redesign (April 22): 1,437 insertions, 857 deletions, 23 files. New palette (oxblood &lt;code&gt;#8B2E2A&lt;/code&gt;, off-black, paper &lt;code&gt;#F5F2EA&lt;/code&gt;), Fraunces serif headlines, masthead-style layout. The redesign cascades to 143+ calculator pages via CSS variable remap.&lt;/li&gt;
&lt;li&gt;One targeted SEO tweak on the Purchase Order Generator: title rewritten to "Free Purchase Order Generator &amp;amp; PO Maker," H1 updated to include "PO" and "Maker" variants. Targeting four queries the page already appeared for at positions 10-19.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's a lot of shipping. The &lt;code&gt;og:title&lt;/code&gt; fix — which was supposed to be tonight's work twelve days ago — did not ship.&lt;/p&gt;

&lt;p&gt;I expected this to be a story about procrastination. It wasn't.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I expected vs. what I found
&lt;/h2&gt;

&lt;p&gt;I expected to find that the duplicate &lt;code&gt;og:title&lt;/code&gt; was a legacy accident — a leftover static tag I'd never cleaned up after wiring in React Helmet.&lt;/p&gt;

&lt;p&gt;Instead, I found &lt;code&gt;git log --oneline -- client/index.html&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;79e0c67  Design: site-wide editorial redesign
3ef0538  SEO: add static Open Graph meta tags to index.html for crawler compatibility
1b90426  SEO: remove static meta description from index.html to fix duplicate tag
d7fdcf5  SEO: fix prerender meta description hydration
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The static &lt;code&gt;og:title&lt;/code&gt; tag was introduced on March 31, deliberately, in a commit that also wrote an explanation for why it was safe. The bug I found in Week 1 wasn't a legacy artifact. It was a design decision.&lt;/p&gt;

&lt;h2&gt;
  
  
  Finding #1: The commit that introduced it had a valid reason and a wrong assumption
&lt;/h2&gt;

&lt;p&gt;Here's the full commit message from March 31:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SEO: add static Open Graph meta tags to index.html for crawler compatibility

SPA crawlers (RankInPublic, Facebook, Slack) don't execute JS so they
miss og:image from React SEOHelmet. Static fallbacks in index.html
ensure previews work everywhere.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The rationale is completely valid. When Facebook or LinkedIn crawl your React SPA, they don't execute JavaScript. They read &lt;code&gt;index.html&lt;/code&gt; as-is. If your &lt;code&gt;og:image&lt;/code&gt; only exists in the React Helmet component, social sharing is broken for a large class of crawlers.&lt;/p&gt;

&lt;p&gt;The commit added:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- Open Graph defaults (overridden by SEOHelmet per page) --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;property=&lt;/span&gt;&lt;span class="s"&gt;"og:title"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"Valuefy - Free Business Calculators &amp;amp; Financial Tools"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;property=&lt;/span&gt;&lt;span class="s"&gt;"og:description"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"150+ free business calculators..."&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;property=&lt;/span&gt;&lt;span class="s"&gt;"og:image"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"https://valuefy.app/og-default.jpg"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The comment says "overridden by SEOHelmet per page." This is the assumption that turned out to be wrong.&lt;/p&gt;

&lt;h2&gt;
  
  
  Finding #2: React Helmet adds alongside. It does not remove.
&lt;/h2&gt;

&lt;p&gt;Sit two lines above those new Open Graph tags in &lt;code&gt;index.html&lt;/code&gt;. There's already a comment there:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- Meta description intentionally omitted — React Helmet injects the correct
     page-specific description at runtime and during prerendering. A static tag
     here would create a duplicate that Google reads instead of the real one. --&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That comment is about &lt;code&gt;&amp;lt;meta name="description"&amp;gt;&lt;/code&gt;, which was correctly removed in &lt;code&gt;1b90426&lt;/code&gt;. The understanding was right: if you put a static meta description in &lt;code&gt;index.html&lt;/code&gt;, the prerendering step captures it alongside the React Helmet version, and you get two description tags.&lt;/p&gt;

&lt;p&gt;What the March 31 commit missed is that the same behavior applies to &lt;code&gt;og:title&lt;/code&gt; and &lt;code&gt;og:description&lt;/code&gt;. React Helmet does not replace static tags it didn't create. When the prerender runs, it appends the Helmet-managed tags — with &lt;code&gt;data-rh="true"&lt;/code&gt; attributes — to whatever was already in &lt;code&gt;index.html&lt;/code&gt;. The static tags stay.&lt;/p&gt;

&lt;p&gt;I confirmed this by curling the prerendered homepage:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;property=&lt;/span&gt;&lt;span class="s"&gt;"og:title"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"Valuefy - Free Business Calculators &amp;amp; Financial Tools"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
...
&lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;property=&lt;/span&gt;&lt;span class="s"&gt;"og:title"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"Free Business Calculators &amp;amp; AI Generators | Valuefy"&lt;/span&gt; &lt;span class="na"&gt;data-rh=&lt;/span&gt;&lt;span class="s"&gt;"true"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Two &lt;code&gt;og:title&lt;/code&gt; tags. On every page. When you share a specific calculator on LinkedIn, most crawlers read the first &lt;code&gt;og:title&lt;/code&gt; they encounter. That first one is the generic site-wide fallback, not the calculator's specific title.&lt;/p&gt;

&lt;p&gt;There's also a stale number in the mix. The static &lt;code&gt;og:description&lt;/code&gt; says "150+ free business calculators." Every other file in the codebase says "105+." The static tag is from March 31 and was never updated.&lt;/p&gt;

&lt;h2&gt;
  
  
  Finding #3: 1,437 lines of redesign — 1 line deleted in index.html
&lt;/h2&gt;

&lt;p&gt;The April 22 redesign is the most significant commit this month. 23 files, 1,437 insertions, 857 deletions. The palette changed, the typography changed, the favicon changed, the nav structure changed (Blog renamed to Journal, direct hub links). The commit message describes it as cascading to 143+ calculator pages.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;index.html&lt;/code&gt; was touched in that commit. One deletion:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight diff"&gt;&lt;code&gt;&lt;span class="gd"&gt;-    &amp;lt;link rel="alternate icon" href="/favicon.ico" /&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The old favicon ICO. That's it.&lt;/p&gt;

&lt;p&gt;I'm not criticizing the choice. The redesign was clearly scoped as a visual layer change, and the &lt;code&gt;og:title&lt;/code&gt; is a meta tag problem with a different owner in the commit history. But it's an interesting illustration of how bugs survive complex refactors: when a refactor's scope is well-defined, edge cases at the boundary of that scope don't get pulled in.&lt;/p&gt;

&lt;h2&gt;
  
  
  Finding #4: The four-week scorecard
&lt;/h2&gt;

&lt;p&gt;49 clicks in the last 28 days across 50 pages. That's up from the Week 1 baseline of 45 total in 90 days — roughly a 3.5× improvement in click rate.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Period&lt;/th&gt;
&lt;th&gt;Clicks&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;90-day baseline (Week 1)&lt;/td&gt;
&lt;td&gt;45&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Last 28 days (Week 4)&lt;/td&gt;
&lt;td&gt;49&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The directions are right but the absolute numbers are still small. The USA remains structurally broken: 8,221 impressions in 28 days, 3 clicks, CTR 0.036%, average position 56. India gets 892 impressions and 10 clicks at position 16. The US market is generating more than 9× the impressions of India but less than a third of the clicks — and all of that comes from deep-page positions where nobody clicks.&lt;/p&gt;

&lt;p&gt;The daily automation is producing work. The positions haven't moved on the core head terms. The authority gap from Week 1 is still the binding constraint.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I'm going to do about it
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Fix the og: tags tonight.&lt;/strong&gt; Remove &lt;code&gt;og:title&lt;/code&gt;, &lt;code&gt;og:description&lt;/code&gt;, and &lt;code&gt;og:url&lt;/code&gt; from &lt;code&gt;index.html&lt;/code&gt;. Keep &lt;code&gt;og:image&lt;/code&gt;, &lt;code&gt;og:image:width&lt;/code&gt;, &lt;code&gt;og:image:height&lt;/code&gt;, and &lt;code&gt;og:type&lt;/code&gt; — those are the tags that React Helmet doesn't reliably inject and that non-JS crawlers need. The title and description are page-specific; the image and type are site-wide defaults. Split them correctly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Update the static og:description count.&lt;/strong&gt; "150+" is wrong; it should match the "105+" used everywhere else in the codebase. One character change.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Verify the Purchase Order Generator title change landed.&lt;/strong&gt; GSC shows "po generator" at position 16.3 over 28 days. The April 21 commit targeted that query. I'll check position week-over-week in two more GSC pulls to see if the title change moved anything.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keep the daily automation running.&lt;/strong&gt; The 3.5× improvement in weekly clicks is directional. I won't interrupt it.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The uncomfortable lesson
&lt;/h2&gt;

&lt;p&gt;The comment in &lt;code&gt;index.html&lt;/code&gt; explains the exact problem that the line right below it creates.&lt;/p&gt;

&lt;p&gt;That's not unusual. Code comments often describe constraints that are immediately violated — by the person who wrote the comment. It's not laziness; it's the difference between understanding the abstract principle ("duplicates are bad") and applying it consistently to every concrete case that fits the pattern ("so og:title is a duplicate too").&lt;/p&gt;

&lt;p&gt;The React Helmet behavior is genuinely non-obvious if you haven't run into it before. &lt;code&gt;&amp;lt;title&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;meta name="description"&amp;gt;&lt;/code&gt; get replaced because React Helmet has special handling for those. Custom &lt;code&gt;og:&lt;/code&gt; properties don't have the same handling. The distinction isn't documented prominently. You only know it if you've either read deeply into Helmet's code or encountered the resulting bug.&lt;/p&gt;

&lt;p&gt;I'm writing it here so the next person building a React SPA with prerendering and React Helmet doesn't spend a week running the wrong commit log search.&lt;/p&gt;

&lt;p&gt;The four-week summary: the content machine is running, the click curve is improving slowly, and there's one structural SEO bug left that's been there since before Week 1. That's next.&lt;/p&gt;




&lt;p&gt;I'm running these experiments on &lt;a href="https://valuefy.app" rel="noopener noreferrer"&gt;valuefy.app&lt;/a&gt; and writing the findings as I go. If you're building programmatic SEO on a React SPA, dealing with prerendering quirks, or fighting the same "I know about the bug but haven't fixed it" wall — drop a comment or reach out.&lt;/p&gt;

&lt;p&gt;I also run &lt;a href="https://aimiten.fi" rel="noopener noreferrer"&gt;AImiten&lt;/a&gt;, where we build AI tooling for companies. This side project is where I stress-test ideas before they touch client work.&lt;/p&gt;

</description>
      <category>seo</category>
      <category>webdev</category>
      <category>ai</category>
      <category>claude</category>
    </item>
    <item>
      <title>22 Queries, Position 2, Zero Clicks — Because the Meta Description Said 2024</title>
      <dc:creator>Aimiten</dc:creator>
      <pubDate>Sun, 19 Apr 2026 07:16:43 +0000</pubDate>
      <link>https://dev.to/aimiten/22-queries-position-2-zero-clicks-because-the-meta-description-said-2024-3ddo</link>
      <guid>https://dev.to/aimiten/22-queries-position-2-zero-clicks-because-the-meta-description-said-2024-3ddo</guid>
      <description>&lt;p&gt;22 queries. Positions ranging from 1 to 5. 56 impressions. Zero clicks.&lt;/p&gt;

&lt;p&gt;Not "near zero." Not "a handful." Zero. A blog post on &lt;a href="https://valuefy.app" rel="noopener noreferrer"&gt;valuefy.app&lt;/a&gt; sat at the top of Google's results for more than twenty search queries about SaaS valuation multiples in 2026, and not one searcher clicked it.&lt;/p&gt;

&lt;p&gt;I went looking for why. What I found was a metadata bug so obvious I'm still annoyed I didn't catch it sooner — and a bigger pattern about what happens when automation runs on a schedule instead of on a signal.&lt;/p&gt;

&lt;h2&gt;
  
  
  The setup
&lt;/h2&gt;

&lt;p&gt;This week's git log tells one story. Six pull requests — six venture-finance calculator pages improved by the daily Claude Code routine:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;IRR Calculator (April 17)&lt;/li&gt;
&lt;li&gt;Cap Table Calculator (April 16)&lt;/li&gt;
&lt;li&gt;Dilution Calculator (April 15)&lt;/li&gt;
&lt;li&gt;Vesting Calculator (April 15)&lt;/li&gt;
&lt;li&gt;Funding Calculator (April 13)&lt;/li&gt;
&lt;li&gt;Churn Rate Calculator (April 12)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each commit is the same shape: verified benchmarks added, worked examples, updated internal links. Six pages touched in seven days. If you squinted at the output, you'd assume the project had a productive week.&lt;/p&gt;

&lt;p&gt;GSC told a different story.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the data showed
&lt;/h2&gt;

&lt;p&gt;I pulled the 28-day page+query breakdown — which pages were getting impressions and for which specific queries. None of the six improved calculator pages appeared with any meaningful signal. The IRR calculator had 15 visible queries, all at positions 60–100, zero clicks. The Cap Table calculator returned zero rows — no impressions at all in the last 28 days.&lt;/p&gt;

&lt;p&gt;But one page kept showing up in the data. A blog post:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;/blog/saas-valuation-multiples-in-2026-why-profitability-now-trumps-growth-at-all-costs&lt;/code&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Query&lt;/th&gt;
&lt;th&gt;Impressions&lt;/th&gt;
&lt;th&gt;Position&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;saas valuation multiples 2026 arr&lt;/td&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;4.2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;saas company valuation multiples 2026&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;2.5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;b2b saas valuation multiples 2026&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;5.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;saas startup valuation multiples 2026&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;3.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;saas arr valuation multiples 2026&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;3.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;saas valuation multiples arr 2026&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;3.7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;saas valuation multiples compression 2026&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;8.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;rule of 40 saas valuation impact 2026&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;7.0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;22 queries total. 56 visible impressions. The post is ranking at positions 1–5 for real queries with real search intent — not the micro-volume graveyard from last week's post. These are people actually typing "saas valuation multiples 2026" into Google and seeing valuefy.app in positions 2, 3, 4.&lt;/p&gt;

&lt;p&gt;Clicks: 0.&lt;/p&gt;

&lt;h2&gt;
  
  
  Finding #1: The meta description says 2024
&lt;/h2&gt;

&lt;p&gt;I curled the page as Googlebot. The title tag was fine:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;title&amp;gt;&lt;/span&gt;SaaS valuation multiples in 2026: why profitability now trumps growth-at-all-costs | Valuefy Blog&lt;span class="nt"&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then I looked at the meta description:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"description"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"Discover how a focus on profitability is reshaping 
SaaS valuation multiples in 2024. This case study explores how a SaaS company 
achieved a premium e..."&lt;/span&gt; &lt;span class="na"&gt;data-rh=&lt;/span&gt;&lt;span class="s"&gt;"true"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;2024.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The title says 2026. The queries say 2026. The searcher's intent is 2026. But the meta description — the two lines that appear directly under the title in Google's results — says "reshaping SaaS valuation multiples in 2024."&lt;/p&gt;

&lt;p&gt;The blog automation wrote this post with a 2026-targeted title and H1 but generated the meta description from case study content that referenced 2024 data. Nobody caught the mismatch. The description is also truncated — it ends with "e..." cut mid-word — which is a separate readability problem on top of the year contradiction.&lt;/p&gt;

&lt;p&gt;A searcher types "saas valuation multiples 2026." They see a title that matches. They read the snippet. It says "2024." They click something else.&lt;/p&gt;

&lt;p&gt;That's the entire explanation for 56 impressions and zero clicks at position 2.5.&lt;/p&gt;

&lt;h2&gt;
  
  
  Finding #2: A structural bug lives in every blog post
&lt;/h2&gt;

&lt;p&gt;While I was in the HTML, I checked the H1 count. Curling the SaaS blog post and counting &lt;code&gt;&amp;lt;h1&amp;gt;&lt;/code&gt; opening tags:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;curl ... | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-oE&lt;/span&gt; &lt;span class="s1"&gt;'&amp;lt;h1[^&amp;gt;]*&amp;gt;'&lt;/span&gt; | &lt;span class="nb"&gt;wc&lt;/span&gt; &lt;span class="nt"&gt;-l&lt;/span&gt;
2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Two H1 tags. I checked the business valuation formula post — same result, 2. I checked the IRR calculator tool page — 1. The double H1 lives in the blog template, not in tool pages.&lt;/p&gt;

&lt;p&gt;A page with two H1s sends mixed signals about what the primary topic is. It's not a crisis-level bug, but it compounds the other issues. If the meta description is wrong and the page has two H1s, Google has fewer reliable signals for what the page is actually about — and it's already chosen not to send clicks even from positions where it's ranking.&lt;/p&gt;

&lt;h2&gt;
  
  
  Finding #3: The og:title bug from week one is still there
&lt;/h2&gt;

&lt;p&gt;I reported a duplicate &lt;code&gt;og:title&lt;/code&gt; bug in the first post in this series. The static &lt;code&gt;index.html&lt;/code&gt; bakes in a generic site-wide og:title, and React Helmet adds a page-specific one on top. Two competing tags, every page.&lt;/p&gt;

&lt;p&gt;It's still there. I curled the homepage and the IRR calculator:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Homepage&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;curl ... | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-cE&lt;/span&gt; &lt;span class="s1"&gt;'&amp;lt;meta property="og:title"'&lt;/span&gt;
2

&lt;span class="c"&gt;# IRR calculator&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;curl ... | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-cE&lt;/span&gt; &lt;span class="s1"&gt;'&amp;lt;meta property="og:title"'&lt;/span&gt;
2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This isn't new information. But six weeks is a long time for a 15-minute fix to sit in a backlog.&lt;/p&gt;

&lt;h2&gt;
  
  
  Finding #4: The automation improved pages ranked nowhere, ignored the one with actual signal
&lt;/h2&gt;

&lt;p&gt;This is the pattern that bothers me most.&lt;/p&gt;

&lt;p&gt;The daily routine picked six pages to improve this week. All startup-finance tools — IRR, Cap Table, Dilution, Vesting, Funding, Churn Rate. The routine added verified benchmarks and worked examples to each one. That content is now live. None of those pages appear in the 28-day GSC data with any meaningful traction.&lt;/p&gt;

&lt;p&gt;Meanwhile, the SaaS valuation blog post was sitting at position 2.5 for 8 impressions, position 3.0 for 5 more impressions, position 4.2 for 9 more — and its meta description had a year error in it that anyone would have caught in 30 seconds.&lt;/p&gt;

&lt;p&gt;The automation doesn't read GSC. It has a queue of pages to improve and it works through them in order. Whether a page has 1000 impressions or zero impressions doesn't affect which one gets picked next. The blog post with the broken metadata was never on the list, because the list is driven by a schedule, not by what's actually losing clicks right now.&lt;/p&gt;

&lt;p&gt;A human checking GSC once a week would have caught the year mismatch before the post published. The routine — running every night, producing clean commit messages, improving content by every objective measure — never looked at the output.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I'm going to do about it
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Fix the meta description on the SaaS blog post&lt;/strong&gt; — change "2024" to "2026," fix the truncation. Five minutes. This is the highest-leverage fix available right now because the post is already ranking.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fix the double H1 in the blog template&lt;/strong&gt; — this touches every blog post, but it's a one-file change.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Strip the static og:title from index.html&lt;/strong&gt; — this was overdue in week one. It's more overdue now.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Add a GSC signal check to the automation queue&lt;/strong&gt; — before choosing the next page to improve, pull its 28-day impression count from GSC. Pages with zero impressions should wait. Pages with impressions but poor CTR should go first.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Audit the remaining blog posts for year mismatches&lt;/strong&gt; — the automation publishes frequently. If one post has a wrong year in the description, others probably do too.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The uncomfortable lesson
&lt;/h2&gt;

&lt;p&gt;Automation is good at doing the thing it's programmed to do. It's not good at noticing when it's doing the wrong thing.&lt;/p&gt;

&lt;p&gt;The calendar routine delivered this week. Six pages improved, six clean commits, six sets of verified benchmarks added. From a process perspective it looks like progress. From a signal perspective, six pages were polished that Google hasn't surfaced to anyone — while a page Google was actively showing to searchers at positions 1–5 had a metadata mismatch that made every one of those impressions worthless.&lt;/p&gt;

&lt;p&gt;The fix for the year bug takes five minutes. The fix for the scheduling problem — teaching the routine to check whether a page has signal before picking it — is a morning of work. Neither fix is hard. Both required a human to look at GSC data and connect it to what the automation was doing.&lt;/p&gt;

&lt;p&gt;Running a content routine without a signal-feedback loop is the same bet as optimizing a conversion funnel without looking at where users drop off. You can improve every step in isolation and still move nothing.&lt;/p&gt;

&lt;p&gt;I'll fix the meta description today. The og:title fix and the blog template H1 are going in this week. The queue-prioritization change — routing automation effort toward pages that already have impressions — is the one I want to report back on in a month. Either the click data improves or it doesn't, and I'll say which.&lt;/p&gt;




&lt;p&gt;Running these experiments on &lt;a href="https://valuefy.app" rel="noopener noreferrer"&gt;valuefy.app&lt;/a&gt; and writing up what I find. If you're building programmatic SEO tooling, debugging a content automation that's technically working but not converting — or just hitting the same "impressions up, clicks flat" wall — drop a comment. I want to hear what the same data looks like from other projects.&lt;/p&gt;

&lt;p&gt;I also run &lt;a href="https://aimiten.fi" rel="noopener noreferrer"&gt;AImiten&lt;/a&gt;, where we build AI tooling for companies. This side project is where the ideas get stress-tested.&lt;/p&gt;

</description>
      <category>seo</category>
      <category>webdev</category>
      <category>ai</category>
      <category>claude</category>
    </item>
    <item>
      <title>The Blog Posts Are Ranking. Nobody's Clicking. And I Found Three More Bugs.</title>
      <dc:creator>Aimiten</dc:creator>
      <pubDate>Wed, 15 Apr 2026 07:50:17 +0000</pubDate>
      <link>https://dev.to/aimiten/the-blog-posts-are-ranking-nobodys-clicking-and-i-found-three-more-bugs-4g5e</link>
      <guid>https://dev.to/aimiten/the-blog-posts-are-ranking-nobodys-clicking-and-i-found-three-more-bugs-4g5e</guid>
      <description>&lt;p&gt;The blog posts are doing something the calculator pages couldn't manage last week. They're showing up near the top of Google. &lt;a href="https://valuefy.app/blog/saas-valuation-multiples-in-2026-why-profitability-now-trumps-growth-at-all-costs/" rel="noopener noreferrer"&gt;/blog/saas-valuation-multiples-in-2026-why-profitability-now-trumps-growth-at-all-costs/&lt;/a&gt; averaged position 8.87 last week with 62 impressions. Multiple queries put it at positions 1 through 5.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Zero clicks.&lt;/strong&gt; Not one. Over seven days. From a page with genuine top-of-page rankings.&lt;/p&gt;

&lt;p&gt;This is week two of the build log for &lt;a href="https://valuefy.app" rel="noopener noreferrer"&gt;valuefy.app&lt;/a&gt;. The first post covered the big-picture audit — 45 clicks in 90 days, the authority gap, the average-position trap. This week I dug into the exception cases: the pages that look like they're working. What I found was a different class of problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  The setup
&lt;/h2&gt;

&lt;p&gt;The daily SEO routine ran all week. Six calculator pages got the full treatment — verified benchmarks, worked examples, updated internal links:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CAC calculator (April 8)&lt;/li&gt;
&lt;li&gt;LTV calculator (April 9)&lt;/li&gt;
&lt;li&gt;ARR calculator (April 10)&lt;/li&gt;
&lt;li&gt;MRR calculator (April 11)&lt;/li&gt;
&lt;li&gt;Churn Rate calculator (April 12)&lt;/li&gt;
&lt;li&gt;Funding calculator (April 13)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There was also a one-line fix on April 9: the burn multiple was being credited to a16z in the BurnRateCalculator. The actual source is David Sacks at Craft Ventures. A human caught it, made the correction.&lt;/p&gt;

&lt;p&gt;I wanted to know if any of the six improvements were showing up in position data yet. They weren't — too soon, expected — but in the process of looking, I found the SaaS valuation blog post sitting at the top of the results page for several queries and not converting a single click.&lt;/p&gt;

&lt;p&gt;That became the story.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I expected vs what the data showed
&lt;/h2&gt;

&lt;p&gt;The expectation going into week two: some early signal on the improved calculator pages. Maybe one or two had nudged upward in the 28-day data.&lt;/p&gt;

&lt;p&gt;What actually surfaced: the blog content had more interesting movement. Here's the week's page-level picture — pages with nonzero clicks in the last seven days:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Page&lt;/th&gt;
&lt;th&gt;Impressions&lt;/th&gt;
&lt;th&gt;Clicks&lt;/th&gt;
&lt;th&gt;CTR&lt;/th&gt;
&lt;th&gt;Avg Position&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;/ (homepage)&lt;/td&gt;
&lt;td&gt;112&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;1.8%&lt;/td&gt;
&lt;td&gt;7.2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;/tools/equity-ratio-calculator/&lt;/td&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;6.7%&lt;/td&gt;
&lt;td&gt;62.3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;/tools/financial-analysis-tool/&lt;/td&gt;
&lt;td&gt;22&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;4.5%&lt;/td&gt;
&lt;td&gt;36.5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;/tools/retention-rate-calculator/&lt;/td&gt;
&lt;td&gt;44&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;2.3%&lt;/td&gt;
&lt;td&gt;31.6&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Five clicks total this week. The SaaS valuation blog — which had more impressions than any of those tool pages — is absent from this table because it contributed zero to the click column.&lt;/p&gt;

&lt;h2&gt;
  
  
  Finding #1: Ranking #1 for queries nobody types
&lt;/h2&gt;

&lt;p&gt;The SaaS valuation multiples blog has 62 impressions in seven days at an average position of 8.87. That aggregate looked interesting — same pattern as the loan calculator in week one, where average position hid a distribution. So I pulled the query-level breakdown for the last 28 days:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Query&lt;/th&gt;
&lt;th&gt;Impressions&lt;/th&gt;
&lt;th&gt;Position&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;saas company valuation multiples 2026&lt;/td&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;3.1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;saas valuation multiples 2026 arr&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;3.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;b2b saas valuation multiples 2026&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;5.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;saas startup valuation multiples 2026&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;3.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;acquire.com saas valuation multiples 2025&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;saas arr valuation multiples 2026&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;3.7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;fe international saas valuation multiples 2025 report&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;67.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;saas capital index median valuation multiple 2026&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;saas valuation multiples 2026 forecast&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;private saas valuation multiples 2026 arr&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;2.0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The total visible impressions in the query breakdown: 62. Which means — unlike week one's loan calculator — there's no privacy-threshold graveyard here. All impressions are accounted for. Google is being fully transparent.&lt;/p&gt;

&lt;p&gt;And what the data shows is that I'm ranking #1 for "saas capital index median valuation multiple 2026." That query got one impression in 28 days. "Saas valuation multiples 2026 forecast" — also position 1.0, also one impression. The queries where the page sits at position 3.0-3.1 are better, but the top one has nine impressions across 28 days.&lt;/p&gt;

&lt;p&gt;The week one trap was that a good-looking aggregate hid bad distributions. The week two trap is that genuinely good positions on genuinely relevant queries can still generate zero clicks — because the queries themselves are typed by almost nobody.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Position 1 on a dead query is not a win.&lt;/strong&gt; It is a proof of concept with no audience.&lt;/p&gt;

&lt;h2&gt;
  
  
  Finding #2: The trailing slash split I hadn't noticed
&lt;/h2&gt;

&lt;p&gt;While I was in the page-level seven-day data, another pattern surfaced. The business valuation formula blog post was appearing twice:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;URL&lt;/th&gt;
&lt;th&gt;Impressions&lt;/th&gt;
&lt;th&gt;Avg Position&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;/blog/business-valuation-formula-what-every-business-owner-should-know&lt;/td&gt;
&lt;td&gt;13&lt;/td&gt;
&lt;td&gt;2.5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;/blog/business-valuation-formula-what-every-business-owner-should-know/&lt;/td&gt;
&lt;td&gt;18&lt;/td&gt;
&lt;td&gt;2.7&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Two URLs. Same content. Different impression tallies. Google is treating them as separate pages.&lt;/p&gt;

&lt;p&gt;The page does have a canonical tag — and it points to the no-slash version, which is the right call. But the with-slash variant is getting crawled and counted independently. Forty-one combined impressions at an average position around 2.6 — not bad — but split across two URL signals. That's confusion Google doesn't need when it's already deciding how to rank the page.&lt;/p&gt;

&lt;p&gt;I curled the no-slash URL and confirmed: the canonical is set correctly, but there's also a static &lt;code&gt;og:url&lt;/code&gt; pointing to the homepage and a React Helmet &lt;code&gt;og:url&lt;/code&gt; pointing to the correct page. The static &lt;code&gt;og:url&lt;/code&gt; problem — the same class of bug as the duplicate &lt;code&gt;og:title&lt;/code&gt; — is making the page emit conflicting signals on every crawl.&lt;/p&gt;

&lt;h2&gt;
  
  
  Finding #3: The bug from week one is still live
&lt;/h2&gt;

&lt;p&gt;Last week I found duplicate &lt;code&gt;og:title&lt;/code&gt; tags on every page: one static tag baked into &lt;code&gt;index.html&lt;/code&gt; with the generic site title, one injected by React Helmet with the correct page title. I said it was a 15-minute fix.&lt;/p&gt;

&lt;p&gt;It's still there. I curled two pages this week to verify:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-sSL&lt;/span&gt; &lt;span class="nt"&gt;-A&lt;/span&gt; &lt;span class="s2"&gt;"Mozilla/5.0 (compatible; Googlebot/2.1)"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;"https://valuefy.app/blog/saas-valuation-multiples-in-2026-..."&lt;/span&gt; | &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-oE&lt;/span&gt; &lt;span class="s1"&gt;'&amp;lt;meta property="og:title"[^&amp;gt;]*&amp;gt;'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;property=&lt;/span&gt;&lt;span class="s"&gt;"og:title"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"Valuefy - Free Business Calculators &amp;amp;amp; Financial Tools"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;property=&lt;/span&gt;&lt;span class="s"&gt;"og:title"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"SaaS valuation multiples in 2026: why profitability now trumps growth-at-all-costs | Valuefy Blog"&lt;/span&gt; &lt;span class="na"&gt;data-rh=&lt;/span&gt;&lt;span class="s"&gt;"true"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Same structure on the ARR calculator: &lt;code&gt;grep -cE '&amp;lt;meta property="og:title"'&lt;/code&gt; returns 2.&lt;/p&gt;

&lt;p&gt;When anyone shares the SaaS valuation post on LinkedIn or Twitter, some crawlers — the ones that take the first &lt;code&gt;og:title&lt;/code&gt; rather than the last — display "Valuefy - Free Business Calculators &amp;amp; Financial Tools." The specific title that convinced someone to share the post disappears in the preview. The fix is one file change, &lt;code&gt;index.html&lt;/code&gt;, strip the four static &lt;code&gt;og:&lt;/code&gt; and &lt;code&gt;meta description&lt;/code&gt; tags and let React Helmet be the only source.&lt;/p&gt;

&lt;p&gt;I haven't done it. I should have done it last week.&lt;/p&gt;

&lt;h2&gt;
  
  
  Finding #4: The blog template has two H1 elements
&lt;/h2&gt;

&lt;p&gt;While curling the SaaS valuation blog for the og:title check, I noticed something else:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-sSL&lt;/span&gt; &lt;span class="nt"&gt;-A&lt;/span&gt; &lt;span class="s2"&gt;"Mozilla/5.0 (compatible; Googlebot/2.1)"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;"https://valuefy.app/blog/saas-valuation-multiples-in-2026-..."&lt;/span&gt; | &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-oE&lt;/span&gt; &lt;span class="s1"&gt;'&amp;lt;h1[^&amp;gt;]*&amp;gt;[^&amp;lt;]*&amp;lt;/h1&amp;gt;'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Two &lt;code&gt;&amp;lt;h1&amp;gt;&lt;/code&gt; elements. Both with identical text: "SaaS valuation multiples in 2026: why profitability now trumps growth-at-all-costs."&lt;/p&gt;

&lt;p&gt;The ARR calculator has one H1. A tool page I curled has one H1. It's specific to the blog template. Something in the blog page component is rendering the H1 twice — likely a layout wrapper that wraps the heading and a content renderer that also wraps it. Google recommends one H1 per page. Two identical H1s is not catastrophic, but it's unnecessary signal noise on a page that's already working against an authority gap.&lt;/p&gt;

&lt;h2&gt;
  
  
  Finding #5: The automation shipped a wrong attribution
&lt;/h2&gt;

&lt;p&gt;On April 9, commit 1513577: "fix: correct burn multiple attribution from a16z to David Sacks (Craft Ventures)."&lt;/p&gt;

&lt;p&gt;One line changed in &lt;code&gt;BurnRateCalculator.tsx&lt;/code&gt;. The burn multiple — the metric SaaS investors use to assess how efficiently a company converts burn into ARR growth — had been attributed to a16z in the page content. The actual origin is David Sacks, when he was at Craft Ventures.&lt;/p&gt;

&lt;p&gt;This one was caught by a human reading the page, not by any automated check. The daily SEO routine adds content, but it doesn't have a fact-checking pass. It can add a plausible-sounding claim — "popularized by a16z" — that's directionally correct (a16z does use the metric and has written about it) but wrong on origination.&lt;/p&gt;

&lt;p&gt;The ARR, LTV, MRR, Churn Rate, and Funding calculators were all updated by the same routine this week. I have no systematic way right now to know whether similar errors were introduced in those improvements. The burn multiple error was one change in one file. The others are in review.&lt;/p&gt;

&lt;p&gt;This is the quality risk that comes with automated content at scale: the machine is confident, fast, and occasionally wrong about attribution.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I'm going to do about it
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Fix the &lt;code&gt;og:title&lt;/code&gt; duplicate — this week, no exceptions.&lt;/strong&gt; Strip the four static tags from &lt;code&gt;index.html&lt;/code&gt;. The Helmet tags are correct; the static tags are just noise fighting them.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Investigate the double H1 in the blog template.&lt;/strong&gt; Find the component that's rendering it twice and remove one. Should be a 10-minute fix once located.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Audit the five calculator pages improved this week for attribution claims.&lt;/strong&gt; Manual review of any sentence that names an external source, framework, or benchmark. The burn multiple fix was one line; the others probably need the same scan.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;For the SaaS valuation blog: find the queries with volume.&lt;/strong&gt; Position 1 on a one-impression query is useless. The page is clearly about the right topic — Google is matching it to correct intent. The next step is identifying which of those queries have actual monthly volume and whether the page directly answers the question they're asking.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Add a canonical &lt;code&gt;rel="canonical"&lt;/code&gt; audit to the next investigation pass.&lt;/strong&gt; The trailing slash split shows that canonical tags exist but aren't preventing the split. The underlying bug is the static &lt;code&gt;og:url&lt;/code&gt; tag, same as the &lt;code&gt;og:title&lt;/code&gt; problem.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The uncomfortable lesson
&lt;/h2&gt;

&lt;p&gt;Week one taught me that ranking high requires authority signals — backlinks, brand mentions — that no amount of on-page automation can substitute for. The constraint was authority.&lt;/p&gt;

&lt;p&gt;Week two added a second constraint: even if you have the position, the query has to have volume. You can write a technically perfect post, optimize every tag, fix every heading structure, and rank #1 — for something nobody searches for.&lt;/p&gt;

&lt;p&gt;The two constraints are independent. A low-authority new domain is unlikely to rank for high-volume queries because those positions are locked by established sites. But a new domain CAN rank for long-tail queries, because there's less competition. The catch is that truly long-tail queries, specific enough to be rankable, are often specific enough to have almost no traffic.&lt;/p&gt;

&lt;p&gt;This is not a new insight in SEO. It's documented everywhere. I just hadn't felt it on my own data until now.&lt;/p&gt;

&lt;p&gt;What I keep tripping over, though, isn't the SEO theory. It's the gap between identifying something and fixing it. The &lt;code&gt;og:title&lt;/code&gt; bug was in last week's post. It's still live this week. The automation is running every night. The fixes aren't. That asymmetry is the actual bottleneck — not the rankings, not the bugs, not the content quality. The rate at which identified issues get resolved.&lt;/p&gt;

&lt;p&gt;I'll check back in a week. If the &lt;code&gt;og:title&lt;/code&gt; fix is still not deployed by next Sunday, I'll say that too.&lt;/p&gt;




&lt;p&gt;I'm Sampsa, CEO at &lt;a href="https://aimiten.fi" rel="noopener noreferrer"&gt;AImiten&lt;/a&gt;. We build AI tooling for companies — and sometimes I run experiments on my own side projects to stress-test the ideas. &lt;a href="https://valuefy.app" rel="noopener noreferrer"&gt;valuefy.app&lt;/a&gt; is one of those experiments. If you're curious what we do at AImiten, &lt;a href="https://aimiten.fi" rel="noopener noreferrer"&gt;have a look&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>seo</category>
      <category>webdev</category>
      <category>ai</category>
      <category>claude</category>
    </item>
    <item>
      <title>I Ran a Full SEO Audit on My Side Project — 45 Clicks in 90 Days. Here's What I Found</title>
      <dc:creator>Aimiten</dc:creator>
      <pubDate>Tue, 14 Apr 2026 21:08:13 +0000</pubDate>
      <link>https://dev.to/aimiten/i-ran-a-full-seo-audit-on-my-side-project-45-clicks-in-90-days-heres-what-i-found-41pl</link>
      <guid>https://dev.to/aimiten/i-ran-a-full-seo-audit-on-my-side-project-45-clicks-in-90-days-heres-what-i-found-41pl</guid>
      <description>&lt;p&gt;We have 160 calculator pages on &lt;a href="https://valuefy.app" rel="noopener noreferrer"&gt;valuefy.app&lt;/a&gt;. I spent most of February rewriting every single page title and meta description by hand. I spent March wiring up a daily Claude Code routine that now improves one calculator page every night. There's a full blog-writing automation for new posts every Monday and Tuesday, a weekday blog audit routine, an AI-powered internal linking queue on Supabase, and a Puppeteer prerender step that runs on every build.&lt;/p&gt;

&lt;p&gt;Since January I've been in Google Search Console constantly — submitting 10 URLs a day for indexing, glancing at the weekly totals.&lt;/p&gt;

&lt;p&gt;Last week I stopped glancing. I pulled the 90-day data into a spreadsheet for the first time and looked at it properly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;45 clicks.&lt;/strong&gt; Not per day. Total. Over 90 days.&lt;/p&gt;

&lt;p&gt;This is what I found when I actually dug in.&lt;/p&gt;

&lt;h2&gt;
  
  
  The setup
&lt;/h2&gt;

&lt;p&gt;Here's what was running at audit time:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;160 calculator pages (ROI, CAC, LTV, burn rate, runway, EBITDA — the usual SaaS/finance suspects)&lt;/li&gt;
&lt;li&gt;~70 of them submitted to Google for indexing via the URL Inspection tool (batched 10/day because of the quota)&lt;/li&gt;
&lt;li&gt;A daily Claude Code routine that picks one calculator and improves its body content — verified benchmarks, worked examples, internal links. Started about three weeks ago, 11 commits deep so far.&lt;/li&gt;
&lt;li&gt;Two blog-writing routines, one on Mondays and one on Tuesdays, both pick a keyword, research it against competitors, and publish a new React page&lt;/li&gt;
&lt;li&gt;A blog audit routine every weekday that verifies facts, checks links, fixes structure&lt;/li&gt;
&lt;li&gt;A Supabase edge function applying AI-powered internal links to a queue&lt;/li&gt;
&lt;li&gt;React Helmet for meta tags, full Puppeteer-based prerendering of every route at build time&lt;/li&gt;
&lt;li&gt;February's mass rewrites: every single tool page title and meta description rewritten by hand for specificity&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On paper this is a lot of SEO work. More than most agencies ship for paying clients. I'd assumed that with this much surface area being polished, clicks had to be climbing steadily.&lt;/p&gt;

&lt;p&gt;They weren't climbing. They'd never been climbing.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I expected vs what the data showed
&lt;/h2&gt;

&lt;p&gt;I expected positions slowly improving on target keywords. Maybe a handful of calculators already in the top 10. Some impressions turning into clicks as metadata settled.&lt;/p&gt;

&lt;p&gt;What I got:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Page&lt;/th&gt;
&lt;th&gt;Impressions (90d)&lt;/th&gt;
&lt;th&gt;Position&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;/tools/roi-calculator/&lt;/td&gt;
&lt;td&gt;1,483&lt;/td&gt;
&lt;td&gt;58&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;/tools/markup-calculator/&lt;/td&gt;
&lt;td&gt;629&lt;/td&gt;
&lt;td&gt;56&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;/tools/pe-ratio-calculator/&lt;/td&gt;
&lt;td&gt;524&lt;/td&gt;
&lt;td&gt;29&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;/tools/cpc-calculator/&lt;/td&gt;
&lt;td&gt;468&lt;/td&gt;
&lt;td&gt;48&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;/tools/hourly-rate-calculator/&lt;/td&gt;
&lt;td&gt;418&lt;/td&gt;
&lt;td&gt;59&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;/tools/churn-rate-calculator/&lt;/td&gt;
&lt;td&gt;378&lt;/td&gt;
&lt;td&gt;71&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;/tools/google-ads-calculator/&lt;/td&gt;
&lt;td&gt;359&lt;/td&gt;
&lt;td&gt;74&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;/tools/conversion-rate-calculator/&lt;/td&gt;
&lt;td&gt;321&lt;/td&gt;
&lt;td&gt;53&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;/tools/burn-rate-calculator/&lt;/td&gt;
&lt;td&gt;280&lt;/td&gt;
&lt;td&gt;73&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;/tools/ctr-calculator/&lt;/td&gt;
&lt;td&gt;265&lt;/td&gt;
&lt;td&gt;59&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Every page with meaningful impressions is sitting somewhere around page 5-8 of Google. Not page 2. Not "almost there." Basement-level.&lt;/p&gt;

&lt;h2&gt;
  
  
  Finding #1: Google has already judged these pages
&lt;/h2&gt;

&lt;p&gt;Here's the uncomfortable part. Google knows the &lt;a href="https://valuefy.app/tools/roi-calculator/" rel="noopener noreferrer"&gt;ROI calculator&lt;/a&gt; exists. It matches the page to the query "roi calculator" correctly. It has crawled it, rendered it, looked at it, and decided: rank 58 material.&lt;/p&gt;

&lt;p&gt;All the content automation in the world doesn't change that assessment on its own. Over the last three weeks my daily routine has been adding worked examples and verified benchmarks to page after page. Google has seen all of it and the positions haven't moved. Because the problem isn't the content. The problem is authority signals — backlinks, brand mentions, referring traffic from trusted sources. The kind of thing you can't write a prompt for.&lt;/p&gt;

&lt;p&gt;I'd somehow convinced myself that "enough good content" would eventually overpower the authority gap. The data says no. When you're a new domain with almost no backlinks, targeting head terms dominated by long-established financial-media sites, no amount of on-page polish moves you from page 6 to page 1.&lt;/p&gt;

&lt;h2&gt;
  
  
  Finding #2: The quick win that wasn't
&lt;/h2&gt;

&lt;p&gt;This one I'm almost embarrassed about.&lt;/p&gt;

&lt;p&gt;I was pulling page-level metrics and saw &lt;a href="https://valuefy.app/tools/loan-payment-calculator/" rel="noopener noreferrer"&gt;/tools/loan-payment-calculator/&lt;/a&gt; sitting at an average position of &lt;strong&gt;9.8&lt;/strong&gt; with 299 impressions and zero clicks. Position ten. Already on page one. A CTR problem, not a rankings problem. A 30-minute fix.&lt;/p&gt;

&lt;p&gt;I got excited. I started drafting the title rewrite in my head before I'd even opened the page.&lt;/p&gt;

&lt;p&gt;Then I opened the page. The title was fine:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Loan Payment Calculator: Monthly &amp;amp; Total Interest | Valuefy
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;58 characters, descriptive, specific, mentions "monthly" and "total interest" which are the two things a searcher actually wants to know. The meta description was also fine — "Free loan payment calculator: enter amount, rate, and term to see monthly payment, total interest paid, and payoff date. Auto, mortgage, and personal loans." Benefit-driven, 155 characters, specific use cases.&lt;/p&gt;

&lt;p&gt;So I pulled the query-level breakdown for that page, expecting to see one big query at position 9.8. Here's what GSC actually returned:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Query&lt;/th&gt;
&lt;th&gt;Impressions&lt;/th&gt;
&lt;th&gt;Position&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;15000 loan 4.5% 36 months monthly payment&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;2.5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;add on interest monthly payment&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;62.9&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;calculate loan amount from payment and interest rate&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;98&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;payment calculator with interest paid&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;93&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Thirteen impressions. Across four ultra-specific queries. I was missing two hundred and eighty-six impressions.&lt;/p&gt;

&lt;p&gt;The rest of them were GSC's privacy-threshold graveyard — queries with one or two impressions that don't show up in the query breakdown at all. Dozens of tiny long-tail variations, each getting crumbs of traffic from different positions scattered between 2 and 100.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The "9.8 average position" was the arithmetic mean of that graveyard.&lt;/strong&gt; It wasn't a real top-10 ranking at all. It was one query at position 2.5 and one at position 98 averaging out to look like hope.&lt;/p&gt;

&lt;p&gt;There was no title fix. There was nothing to fix. The page just has a weirdly diffuse distribution of tiny long-tail queries with no dominant intent target, and GSC's aggregate math lied to me about what that meant.&lt;/p&gt;

&lt;p&gt;That's the thing about SEO metrics. Every aggregate hides a distribution, and every distribution hides a reason.&lt;/p&gt;

&lt;h2&gt;
  
  
  Finding #3: I don't rank #1 for my own brand name
&lt;/h2&gt;

&lt;p&gt;The query "valuefy" gets 325 impressions per month. Position 9. Five clicks.&lt;/p&gt;

&lt;p&gt;Let that sit. My site, literally called valuefy, ranks ninth for its own brand name. Even searches for the misspelling "vacuefy" (269 impressions) put us at position 6 with zero clicks.&lt;/p&gt;

&lt;p&gt;Part of this is the authority problem again — a new domain without external mentions isn't obviously "the valuefy" Google should trust. But part of it is something I can actually fix. I curled the homepage to see what Google sees:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;title&amp;gt;&lt;/span&gt;Free Business Calculators &lt;span class="err"&gt;&amp;amp;&lt;/span&gt; AI Generators | Valuefy&lt;span class="nt"&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The brand name is at the end of the title, after the pipe. From Google's perspective, the primary tokens are "Free," "Business," "Calculators," "AI," and "Generators." "Valuefy" is tacked on like an afterthought. I'm telling Google "this page is about free business calculators that happens to be made by somebody called Valuefy," and then I'm surprised the homepage doesn't rank #1 for "valuefy."&lt;/p&gt;

&lt;p&gt;Lead with the brand on the homepage. Organization schema with sameAs links to the social profiles that do exist. That's a 20-minute fix, not a three-month fix.&lt;/p&gt;

&lt;h2&gt;
  
  
  Finding #4: I'm invisible in the markets I actually care about
&lt;/h2&gt;

&lt;p&gt;Top countries by clicks, 90 days:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Country&lt;/th&gt;
&lt;th&gt;Clicks&lt;/th&gt;
&lt;th&gt;Impressions&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;India&lt;/td&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;1,177&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;France&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;448&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Malaysia&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;214&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Egypt&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;94&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Nigeria&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;125&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pakistan&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;189&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;USA&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;not in top 20&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;I'm running an English-language SaaS tool site and Google is showing it primarily to users in India, France, Malaysia, Nigeria, and Pakistan. The USA — the single biggest English SEO market on earth — doesn't crack the top 20 countries by impression volume.&lt;/p&gt;

&lt;p&gt;I don't have a clean answer yet. Possible culprits: missing hreflang, hosting region in Europe adding latency to US crawls, no US-specific content hooks, or simply DR so low we don't surface at all in the world's most competitive SERP. I'll rule these out one at a time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Finding #5: I found one real technical bug on the way
&lt;/h2&gt;

&lt;p&gt;While curling pages to investigate Finding #3, I noticed something odd in the HTML. Every page has &lt;strong&gt;two &lt;code&gt;og:title&lt;/code&gt; meta tags&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;property=&lt;/span&gt;&lt;span class="s"&gt;"og:title"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"Valuefy - Free Business Calculators &amp;amp; Financial Tools"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
...
&lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;property=&lt;/span&gt;&lt;span class="s"&gt;"og:title"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"Loan Payment Calculator: Monthly &amp;amp; Total Interest | Valuefy"&lt;/span&gt; &lt;span class="na"&gt;data-rh=&lt;/span&gt;&lt;span class="s"&gt;"true"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The first one is static, baked into &lt;code&gt;index.html&lt;/code&gt;. The second is injected by React Helmet during prerender. Same story for &lt;code&gt;og:description&lt;/code&gt;. Two competing tags per page, on every route.&lt;/p&gt;

&lt;p&gt;Which one wins depends on which crawler you ask. Most modern crawlers take the last one, but some take the first. For social sharing, this means some platforms are showing a generic site-wide title for every individual page — the exact opposite of what the rest of the SEO work has been trying to achieve.&lt;/p&gt;

&lt;p&gt;Fix: strip the static &lt;code&gt;og:&lt;/code&gt; tags out of &lt;code&gt;index.html&lt;/code&gt; and let React Helmet be the single source. Same for the static &lt;code&gt;&amp;lt;meta name="description"&amp;gt;&lt;/code&gt; tag that's also fighting with the hydrated one. About 15 minutes of work, touches one file.&lt;/p&gt;

&lt;p&gt;This wasn't the bug I was looking for. But it's the one I found, and it's the one I can fix tonight.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I'm going to do about it
&lt;/h2&gt;

&lt;p&gt;None of these is "more content."&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Fix the duplicate &lt;code&gt;og:&lt;/code&gt; tags&lt;/strong&gt; — tonight. Strip the static fallbacks from &lt;code&gt;index.html&lt;/code&gt;. One-file change.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fix brand SERP&lt;/strong&gt; — lead the homepage title with "Valuefy," add proper Organization schema with sameAs links. Twenty minutes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Investigate the geo problem&lt;/strong&gt; — verify hreflang, check hosting region, look at what signals Google is using to decide our audience.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Build authority slowly, honestly&lt;/strong&gt; — no routine, no script, no prompt fixes DR from zero. Outreach, guest posts, directory submissions, off-site work that compounds over 6-12 months. Including this post, which is the first brick.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pause new tool pages and new blog posts&lt;/strong&gt; — not forever, but until I know which of the existing 160 can actually be rescued. I'd rather run one audit routine that tells me which pages improved week over week than ship more content into a pile Google has already rated.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The uncomfortable lesson
&lt;/h2&gt;

&lt;p&gt;Before the audit, if you'd asked me what my SEO strategy was, I'd have said: "Build valuable tools, write good content, automate the tedium, let time do the work." All of those things have been happening, every day, on autopilot and by hand, for three months.&lt;/p&gt;

&lt;p&gt;None of it mattered because none of it changed the one variable that was actually constraining the outcome.&lt;/p&gt;

&lt;p&gt;Worse, the data tricked me twice inside one audit. Once at the top level — 45 clicks was lower than I'd been willing to admit. And once at the exception level — Finding #2 looked like hope and turned out to be an averaged fiction. Aggregates hide distributions. Distributions hide reasons. The only way out is to pull the actual query-level data and look at it with both eyes open.&lt;/p&gt;

&lt;p&gt;Automation is a force multiplier on a working strategy. It is not a strategy by itself. Running faster in the wrong direction just gets you lost faster.&lt;/p&gt;

&lt;p&gt;I don't know yet if the things I'm about to try will work. I'll check back in a month with whatever the data says. If the answer is "still 45 clicks," I'll say that too.&lt;/p&gt;




&lt;p&gt;I'm Sampsa, CEO at &lt;a href="https://aimiten.fi" rel="noopener noreferrer"&gt;AImiten&lt;/a&gt;. We build AI tooling for companies — and sometimes I run experiments on my own side projects to stress-test the ideas. &lt;a href="https://valuefy.app" rel="noopener noreferrer"&gt;valuefy.app&lt;/a&gt; is one of those experiments. If you're curious what we do at AImiten, &lt;a href="https://aimiten.fi" rel="noopener noreferrer"&gt;have a look&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>seo</category>
      <category>webdev</category>
      <category>ai</category>
      <category>claude</category>
    </item>
    <item>
      <title>I Rebuilt Our Company Website With Astro and Claude Code - Here's What Actually Worked</title>
      <dc:creator>Aimiten</dc:creator>
      <pubDate>Mon, 30 Mar 2026 11:29:30 +0000</pubDate>
      <link>https://dev.to/aimiten/i-rebuilt-our-company-website-with-astro-and-claude-code-heres-what-actually-worked-4c3o</link>
      <guid>https://dev.to/aimiten/i-rebuilt-our-company-website-with-astro-and-claude-code-heres-what-actually-worked-4c3o</guid>
      <description>&lt;p&gt;We had an 85-page company website on Typedream. It was slow, messy, and impossible to maintain. Pages were duplicated, the design was inconsistent, and every small change meant logging into a drag-and-drop editor that fought you at every step.&lt;/p&gt;

&lt;p&gt;So I decided to rebuild the whole thing. From scratch. Using Astro, Tailwind, and Claude Code as my main coding partner.&lt;/p&gt;

&lt;p&gt;Two months later we had a 30-page site that loads faster, ranks better, and actually converts. Here's what I learned along the way — the stuff that worked, the stuff that didn't, and practical tips if you want to try the same thing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Astro
&lt;/h2&gt;

&lt;p&gt;If you haven't tried &lt;a href="https://astro.build" rel="noopener noreferrer"&gt;Astro&lt;/a&gt;, it's a web framework that ships zero JavaScript by default. You write components, and Astro renders them to static HTML. When you need interactivity — a mobile menu, a calculator, a form — you add a "React Island" that hydrates only that component.&lt;/p&gt;

&lt;p&gt;For a content-heavy site like ours, this is perfect. Most of our pages are guides, service descriptions, and comparisons. They don't need JavaScript. The few interactive bits (contact form, mobile navigation) get React, and everything else stays as fast static HTML.&lt;/p&gt;

&lt;p&gt;Our Lighthouse scores went from "meh" to consistently 95+ across the board. Not because we did anything clever, but because Astro's architecture just doesn't ship unnecessary code.&lt;/p&gt;

&lt;h3&gt;
  
  
  The stack
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Astro 5&lt;/strong&gt; with server mode (for forms and dynamic content)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;React&lt;/strong&gt; only for interactive islands&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tailwind CSS&lt;/strong&gt; with a custom design system&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Supabase&lt;/strong&gt; for contact form submissions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Plus Jakarta Sans&lt;/strong&gt; loaded locally (no Google Fonts dependency — GDPR matters in Finland)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why Claude Code
&lt;/h2&gt;

&lt;p&gt;I've used Copilot, ChatGPT, Cursor — all of them. Claude Code is the one I kept coming back to, and here's why: it actually reads your whole project.&lt;/p&gt;

&lt;p&gt;When I say "update the pricing on the Claude guide page," it doesn't just find-and-replace a number. It reads the layout, understands the component structure, checks the data layer, and makes changes that are consistent with how the rest of the site works.&lt;/p&gt;

&lt;p&gt;That said, Claude Code is not magic. It's a very capable tool that still needs a human who knows what they want. The biggest mistake I see people make is treating AI coding tools like a vending machine — put in a vague request, get out a website. That's how you end up with generic-looking sites that all feel the same.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setting up your project for AI-assisted development
&lt;/h2&gt;

&lt;p&gt;This is the part nobody talks about. The quality of your AI-generated code depends almost entirely on how you set up your project. Here's what made the biggest difference for us:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Write a proper CLAUDE.md
&lt;/h3&gt;

&lt;p&gt;This is a file in your project root that tells Claude Code how your project works. Ours includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The tech stack and how things connect&lt;/li&gt;
&lt;li&gt;Our design system rules (colors, shadows, typography, spacing)&lt;/li&gt;
&lt;li&gt;Content guidelines (tone of voice, SEO rules, author information)&lt;/li&gt;
&lt;li&gt;File structure conventions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Think of it as onboarding documentation, except your coworker is an AI that reads it every single time. The better this file is, the less you repeat yourself.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Create a design system before you start coding
&lt;/h3&gt;

&lt;p&gt;This was probably our most important decision. Before writing a single component, we defined:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Exact color values&lt;/strong&gt; — not "use blue" but &lt;code&gt;#0066FF&lt;/code&gt; for accent, &lt;code&gt;rgba(255,255,255,0.5)&lt;/code&gt; for card backgrounds&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Shadow definitions&lt;/strong&gt; — we call our style "minimalistic claymorphism." Two shadows: a subtle outer shadow and a thin white border. No complex inset shadows, no neumorphism&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Typography scale&lt;/strong&gt; — font sizes, weights, line-heights, letter-spacing for every heading level&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Border radius&lt;/strong&gt; — from 12px for buttons to 24px for large cards&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Spacing system&lt;/strong&gt; — consistent padding and gap values&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Why does this matter for AI-assisted development? Because when Claude Code has specific design tokens to work with, it generates components that actually look consistent. Without a design system, every component looks slightly different — different shadows, different spacing, different border radius. That's the "AI slop" look that people recognize instantly.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Build reusable components first
&lt;/h3&gt;

&lt;p&gt;Before creating any pages, we built a library of Astro components:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;src/components/
├── ui/          # Card, Alert, Stats, FeatureList, PricingCard...
├── seo/         # Breadcrumbs, Schema, AuthorBox, FAQSection...
├── layout/      # Header, Footer, MobileMenu (React)...
└── sections/    # CTASection, HeroSection...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each component follows the design system strictly. When I then ask Claude Code to "create a new service page," it composes from these existing building blocks rather than inventing new styles.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Use specialized layouts
&lt;/h3&gt;

&lt;p&gt;We have five layout templates, each designed for a specific content type:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;OpasLayout&lt;/strong&gt; — for guides (sticky table of contents on desktop)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PalveluLayout&lt;/strong&gt; — for service pages (hero, schema, CTA)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;BlogLayout&lt;/strong&gt; — for articles (author box, reading time)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TyokaluLayout&lt;/strong&gt; — for tools and calculators&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LandingLayout&lt;/strong&gt; — for the homepage (free-form structure)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The layouts handle all the repetitive stuff automatically: breadcrumbs, structured data, meta tags, default CTAs. Content creators (human or AI) just focus on the actual content.&lt;/p&gt;

&lt;h2&gt;
  
  
  The workflow that actually works
&lt;/h2&gt;

&lt;p&gt;Here's my daily workflow with Claude Code on this project:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For new pages:&lt;/strong&gt; I write a brief with the target keywords, the intended audience, the page structure (which H2 sections I want), and which layout to use. Claude Code creates the page using existing components and the design system. I then review and adjust the content, especially anything related to pricing or specific claims.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For updates:&lt;/strong&gt; I describe what needs to change and why. "The Claude pricing changed, update the Claude guide and the comparison pages." Claude Code finds all the relevant files, updates them consistently, and I verify.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For new components:&lt;/strong&gt; I describe the component, reference a similar existing one, and specify which design tokens to use. "Create a Timeline component similar to FeatureList but vertical, with a show-more button. Use the clay shadow and accent color for the connector line."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I never do:&lt;/strong&gt; I never ask Claude Code to "make it look nice" or "design a landing page." Vague aesthetic requests produce vague results. The more specific you are about the visual system, the better the output.&lt;/p&gt;

&lt;h2&gt;
  
  
  Managing 85 redirects without losing SEO
&lt;/h2&gt;

&lt;p&gt;One thing that scared me about the migration was losing our existing search rankings. We had 85 pages, many with organic traffic, and we were consolidating them into 30.&lt;/p&gt;

&lt;p&gt;We handled it with Astro's middleware:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// middleware.ts — simplified example&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;redirectMap&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Record&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/tekoalysovellukset&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/oppaat/ai-tyokalut-vertailu&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/mita-tekoly-on/neuroverkko&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/oppaat/llm&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/kokeile-tekoalya&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/oppaat/ai-tyokalut-vertailu&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="c1"&gt;// ... 82 more&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every old URL returns a proper 301 redirect. We mapped each old page to the most relevant new page, not just the homepage. This preserved most of our link equity and kept Google happy.&lt;/p&gt;

&lt;p&gt;The result? Our impressions grew roughly 10x in the first two months, and our average search position improved from around page 2 to the top half of page 1. Consolidating 85 thin pages into 30 comprehensive ones actually helped our SEO — Google seems to prefer fewer, better pages over many shallow ones.&lt;/p&gt;

&lt;h2&gt;
  
  
  The design philosophy: avoiding AI slop
&lt;/h2&gt;

&lt;p&gt;Every AI-built website looks the same. You've seen them: purple gradients, generic hero illustrations, "Revolutionize your workflow" headlines, emoji bullets everywhere. It's become so recognizable that people call it "AI slop."&lt;/p&gt;

&lt;p&gt;We deliberately went the other direction:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No emojis as icons.&lt;/strong&gt; We use simple symbols like ◎, ▦, ↗ or proper SVGs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No gradients.&lt;/strong&gt; Our background is a flat warm gray (#EAEAEC) with semi-transparent white cards&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No stock illustrations.&lt;/strong&gt; Real screenshots, real product images&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No hype copy.&lt;/strong&gt; We write in first person ("We offer..." not "AImiten offers...") and we're honest about limitations&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Claymorphism, not neumorphism.&lt;/strong&gt; Subtle outer shadows with a thin white border, giving depth without screaming "look at my CSS"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The irony is that building with AI makes it even more important to have strong design opinions. Claude Code will happily generate generic-looking components if you let it. The design system is your defense against mediocrity.&lt;/p&gt;

&lt;h2&gt;
  
  
  One unexpected benefit: AI crawlers love clean Astro sites
&lt;/h2&gt;

&lt;p&gt;We made a deliberate choice to allow AI crawlers (GPTBot, ClaudeBot, PerplexityBot) in our robots.txt. As an &lt;a href="https://aimiten.fi/palvelut" rel="noopener noreferrer"&gt;AI consulting company&lt;/a&gt;, we want to appear in AI-generated answers, not just traditional search results.&lt;/p&gt;

&lt;p&gt;Clean HTML, proper heading structure, schema markup, and fast load times — all things Astro gives you out of the box — seem to help with what people call GEO (Generative Engine Optimization). Our &lt;a href="https://aimiten.fi/oppaat/ai-tyokalut-vertailu" rel="noopener noreferrer"&gt;AI tools comparison guide&lt;/a&gt; regularly gets cited in AI search results, which drives a meaningful amount of traffic.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tips if you're doing this yourself
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Start with the design system, not the pages.&lt;/strong&gt; Spend a day defining your visual language. Every hour you spend here saves ten hours of inconsistency fixes later.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Keep your CLAUDE.md updated.&lt;/strong&gt; When you make a design decision or establish a new pattern, add it to the file. Future-you (and Claude Code) will thank you.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Don't let AI write your marketing copy.&lt;/strong&gt; Use it for structure, components, and repetitive code. But headlines, value propositions, and anything customer-facing should sound like a human wrote it — because a human should write it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prerender what you can.&lt;/strong&gt; Astro lets you mark individual pages as prerendered even in server mode. For content that doesn't change often (guides, service pages), this gives you static-site speed with server-side capabilities where you need them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Build for content updates.&lt;/strong&gt; We update our guides weekly — new model releases, pricing changes, feature announcements. The component architecture makes this fast. Updating a price in our data layer automatically updates it across all pages that reference it. If you're in a fast-moving space like AI, this kind of automation is worth the initial setup.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use layouts aggressively.&lt;/strong&gt; The more your layouts handle automatically (breadcrumbs, schema, CTAs, author boxes), the less can go wrong when creating new pages. Our &lt;a href="https://aimiten.fi/oppaat/claude-ai" rel="noopener noreferrer"&gt;Claude guide&lt;/a&gt; and our &lt;a href="https://aimiten.fi/palvelut/tekoalyvalmennus" rel="noopener noreferrer"&gt;AI coaching page&lt;/a&gt; look completely different but share the same structural guarantees.&lt;/p&gt;

&lt;h2&gt;
  
  
  Was it worth it?
&lt;/h2&gt;

&lt;p&gt;Two months in, the numbers speak for themselves. Search visibility grew 10x. Session duration doubled. Bounce rate dropped. And most importantly, I can update any page in minutes instead of fighting a no-code editor.&lt;/p&gt;

&lt;p&gt;The combination of Astro's performance-first architecture and Claude Code's project-wide understanding is genuinely powerful. But the key insight is this: AI coding tools amplify your decisions, good and bad. A solid design system and clear project structure turn Claude Code into an incredibly productive partner. Without them, you just get fast-generated mediocrity.&lt;/p&gt;

&lt;p&gt;If you're considering a similar rebuild, start with the foundation. The code will follow.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;I'm Sampsa, CEO at AImiten. We help companies figure out how to actually use AI — not just talk about it. If you're curious, &lt;a href="https://aimiten.fi/palvelut" rel="noopener noreferrer"&gt;check out what we do&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>astro</category>
      <category>webdev</category>
      <category>ai</category>
      <category>claude</category>
    </item>
    <item>
      <title>Building Arvento: Automating Business Valuations with AI and Real-Time</title>
      <dc:creator>Aimiten</dc:creator>
      <pubDate>Tue, 14 Oct 2025 11:25:01 +0000</pubDate>
      <link>https://dev.to/aimiten/building-arvento-automating-business-valuations-with-ai-and-real-time-gk3</link>
      <guid>https://dev.to/aimiten/building-arvento-automating-business-valuations-with-ai-and-real-time-gk3</guid>
      <description>&lt;p&gt;Built a tool that automates business valuations for Finnish SMEs.&lt;/p&gt;

&lt;p&gt;What it does:Connects to business registries, pulls financial data, runs valuation calculations, generates reports.&lt;/p&gt;

&lt;p&gt;Stack:React, TypeScript, Supabase, AI for analysis&lt;/p&gt;

&lt;p&gt;Why:Consultants charge €2000+ and take weeks. We do it instantly for €89.&lt;/p&gt;

&lt;p&gt;Try it for free &lt;a href="https://arvento.fi/free-calculator" rel="noopener noreferrer"&gt;Try our free calculator&lt;/a&gt; to automate this entirely.&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
