<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[QuickGradeCalc Dev Blog]]></title><description><![CDATA[Notes from building QuickGradeCalc, a free grade calculator, with Next.js: privacy-first design, testing calculator logic, and technical SEO with real data.]]></description><link>https://quickgradecalcdevblog.hashnode.dev</link><image><url>https://cdn.hashnode.com/uploads/logos/6ad5a06a905834e104e839c5/fcfad8d8-e603-44ba-8bc8-412f0dc30dda.png</url><title>QuickGradeCalc Dev Blog</title><link>https://quickgradecalcdevblog.hashnode.dev</link></image><generator>RSS for Node</generator><lastBuildDate>Wed, 04 Nov 2026 16:36:50 GMT</lastBuildDate><atom:link href="https://quickgradecalcdevblog.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[What 28 Days of Search Console Data Taught Me About SEO for a New Next.js Site]]></title><description><![CDATA[What I learned from 28 days of Google Search Console data on brand new Next.js grade calculator impressions, rankings, and the fixes I'm making next.]]></description><link>https://quickgradecalcdevblog.hashnode.dev/what-28-days-of-search-console-data-taught-me-about-seo-for-a-new-next-js-site</link><guid isPermaLink="true">https://quickgradecalcdevblog.hashnode.dev/what-28-days-of-search-console-data-taught-me-about-seo-for-a-new-next-js-site</guid><category><![CDATA[Next.js]]></category><category><![CDATA[SEO]]></category><category><![CDATA[Web Development]]></category><category><![CDATA[JavaScript]]></category><category><![CDATA[Google Search Console]]></category><dc:creator><![CDATA[QuickGradeCalc]]></dc:creator><pubDate>Tue, 20 Oct 2026 20:58:48 GMT</pubDate><content:encoded><![CDATA[<p>I launched a free grade calculator built with Next.js, spent nothing on ads, and bought no links. That left one honest source of feedback on how Google viewed it: Google Search Console. This post walks through my first 28 days of that data, explains what each number means, and lists the technical fixes the data pointed to. The traffic is tiny, but the patterns are the same ones larger sites deal with.</p>
<h2>Search Console metrics, defined</h2>
<p>Before the data, a quick glossary, because these four terms get mixed up constantly:</p>
<ul>
<li><p><strong>Impressions:</strong> how many times a page from your site appeared in search results, whether or not anyone saw it or clicked.</p>
</li>
<li><p><strong>Clicks:</strong> how many times someone clicked through to your site from those results.</p>
</li>
<li><p><strong>Click-through rate (CTR):</strong> clicks divided by impressions.</p>
</li>
<li><p><strong>Average position:</strong> the mean ranking of your pages across all the queries they appeared for. Positions 1 to 10 are roughly the first page.</p>
</li>
</ul>
<h2>My first 28 days, in numbers</h2>
<table>
<thead>
<tr>
<th>Metric</th>
<th>Result</th>
</tr>
</thead>
<tbody><tr>
<td>Impressions</td>
<td>337</td>
</tr>
<tr>
<td>Clicks</td>
<td>6</td>
</tr>
<tr>
<td>CTR</td>
<td>about 1.8%</td>
</tr>
<tr>
<td>Average position</td>
<td>about 43</td>
</tr>
</tbody></table>
<p>At an average position near 43, most of my pages sat on the fourth or fifth page of results. Few searchers go that deep, so the site was visible to Google's index but almost invisible to people. Being indexed and ranking well are separate achievements, and a new site reaches the first long before the second.</p>
<h2>Five patterns in the data</h2>
<p><strong>1. Visibility came in a burst, not a slope.</strong> Roughly half of all impressions landed in the final three days of the window. Google appears to test new pages with a small audience and widen it when the signals look acceptable, so a flat early graph can change suddenly.</p>
<p><strong>2. Position improved while I was watching the wrong metric.</strong> I was checking clicks, which barely moved. The better signal was position: daily averages fell from the 60s to 80s in late September to roughly the 14 to 35 range in October. A falling position number means the page is climbing.</p>
<p><strong>3. A narrow page beat my homepage.</strong> My best-ranking page was a single-purpose tool that converts a percentage into a letter grade, at around position 18. It matched one clear search intent. The homepage tried to cover everything and ranked lower.</p>
<p><strong>4. The audience was not the one I designed for.</strong> Many queries came from teachers looking for grading tools, and many more were short numeric questions in the pattern of "what is X out of Y". Those are long-tail queries: specific, low-competition, and easy to answer with a dedicated page.</p>
<p><strong>5. Impressions and clicks came from different places.</strong> About three quarters of impressions came from the United States, with no clicks, because I ranked too low there to be seen. The few clicks I did get came from Pakistan and India. Rankings vary by country, so an overall average can hide very different local stories.</p>
<h2>Three technical issues the data exposed</h2>
<h3>Duplicate hostnames</h3>
<p>Both the <code>www</code> and non-<code>www</code> versions of my domain appeared in the reports. Search engines can treat them as separate sites and split ranking signals between them. Pick one version, redirect the other to it, and use the chosen version in every link and profile you create. In Next.js, a host-based redirect in <code>next.config.js</code> does it:</p>
<pre><code class="language-js">// next.config.js (excerpt)
module.exports = {
  async redirects() {
    return [
      {
        source: "/:path*",
        has: [{ type: "host", value: "example.com" }],
        destination: "https://www.example.com/:path*",
        permanent: true,
      },
    ];
  },
};
</code></pre>
<p>Next.js sends a 308 status for <code>permanent: true</code>, which Google treats as a permanent redirect, the same as a 301. You can verify it from a terminal:</p>
<pre><code class="language-bash">curl -I https://example.com/
# Expect: HTTP/2 308 and a location header pointing to https://www.example.com/
</code></pre>
<h3>Weak titles for click-through</h3>
<p>CTR depends on how well the title and description match what a searcher typed. I'm rewriting each page title around the exact question it answers, followed by a short benefit.</p>
<h3>Missing canonical tags</h3>
<p>A canonical URL tells search engines which address is the preferred version of a page. With the Next.js App Router, you set it in the page's metadata:</p>
<pre><code class="language-js">// app/percentage-to-letter-grade-calculator/page.jsx
export const metadata = {
  title: "Percentage to Letter Grade Calculator",
  description: "Convert any percentage to a letter grade in seconds.",
  alternates: {
    canonical: "https://www.example.com/percentage-to-letter-grade-calculator",
  },
};
</code></pre>
<h2>What I'm changing next</h2>
<ol>
<li><p><strong>Create pages for specific long-tail queries,</strong> each with a short explanation and worked examples.</p>
</li>
<li><p><strong>Expand the page that already ranks,</strong> adding a conversion table and a few frequently asked questions.</p>
</li>
<li><p><strong>Build a page for teachers,</strong> since they are an audience the data revealed.</p>
</li>
<li><p><strong>Strengthen internal linking,</strong> so related pages point to each other with descriptive anchor text.</p>
</li>
<li><p><strong>Earn links from relevant pages,</strong> such as teacher and student resource lists, since a link someone chose to give carries more weight than a profile I created myself.</p>
</li>
</ol>
<h2>Frequently asked questions</h2>
<p><strong>What is a good average position in Search Console?</strong> Positions 1 to 10 are the first page of results. Remember that the average blends every query, so one strong ranking and many weak ones can produce a middling number.</p>
<p><strong>Why do I get impressions but almost no clicks?</strong> Usually because the page ranks too low to be noticed, or because the title doesn't match what people searched. Check position first, then the title.</p>
<p><strong>Does it matter whether I use www or non-www?</strong> The choice itself doesn't matter, but consistency does. Redirect one version to the other and use only that version in links.</p>
<p><strong>How long does a new site take to rank?</strong> There is no guaranteed timeline. In my case, impressions started to rise within weeks, but meaningful clicks require a higher position than I have today.</p>
<p><strong>How often should I check Search Console?</strong> Weekly is enough. A single day is mostly noise, and the trend over several weeks is what tells you something.</p>
<h2>Takeaways</h2>
<ul>
<li><p>Track position and impressions early, since clicks lag behind them.</p>
</li>
<li><p>Build one page per search intent instead of one page for everything.</p>
</li>
<li><p>Fix duplicate hostnames and canonicals before chasing more content.</p>
</li>
<li><p>Read your query list, because it shows the audience you actually have.</p>
</li>
</ul>
<p>I'm documenting this as I go on <a href="https://www.quickgradecalc.online/">QuickGradeCalc</a>, a free grade calculator for students and teachers. If you're in your own first month of Search Console data, what stood out to you?</p>
]]></content:encoded></item></channel></rss>