Mert Özen Further With Every Line

Blog

Mert Özen's blog posts on software development, backend, frontend, and DevOps.

Series
45 posts found
Measuring the Impact of an SEO Change: Before/After Analysis, Seasonality, Annotations and Honest Reporting
SEO & GEO PART 07

Measuring the Impact of an SEO Change: Before/After Analysis, Seasonality, Annotations and Honest Reporting

You measure the effect of an SEO change against a control group of similar unchanged pages, with whole-week windows and against the range of normal weekly variation; without a control group, season and holidays mix with the effect. We cover writing a hypothesis, annotations, outside factors, a C# analysis on synthetic data, the limits of split tests on a small site and an honest impact report.

15 Nov 2026 10 min 0
The SEO Impact of Core Web Vitals: What Google Says, CrUX Field Data and Building Your Own RUM with web-vitals
SEO & GEO PART 06

The SEO Impact of Core Web Vitals: What Google Says, CrUX Field Data and Building Your Own RUM with web-vitals

According to Google, Core Web Vitals are used by the ranking systems but guarantee no ranking, and relevance comes first; the assessment uses field data from real users, not the Lighthouse score. We cover the thresholds and the 75th percentile, who CrUX includes, the URL groups of the Search Console report, the CrUX API in C# and an ASP.NET Core RUM endpoint that computes p75 the way Search Console does.

15 Nov 2026 12 min 0
Privacy and Consent in Analytics: The KVKK Cookie Guide, Consent Mode and Cookieless Alternatives
SEO & GEO PART 05

Privacy and Consent in Analytics: The KVKK Cookie Guide, Consent Mode and Cookieless Alternatives

You do not load the analytics tag before consent, and when the consent rate changes, GA4's number drops without any change in traffic; you tell them apart with a source consent does not affect. We cover what the KVKK cookie guide means for measurement, ITrackingConsentFeature in ASP.NET Core, consent-gated loading in Angular, basic vs advanced Consent Mode, the 2026 change and cookieless alternatives. Not legal advice.

15 Nov 2026 11 min 0
Measuring On-Site Behavior with GA4: The Event Model, page_view in an Angular SPA, Custom Events and Key Events
SEO & GEO PART 04

Measuring On-Site Behavior with GA4: The Event Model, page_view in an Angular SPA, Custom Events and Key Events

In an Angular SPA you send page_view either through enhanced measurement's history tracking or by hand, never both; if you send it by hand, do it inside a TitleStrategy, because the router writes the title after NavigationEnd. We cover GA4's event model, key events, gtag with a CSP nonce in Razor pages, events that matter for a blog and Measurement Protocol code that sends no personal data.

15 Nov 2026 11 min 0
The Search Console API and BigQuery Export: Automating Your Own SEO Report in C#
SEO & GEO PART 03

The Search Console API and BigQuery Export: Automating Your Own SEO Report in C#

To keep Search Console data beyond 16 months, you pull each day separately from the Search Analytics API into your own database or turn on the BigQuery bulk export from today on; neither fills in past history. We cover service account access, paging, quotas, testing with a fake handler, an idempotent SQL Server archive, a threshold-based weekly report and the export's cost notes, with C# code.

15 Nov 2026 12 min 0
The Search Console Performance Report in Depth: Position, CTR, Regex Filters, Branded Queries and Query Groups
SEO & GEO PART 02

The Search Console Performance Report in Depth: Position, CTR, Regex Filters, Branded Queries and Query Groups

In the Performance report, position is the average of the topmost result per query, and because the property and page views aggregate differently, CTR differs between the two tabs. We cover anonymized queries, the 1,000-row and 16-month limits, the Turkish character trap in RE2 regexes, the branded filter, query groups, annotations and C# code that finds low-CTR queries against the site's own CTR.

15 Nov 2026 11 min 0
Measuring SEO: Which Question, Which Data? Why Search Console, GA4, Server Logs and CrUX Disagree
SEO & GEO PART 01

Measuring SEO: Which Question, Which Data? Why Search Console, GA4, Server Logs and CrUX Disagree

Search Console, GA4, server logs and CrUX count different parts of the same visit, so they give different numbers; the right number depends on the question you ask. We cover the question-metric-source mapping, why the numbers disagree, C# code that separates Google traffic in logs using Google's Referer rules, and the measurement options for mertozen.com.

15 Nov 2026 10 min 0
Testing and Monitoring Structured Data: Rich Results Test, Schema Markup Validator, Search Console and Automated CI Checks
SEO & GEO PART 05

Testing and Monitoring Structured Data: Rich Results Test, Schema Markup Validator, Search Console and Automated CI Checks

The Rich Results Test checks eligibility for Google's rich results and the Schema Markup Validator checks schema.org validity, but only tests that run on every build catch regressions. We cover URL Inspection and Search Console reports, JSON-LD tests with xUnit and WebApplicationFactory, Playwright checks for Angular SSR and post-deploy smoke tests, with real passing and failing output.

14 Nov 2026 13 min 31
Other Types and Retired Rich Results: VideoObject, SoftwareApplication, Speakable and the Story of FAQ and HowTo
SEO & GEO PART 04

Other Types and Retired Rich Results: VideoObject, SoftwareApplication, Speakable and the Story of FAQ and HowTo

VideoObject is a candidate for video features only on a watch page focused on a single video, SoftwareApplication produces no rich result without a rating or review, and speakable is still an English, news-focused beta. We take the dates of the rich results retired between 2023 and 2026, from HowTo to FAQ, from Google's changelog, and discuss whether retired markup has to be deleted and what it means for mertozen.com, with .NET 10 examples.

14 Nov 2026 10 min 22
BlogPosting, BreadcrumbList and the Author Entity: Building an Entity Graph with Person, ProfilePage, Organization and WebSite
SEO & GEO PART 03

BlogPosting, BreadcrumbList and the Author Entity: Building an Entity Graph with Person, ProfilePage, Organization and WebSite

A tech blog's structured data is a BlogPosting linked to a Person, Organization and WebSite that each have a single @id on the site, plus a BreadcrumbList with the right URLs for each language. We show Google's Article, Breadcrumb and ProfilePage recommendations, honest use of dateModified and how the graph resolves in the Schema Markup Validator with .NET 10, and audit mertozen.com's live output.

14 Nov 2026 11 min 22
JSON-LD Syntax and Safe Generation: @context, @type, @id, @graph in ASP.NET Core and Angular SSR
SEO & GEO PART 02

JSON-LD Syntax and Safe Generation: @context, @type, @id, @graph in ASP.NET Core and Angular SSR

The rule for generating JSON-LD safely is to write text with JSON's own \u003C escape and put it on the page as a single @graph; UnsafeRelaxedJsonEscaping plus Html.Raw lets a </script> in a headline split the page and open the door to XSS. We look at @context, @type, @id and @graph, typed records in ASP.NET Core 10, the ScriptTagHelper detail that arrived with .NET 9, and duplicate scripts and silent data corruption in Angular 22 SSR, all with real output.

14 Nov 2026 15 min 23
What Is Structured Data? Schema.org, JSON-LD and What Google Actually Does with It
SEO & GEO PART 01

What Is Structured Data? Schema.org, JSON-LD and What Google Actually Does with It

Structured data means telling machines explicitly what a page is about, using the schema.org vocabulary and a syntax such as JSON-LD; Google uses it to understand pages and for rich result eligibility, but markup neither guarantees rich results nor is presented as a ranking factor. We write the same data in Microdata, RDFa and JSON-LD, dump the entity graph of a Bookstore page with .NET 10 and look at consumers beyond Google.

14 Nov 2026 12 min 27
Blog Map