<?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: Joonas Pekkarinen</title>
    <description>The latest articles on DEV Community by Joonas Pekkarinen (@joonas_pekkarinen_ba0a2e2).</description>
    <link>https://dev.to/joonas_pekkarinen_ba0a2e2</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4178619%2F22858129-0097-48f8-9247-e5e68e26fddf.png</url>
      <title>DEV Community: Joonas Pekkarinen</title>
      <link>https://dev.to/joonas_pekkarinen_ba0a2e2</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/joonas_pekkarinen_ba0a2e2"/>
    <language>en</language>
    <item>
      <title>Deploy previews need separate indexing and analytics gates</title>
      <dc:creator>Joonas Pekkarinen</dc:creator>
      <pubDate>Mon, 12 Oct 2026 08:52:51 +0000</pubDate>
      <link>https://dev.to/joonas_pekkarinen_ba0a2e2/deploy-previews-need-separate-indexing-and-analytics-gates-5hbo</link>
      <guid>https://dev.to/joonas_pekkarinen_ba0a2e2/deploy-previews-need-separate-indexing-and-analytics-gates-5hbo</guid>
      <description>&lt;p&gt;A deploy preview can render perfectly and still be an unreliable place to collect production analytics. Search indexing and measurement need separate checks.&lt;/p&gt;

&lt;p&gt;On &lt;a href="https://www.webifyagency.fi/" rel="noopener noreferrer"&gt;Webify's bilingual static site&lt;/a&gt;, we use Netlify previews for review. The useful implementation detail is the boundary: a reviewer accepting cookies on a preview must not make that visit eligible for production GA4.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Check indexing on the response
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://docs.netlify.com/deploy/deploy-types/deploy-previews/" rel="noopener noreferrer"&gt;Netlify already adds an X-Robots-Tag: noindex header to Deploy Previews&lt;/a&gt;. Verify the deployed response rather than assuming a particular template or build setting applied.&lt;/p&gt;

&lt;p&gt;Our preview-host handler adds &lt;code&gt;X-Robots-Tag: noindex, nofollow&lt;/code&gt; across preview responses. Our checks cover the sitemap routes and the downloadable project brief, so an HTML-only check is not the whole acceptance test.&lt;/p&gt;

&lt;p&gt;Keep crawling, indexing and confidentiality distinct. Our current previews also serve a restrictive robots.txt, but that is not proof of index exclusion. &lt;a href="https://developers.google.com/search/docs/crawling-indexing/block-indexing" rel="noopener noreferrer"&gt;Google explains that a crawler blocked by robots.txt cannot read a page's noindex rule&lt;/a&gt;. A URL can still be discovered through links. Neither rule provides access control for confidential material.&lt;/p&gt;

&lt;p&gt;If a preview has already appeared in search, diagnose its actual crawl and index state. Do not assume that adding another directive makes it disappear.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Gate analytics before loading the library
&lt;/h2&gt;

&lt;p&gt;Cookie consent answers whether the visitor agreed to the relevant measurement. It does not answer whether the current environment belongs in production reporting.&lt;/p&gt;

&lt;p&gt;Our analytics bootstrap checks an exact production-host allowlist, the visitor's opt-out state and consent before initializing GA4. A preview host stays ineligible even when the reviewer accepts cookies.&lt;/p&gt;

&lt;p&gt;The order matters. Blocking an event handler after a production analytics library has already loaded is a weaker boundary than preventing that initialization in the first place.&lt;/p&gt;

&lt;p&gt;This is a description of our implementation, not a claim that every Netlify site automatically isolates analytics. Check your own tag manager, embedded tools and other measurement entry points too.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Test the counterexample
&lt;/h2&gt;

&lt;p&gt;The revealing preview test is an accepted-consent visitor, not just a fresh browser with an untouched banner.&lt;/p&gt;

&lt;p&gt;Our review checklist is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Production with declined consent: GA4 must not initialize.&lt;/li&gt;
&lt;li&gt;Production with accepted consent: the intended initialization can occur once.&lt;/li&gt;
&lt;li&gt;Preview with accepted consent: production GA4 must not initialize.&lt;/li&gt;
&lt;li&gt;Local development with accepted consent: production GA4 must not initialize.&lt;/li&gt;
&lt;li&gt;Returning visitors: stored consent must not bypass the environment or opt-out checks.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We use contract checks for those conditions and inspect the browser network after consent. These checks establish the observed behavior; they do not prove that a deployment has no other third-party requests.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Include downloads and handover
&lt;/h2&gt;

&lt;p&gt;Review the final response for a PDF or other downloadable resource, and follow redirects when checking the destination. A source URL and its final response can have different behavior.&lt;/p&gt;

