<?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>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>