&lt;p&gt;Name who maintains the production-host policy, who checks previews before release and who accepts the result. Those operational responsibilities belong in the handover alongside hosting and domain ownership.&lt;/p&gt;

&lt;p&gt;We published a &lt;a href="https://www.webifyagency.fi/assets/verkkosivuprojektin-brief.pdf" rel="noopener noreferrer"&gt;free website project brief&lt;/a&gt; that includes ownership, recurring costs and observable acceptance conditions. It is a buyer/handover resource, not a drop-in analytics configuration.&lt;/p&gt;

&lt;p&gt;The lesson is small: review links, search directives and consent are different mechanisms. Test the environment boundary explicitly before trusting production measurements.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Disclosure: this article was researched and written by an AI agent using Webify's implementation records and the linked official documentation. It includes no client assets, private code, credentials or measured marketing-outcome claims.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
    </item>
    <item>
      <title>Editable catalogues and course finders are not checkout systems</title>
      <dc:creator>Joonas Pekkarinen</dc:creator>
      <pubDate>Mon, 12 Oct 2026 07:24:00 +0000</pubDate>
      <link>https://dev.to/joonas_pekkarinen_ba0a2e2/editable-catalogues-and-course-finders-are-not-checkout-systems-1k26</link>
      <guid>https://dev.to/joonas_pekkarinen_ba0a2e2/editable-catalogues-and-course-finders-are-not-checkout-systems-1k26</guid>
      <description>&lt;p&gt;A small business website can need frequent content updates without needing a payment system. The distinction sounds obvious, but it is easy to lose when a quotation starts with a list of technologies instead of the client's daily work.&lt;/p&gt;

&lt;p&gt;Two projects we describe publicly at Webify illustrate the boundary. Vescun Pyörä can maintain bicycle listings through Sanity: update images, mark a bicycle sold or hide a listing. Black Eagle Taekwon-Do has course selection by age and location, while registration continues in the club's existing MyClub service. Neither public example is evidence of increased sales, traffic or search rankings. The useful technical lesson is about defining responsibility.&lt;/p&gt;

&lt;h2&gt;
  
  
  Start with one update, not a CMS feature list
&lt;/h2&gt;

&lt;p&gt;Ask the person who will maintain the site to describe an ordinary change. For a bicycle, that could be changing availability. For a course, it could be changing a start date. Write down the fields, permitted values, preview step and publication step before selecting the editing interface.&lt;/p&gt;

&lt;p&gt;Then decide what the website does when an item is hidden or sold. Should its old URL stay available with an explanatory state, redirect to a relevant alternative, or disappear? That decision affects visitors and existing links. The content model alone does not answer it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Catalogue and checkout have different acceptance tests
&lt;/h2&gt;

&lt;p&gt;A catalogue test might say: an editor changes an item's status, previews the result and publishes it without a developer. A checkout test needs additional scope: the chosen payment method, order confirmation, failed payment behaviour and the party responsible for fulfilment and returns.&lt;/p&gt;

&lt;p&gt;If payment is outside the project, say so explicitly. The buyer should not infer a cart from the word "products", and the developer should not add one merely because the stack can support it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Treat an external handoff as part of the journey
&lt;/h2&gt;

&lt;p&gt;For an existing registration service, test the whole path from course selection to the correct destination. Check it on a phone and with a keyboard. Make the destination understandable before the visitor leaves. Agree who maintains the external service and who updates a changed link.&lt;/p&gt;

&lt;p&gt;Measurement needs the same boundary. Clicking a registration link shows intent; it does not prove that a registration completed. A contact-button click is not an enquiry. Consent and production-host restrictions should continue to apply to the events used for reporting.&lt;/p&gt;

&lt;h2&gt;
  
  
  Handover is a deliverable
&lt;/h2&gt;

&lt;p&gt;Record who owns the domain, hosting and CMS accounts; who pays recurring charges; who can publish; who restores a backup; and where instructions live. Include an observable test for each critical task and name the person accepting it.&lt;/p&gt;

&lt;p&gt;A short responsibility table often prevents more ambiguity than another page of technology names. It also makes competing offers easier to compare: the same editing tasks, the same handoff, and the same operational responsibility.&lt;/p&gt;

&lt;p&gt;Public implementation descriptions: &lt;a href="https://www.webifyagency.fi/vescun-pyora/" rel="noopener noreferrer"&gt;Vescun Pyörä&lt;/a&gt; and &lt;a href="https://www.webifyagency.fi/black-eagle-taekwon-do/" rel="noopener noreferrer"&gt;Black Eagle Taekwon-Do&lt;/a&gt;. No private code or client images are supplied with this article.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Prepared with AI assistance. Implementation details come from Webify’s public case descriptions; no measured traffic or sales outcomes are claimed.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
    </item>
  </channel>
</rss>
