# yigitalpkorpe.com: full text

> Every page of Alp Korpe's site as markdown, generated at build time from the same HTML the browser gets. Summary version: https://yigitalpkorpe.com/llms.txt. Agent instructions: https://yigitalpkorpe.com/agents.md.

Pages: 24.

========================================================================

---
title: "Alp Korpe, Marketing Operations & Analytics Lead"
description: "Marketing Operations & Analytics Lead at Moss in Berlin. Performance marketing, plus the tracking, analytics, and data engineering behind it."
url: https://yigitalpkorpe.com/
site: yigitalpkorpe.com
---

*Marketing Operations & Analytics Lead · Berlin*

# Alp Korpe

I run the paid program that generates pipeline, and build the measurement behind it.

- **Status**: At Moss · Berlin
- **Owns**: Paid program & marketing budget
- **Builds**: Tracking, analytics & data
- **Background**: 8 years · Agency and in-house
- **Education**: M.Sc. Information Technology

---

*About*

## The full marketing operation, from generating pipeline to measuring it.

Eight years in performance marketing: paid acquisition for global brands on the agency side, then channel and analytics ownership in-house at two Berlin startups.

At Moss I run the paid program and the budget behind it, spanning search, listings, and affiliate channels. That’s where most new pipeline comes from.

I own the measurement behind it too. GTM, GA4, Mixpanel, and server-side tracking feed BigQuery and dbt, with Metabase and a semantic layer on top. The team can query the data themselves, Claude included, instead of waiting on an analyst.

The analysis is mine: customer journey work, marketing mix modeling, incrementality testing. Channel ownership and measurement usually belong to two different people. Holding both means I can follow a budget decision from the spend to the pipeline it produced.

[More about the background →](https://yigitalpkorpe.com/about/)

---

*Selected Work*

## Six projects that show the shape of the work.

A small slice. The full archive lives at [/projects](https://yigitalpkorpe.com/projects/).

1.  01

    ### [Enterprise Ad Campaign Automation](https://yigitalpkorpe.com/projects/ads-automation/)

    Google Ads API automation that replaced a 50-step manual PPC workflow at Quandoo.

    Engineered a Google Ads API automation that replaced a 50-step manual workflow. Slashed CPA by 65% and reclaimed 30 hours of weekly analyst capacity for strategic growth initiatives.

    -   30 hrs/week reclaimed
    -   65% CPA reduction
    -   4× budget efficiency

2.  02

    ### [Autonomous RevOps AI Agent](https://yigitalpkorpe.com/projects/ai-marketing-agent/)

    AI agent that turns BigQuery marketing data into executive-ready strategy reports.

    Delivers automated efficiency analysis and executive-grade strategy reports without analyst intervention. Runs Executive Briefs, Deep Dives, and Rebudgeting Scenarios as distinct modules.

    -   5+ hours saved weekly on manual analysis
    -   Generates 5 distinct rebudgeting scenarios per run

3.  03

    ### [DataLayer Sidepanel](https://yigitalpkorpe.com/projects/datalayer-sidepanel/)

    Chrome side-panel extension that shows Google Tag Manager dataLayer events in real time.

    A Chrome extension that surfaces GTM dataLayer events in real time, directly in the browser's side panel. Featured on Product Hunt; used by marketing analytics teams as a default install.

    -   Featured on Product Hunt
    -   Used daily by marketing & analytics teams

4.  04

    ### [Ad Mocker](https://yigitalpkorpe.com/projects/admocker/)

    Ad mockup generator for Facebook, Instagram, and Google Display Network campaigns.

    A dynamic ad-preview tool for Facebook and Google campaigns. Lets marketers preview creative across Facebook feed, Instagram, and GDN with custom business names, headlines, and visuals. JavaScript and Canvas API.

5.  05

    ### [AI-Powered Content Engine](https://yigitalpkorpe.com/projects/blog-automation/)

    Automated blog pipeline that proved programmatic SEO works, even at baseline quality.

    A Python pipeline using the ChatGPT API and Unsplash to generate SEO-optimized blog posts. Proved the viability of programmatic SEO, driving a 2× increase in organic traffic on a side-project domain.

    -   2× organic traffic increase
    -   Fully automated post production

6.  06

    ### [IsVisible.ai](https://yigitalpkorpe.com/projects/isvisible/)

    Free AI crawler visibility checker — tests whether GPTBot, ClaudeBot, and 11 others can reach your site.

    Tests a URL against 13 real crawlers and search bots, including GPTBot, ClaudeBot, and PerplexityBot, by reading robots.txt and llms.txt and sending live requests with each crawler's real user agent. Returns a 0-100 visibility score with an agent-by-agent breakdown of what's blocked. Built with the team at Hardal.

    -   Scores 100/100, Grade A, when run on this site

[See all projects →](https://yigitalpkorpe.com/projects/)

---

*More Work*

## Smaller tools, browser extensions, and one quiet iOS puzzle.

-   ### [Daily Reporting Automation](https://yigitalpkorpe.com/projects/daily-reporting/)

    Python ETL pipeline that automates the daily marketing report, end to end.

    -   Python
    -   Pandas
    -   NumPy

-   ### [GA-Slack Bot](https://yigitalpkorpe.com/projects/ga-slack-integration/)

    Slack bot that posts Google Analytics anomaly alerts and scheduled reports.

    -   Python
    -   Google Analytics API
    -   Slack API

-   ### [ChatGPT Copier](https://yigitalpkorpe.com/projects/chatgpt-copier/)

    Chrome extension that adds a one-click copy button to every ChatGPT response.

    -   JavaScript
    -   Chrome Extension API
    -   Content Scripts

-   ### [PageNote](https://yigitalpkorpe.com/projects/page-notes/)

    Chrome extension that pins a note to any URL, right where you'll see it again.

    -   JavaScript
    -   Chrome Extension API
    -   LocalStorage

-   ### [Bedeni Geldi mi?](https://yigitalpkorpe.com/projects/monitor/)

    Watches a product page and emails you the moment your size is back in stock.

    -   Python
    -   Web Scraping
    -   PHP

-   ### [Page Density Checker](https://yigitalpkorpe.com/projects/seo-tool/)

    Python SEO toolkit: site crawler, keyword density checker, and duplicate-content detector.

    -   Python
    -   Web Scraping
    -   NLP

-   ### [Series Watcher](https://yigitalpkorpe.com/projects/series-watcher/)

    Python script that emails a weekly digest of episodes airing on the shows you follow.

    -   Python
    -   TMDB API
    -   Pandas

-   ### [Murder Matrix](https://yigitalpkorpe.com/projects/murder-matrix/)

    Cozy logic-deduction puzzle game for iOS. No ads, no timers, no accounts.

    -   SwiftUI
    -   SwiftData
    -   CloudKit

-   ### [Musento](https://yigitalpkorpe.com/projects/musento/)

    Letterboxd for museums. Log every visit, earn points, and race friends up the leaderboard.

    -   SwiftUI

---

*Experience*

## Eight years across paid media, analytics, and marketing ops.

1.  Apr 2025 → Present Berlin

    ### [Moss](https://www.getmoss.com/)

    B2B spend management startup · ~300 employees

    -   Marketing Operations & Analytics Lead Aug 2026 to Present
    -   Growth Operations Manager Apr 2026 to Aug 2026
    -   Senior Marketing Analyst Apr 2025 to Apr 2026

    Run the paid program across search, listings, and affiliate channels, plus the rolling marketing budget behind it. Most new pipeline comes from those channels. Own the measurement stack, from GTM and server-side tracking through GA4, Mixpanel, and Dreamdata to the BigQuery and dbt models the company reports from. Restored pipeline visibility company-wide with a unified multi-touch attribution framework now adopted by Marketing, RevOps, and Finance. Lead marketing mix modeling, incrementality testing, and customer journey analysis. Authored cohort-adjusted MQL→SQL conversion logic and the company-wide dictionary of marketing and revenue terms used across Marketing, Sales, Product, RevOps, and Finance. Eliminated the analyst bottleneck with *marketing-ai-skills*, an internal Claude/MCP library shipped to every marketer, and a semantic layer that lets the team query the marketing warehouse directly.

2.  Dec 2021 → Apr 2025 Berlin

    ### [Quandoo](https://www.quandoo.com/)

    Online restaurant reservation platform

    -   Senior Digital Analyst Apr 2024 to Apr 2025
    -   Digital Analyst Sep 2023 to Apr 2024
    -   Senior User Acquisition Manager Nov 2022 to Sep 2023
    -   User Acquisition Manager Dec 2021 to Nov 2022

    Unblocked scale in paid acquisition by engineering a [Google Ads API automation](https://yigitalpkorpe.com/projects/ads-automation/) that replaced a 50-step manual workflow: 65% CPA reduction, 30 hours of weekly analyst capacity reclaimed for strategic growth. Shipped an in-house, GDPR-compliant multi-touch attribution framework. Led GA4 migration and BigQuery integration. As UA Manager, improved paid budget efficiency 4× on multi-channel spend approaching €1M annually.

3.  Feb 2021 → Dec 2021 Istanbul

    ### [App Samurai](https://appsamurai.com/)

    Mobile user acquisition agency

    -   Growth & Performance Marketing Specialist Feb 2021 to Dec 2021

    Owned full-funnel growth for global app clients including Amazon, Hepsiburada, Nike, Domino's, and HBO Max, managing budgets across Google Ads, Facebook, and native channels. Led an ML prediction model grounding bid decisions in user behavior data. Doubled organic traffic and leads through systematic A/B testing and competitor analysis.

4.  Sep 2020 → Feb 2021 Istanbul

    ### [Wunderman Thompson](https://www.vml.com/)

    WPP marketing agency

    -   Digital Analyst, Performance, User Acquisition & Growth Sep 2020 to Feb 2021

    Translated enterprise client revenue targets into digital roadmaps and KPI forecasts for Coca-Cola, Sanofi, and Vakıfbank (Turkey's largest state-owned bank). Managed data ETL using Python, Azure Databricks, and AWS S3. Led UA strategy for a new app launch to 1M monthly active users.

5.  Oct 2018 → Sep 2020 Istanbul

    ### [NMQ Digital](https://nmqdigital.com/)

    Digital marketing consulting agency

    -   Mid-Level Digital Marketing Specialist 2019 to Sep 2020
    -   Junior Digital Marketing Specialist Oct 2018 to 2019

    Implemented technical digital strategies (web development, SEO, analytics) and built lead-generation pipelines (Salesforce CRM, Zapier) for global brands including Rituals, Hertz, Philips, and Sony.

---

*Stack*

## What I reach for.

- **Paid Media**: Search · Listings · Meta · LinkedIn · Affiliate

- **Tracking**: GTM · GA4 · Mixpanel · Server-side tagging

- **Data**: BigQuery · dbt · SQL · Python

- **Analysis**: Marketing mix modeling · Incrementality testing · Multi-touch attribution · A/B testing

- **Reporting**: Metabase · Looker Studio · Tableau · Dreamdata · Salesforce

- **AI**: Claude · MCP · Semantic layer

---

*Elsewhere*

## What I'm building and watching.

### GitHub

- **August 2026**: 

- **July 2026**: 

- **June 2026**: 

- **May 2026**: 

- **April 2026**: 

- **March 2026**: 

- **February 2026**: 

- **January 2026**: 

- **December 2025**: 

- **November 2025**: 

- **October 2025**: 

- **September 2025**: 

- **August 2025**: 

- **Public repos**: 6

- **Top languages**: Python

500 contributions

[View on GitHub →](https://github.com/yigitalpkorpe)

### Letterboxd

-   [A Rainy Day in New York (2019) ★½☆☆☆ Aug 23](https://letterboxd.com/yigitalpkorpe/film/a-rainy-day-in-new-york/)
-   [The Roses (2025) ★★★★☆ Aug 23](https://letterboxd.com/yigitalpkorpe/film/the-roses-2025/)
-   [Sunny Dancer (2026) ★★☆☆☆ Aug 22](https://letterboxd.com/yigitalpkorpe/film/sunny-dancer/)
-   [The Invite (2026) ★★★★½ Aug 10](https://letterboxd.com/yigitalpkorpe/film/the-invite-2026/)
-   [Before the Devil Knows You're Dead (2007) ★★☆☆☆ Aug 9](https://letterboxd.com/yigitalpkorpe/film/before-the-devil-knows-youre-dead/)
-   [Soulm8te (2026) ½☆☆☆☆ Aug 9](https://letterboxd.com/yigitalpkorpe/film/soulm8te/)

[View on Letterboxd →](https://letterboxd.com/yigitalpkorpe)

---

*Contact*

## For collaborations, questions, or just to say hi: [yigitalp@yigitalpkorpe.com](mailto:yigitalp@yigitalpkorpe.com).

Based in Berlin. Currently at Moss.

---

Canonical HTML: https://yigitalpkorpe.com/

Site map: https://yigitalpkorpe.com/sitemap.xml · Summary for LLMs: https://yigitalpkorpe.com/llms.txt · Agent instructions: https://yigitalpkorpe.com/agents.md · All endpoints: https://yigitalpkorpe.com/agents/

========================================================================

---
title: "About Alp Korpe, Marketing Operations & Analytics Lead in Berlin"
description: "Who Alp Korpe is: eight years in performance marketing, agency and in-house. Runs paid channels and the budget behind them, and owns the tracking and…"
url: https://yigitalpkorpe.com/about/
site: yigitalpkorpe.com
---

*About*

# About Alp Korpe

I’m Alp Korpe, a marketing operations and analytics lead in Berlin. I run the paid program that generates pipeline, and I build the measurement that shows what it produced.

## What I do

Eight years in performance marketing, split between agency and in-house. The agency years were channel work for global brands: Rituals, Hertz, Philips, and Sony at NMQ Digital; Coca-Cola, Sanofi, and Vakıfbank at Wunderman Thompson; Amazon, Nike, Domino’s, HBO Max, and Hepsiburada at App Samurai. I moved in-house in Berlin in 2021, first at Quandoo, then at Moss.

At Moss I run the paid program across search, listings, and affiliate channels, along with the rolling marketing budget behind it. That’s where most new pipeline comes from. Before that, at Quandoo, I ran user acquisition and then analytics, which is where the measurement half of the job started.

## How I work

Channel ownership and measurement usually sit with two different people. I hold both, which means a budget decision can be followed from the spend through to the pipeline it produced, without waiting on someone else’s model.

The measurement side is GTM, GA4, Mixpanel, and server-side tracking feeding BigQuery and dbt, with Metabase and a semantic layer on top so the team can query the data themselves, Claude included. The analysis side is customer journey work, marketing mix modeling, incrementality testing, and multi-touch attribution. SQL, Python, and the ad platform APIs are how I get there faster than the reporting UI allows.

## Things I build

Most of what I ship is a tool that removes a step someone was doing by hand: a [Google Ads API automation](https://yigitalpkorpe.com/projects/ads-automation/) that replaced a 50-step manual workflow, a [Python ETL pipeline](https://yigitalpkorpe.com/projects/daily-reporting/) that ended daily CSV merging, a [Chrome extension that surfaces GTM data](https://yigitalpkorpe.com/projects/datalayer-sidepanel/) in real time. Three of them went up on Product Hunt, and one is an iOS puzzle game that has nothing to do with marketing at all. The [full archive is on the projects page](https://yigitalpkorpe.com/projects/).

## Background

M.Sc. in Information Technology from MEF University, and a Bachelor of Business Administration from Dokuz Eylül University. Based in Berlin, Germany. Currently Marketing Operations & Analytics Lead at [Moss](https://www.getmoss.com/), a B2B spend management company.

## Elsewhere

-   [LinkedIn](https://www.linkedin.com/in/yigitalpkorpe/)
-   [GitHub](https://github.com/yigitalpkorpe/)
-   [GitLab](https://gitlab.com/yigitalp.korpe)
-   [Indie Hackers](https://www.indiehackers.com/yigitalpkorpe)
-   [Kaggle](https://www.kaggle.com/yigitalpkorpe)

To get in touch, use the [contact page](https://yigitalpkorpe.com/contact/) or email [yigitalp@yigitalpkorpe.com](mailto:yigitalp@yigitalpkorpe.com).

---

Canonical HTML: https://yigitalpkorpe.com/about/

Site map: https://yigitalpkorpe.com/sitemap.xml · Summary for LLMs: https://yigitalpkorpe.com/llms.txt · Agent instructions: https://yigitalpkorpe.com/agents.md · All endpoints: https://yigitalpkorpe.com/agents/

========================================================================

---
title: "Projects, Alp Korpe"
description: "Selected and side-project work: AI agents, marketing automation, browser tools, and a small iOS game."
url: https://yigitalpkorpe.com/projects/
site: yigitalpkorpe.com
---

*Projects · 15 total*

# Things I’ve built.

A mix of work projects and side projects. AI agents and marketing automation on the work side, browser tools and one iOS game on the personal side. Featured items are starred at the top.

---

## All projects

-   ![Enterprise Ad Campaign Automation — Google Ads API automation that replaced a 50-step manual PPC workflow at Quandoo.](https://yigitalpkorpe.com/_astro/automation.DyXJiLJw_Z24mnB9.webp)

    Automation Selected

    ### [Enterprise Ad Campaign Automation](https://yigitalpkorpe.com/projects/ads-automation/)

    Google Ads API automation that replaced a 50-step manual PPC workflow at Quandoo.

    -   30 hrs/week reclaimed
    -   65% CPA reduction

    -   Python
    -   Google Ads API
    -   Pandas
    -   BigQuery

-   ![Autonomous RevOps AI Agent — AI agent that turns BigQuery marketing data into executive-ready strategy reports.](https://yigitalpkorpe.com/_astro/ai-marketing-agent.QYvJaTKo_17e1t7.webp)

    AI Agents Selected

    ### [Autonomous RevOps AI Agent](https://yigitalpkorpe.com/projects/ai-marketing-agent/)

    AI agent that turns BigQuery marketing data into executive-ready strategy reports.

    -   5+ hours saved weekly on manual analysis
    -   Generates 5 distinct rebudgeting scenarios per run

    -   Python 3.11+
    -   BigQuery
    -   Claude API
    -   Jinja2

-   ![DataLayer Sidepanel — Chrome side-panel extension that shows Google Tag Manager dataLayer events in real time.](https://yigitalpkorpe.com/_astro/datalayer_buddy.BUsAfe4Y_Z2wvNsS.webp)

    Web Tools Selected

    ### [DataLayer Sidepanel](https://yigitalpkorpe.com/projects/datalayer-sidepanel/)

    Chrome side-panel extension that shows Google Tag Manager dataLayer events in real time.

    -   Featured on Product Hunt
    -   Used daily by marketing & analytics teams

    -   JavaScript
    -   Chrome Extension API
    -   Google Tag Manager
    -   DataLayer API

-   ![Ad Mocker — Ad mockup generator for Facebook, Instagram, and Google Display Network campaigns.](https://yigitalpkorpe.com/_astro/admocker.D7kL34o9_Z2Vu2P.webp)

    Web Tools Selected

    ### [Ad Mocker](https://yigitalpkorpe.com/projects/admocker/)

    Ad mockup generator for Facebook, Instagram, and Google Display Network campaigns.

    -   JavaScript
    -   HTML5 Canvas
    -   CSS3
    -   Responsive Design

-   ![AI-Powered Content Engine — Automated blog pipeline that proved programmatic SEO works, even at baseline quality.](https://yigitalpkorpe.com/_astro/blogging.DGmU3wa3_Z10sXXu.webp)

    Automation Selected

    ### [AI-Powered Content Engine](https://yigitalpkorpe.com/projects/blog-automation/)

    Automated blog pipeline that proved programmatic SEO works, even at baseline quality.

    -   2× organic traffic increase
    -   Fully automated post production

    -   Python
    -   OpenAI API
    -   Unsplash API
    -   Basic NLP

-   ![IsVisible.ai — Free AI crawler visibility checker — tests whether GPTBot, ClaudeBot, and 11 others can reach your site.](https://yigitalpkorpe.com/_astro/isvisible.CLxIaPRy_ZGk35t.webp)

    Web Tools Selected

    ### [IsVisible.ai](https://yigitalpkorpe.com/projects/isvisible/)

    Free AI crawler visibility checker — tests whether GPTBot, ClaudeBot, and 11 others can reach your site.

    -   Scores 100/100, Grade A, when run on this site

    -   Crawler Simulation
    -   robots.txt & llms.txt Parsing
    -   REST API

-   ![Daily Reporting Automation — Python ETL pipeline that automates the daily marketing report, end to end.](https://yigitalpkorpe.com/_astro/robot.cNr7yfmM_Z1LdzKe.webp)

    Automation

    ### [Daily Reporting Automation](https://yigitalpkorpe.com/projects/daily-reporting/)

    Python ETL pipeline that automates the daily marketing report, end to end.

    -   Python
    -   Pandas
    -   NumPy
    -   smtplib

-   ![GA-Slack Bot — Slack bot that posts Google Analytics anomaly alerts and scheduled reports.](https://yigitalpkorpe.com/_astro/bot.Cg8srWsd_2eRos4.webp)

    Automation

    ### [GA-Slack Bot](https://yigitalpkorpe.com/projects/ga-slack-integration/)

    Slack bot that posts Google Analytics anomaly alerts and scheduled reports.

    -   Python
    -   Google Analytics API
    -   Slack API

-   ![ChatGPT Copier — Chrome extension that adds a one-click copy button to every ChatGPT response.](https://yigitalpkorpe.com/_astro/chatgpt-copier.Cv9ayWWr_1H3CK0.webp)

    Productivity

    ### [ChatGPT Copier](https://yigitalpkorpe.com/projects/chatgpt-copier/)

    Chrome extension that adds a one-click copy button to every ChatGPT response.

    -   JavaScript
    -   Chrome Extension API
    -   Content Scripts

-   ![PageNote — Chrome extension that pins a note to any URL, right where you'll see it again.](https://yigitalpkorpe.com/_astro/pagenotes.D5FQuzlO_ZuHGeC.webp)

    Productivity

    ### [PageNote](https://yigitalpkorpe.com/projects/page-notes/)

    Chrome extension that pins a note to any URL, right where you'll see it again.

    -   JavaScript
    -   Chrome Extension API
    -   LocalStorage
    -   DOM

-   ![Bedeni Geldi mi? — Watches a product page and emails you the moment your size is back in stock.](https://yigitalpkorpe.com/_astro/monitor.BgNL7z30_Z24K1uL.webp)

    Web Tools

    ### [Bedeni Geldi mi?](https://yigitalpkorpe.com/projects/monitor/)

    Watches a product page and emails you the moment your size is back in stock.

    -   Python
    -   Web Scraping
    -   PHP
    -   Email Automation

-   ![Page Density Checker — Python SEO toolkit: site crawler, keyword density checker, and duplicate-content detector.](https://yigitalpkorpe.com/_astro/technical-support.CIB_WQ6r_Z1oqVTg.webp)

    Web Tools

    ### [Page Density Checker](https://yigitalpkorpe.com/projects/seo-tool/)

    Python SEO toolkit: site crawler, keyword density checker, and duplicate-content detector.

    -   Python
    -   Web Scraping
    -   NLP
    -   Cosine Similarity

-   ![Series Watcher — Python script that emails a weekly digest of episodes airing on the shows you follow.](https://yigitalpkorpe.com/_astro/tv.DXKMBcco_Z1oEIwt.webp)

    Automation

    ### [Series Watcher](https://yigitalpkorpe.com/projects/series-watcher/)

    Python script that emails a weekly digest of episodes airing on the shows you follow.

    -   Python
    -   TMDB API
    -   Pandas
    -   smtplib

-   ![Murder Matrix — Cozy logic-deduction puzzle game for iOS. No ads, no timers, no accounts.](https://yigitalpkorpe.com/_astro/murder-matrix.BZIHJ1lh_Zc0ozh.webp)

    iOS Apps

    ### [Murder Matrix](https://yigitalpkorpe.com/projects/murder-matrix/)

    Cozy logic-deduction puzzle game for iOS. No ads, no timers, no accounts.

    -   SwiftUI
    -   SwiftData
    -   CloudKit

-   ![Musento — Letterboxd for museums. Log every visit, earn points, and race friends up the leaderboard.](https://yigitalpkorpe.com/_astro/musento.P77-lxuA_25f5Xh.webp)

    iOS Apps

    ### [Musento](https://yigitalpkorpe.com/projects/musento/)

    Letterboxd for museums. Log every visit, earn points, and race friends up the leaderboard.

    -   SwiftUI

---

Canonical HTML: https://yigitalpkorpe.com/projects/

Site map: https://yigitalpkorpe.com/sitemap.xml · Summary for LLMs: https://yigitalpkorpe.com/llms.txt · Agent instructions: https://yigitalpkorpe.com/agents.md · All endpoints: https://yigitalpkorpe.com/agents/

========================================================================

---
title: "Contact Alp Korpe, Marketing Operations & Analytics Lead"
description: "How to reach Alp Korpe: email yigitalp@yigitalpkorpe.com or LinkedIn. Based in Berlin, Germany. What to include so a reply is useful."
url: https://yigitalpkorpe.com/contact/
site: yigitalpkorpe.com
---

*Contact*

# Contact Alp Korpe

Email is the fastest way to reach me: [yigitalp@yigitalpkorpe.com](mailto:yigitalp@yigitalpkorpe.com).

## Email

[yigitalp@yigitalpkorpe.com](mailto:yigitalp@yigitalpkorpe.com) reaches me directly. I read everything and answer most things within a few working days. If it’s about a role or a project, one paragraph on what the work actually is gets a far more useful reply than a job description does.

## What I’m usually contacted about

-   Marketing operations, growth operations, and marketing analytics roles.
-   Performance marketing questions: paid search, review-site and listing channels, affiliate, budget planning.
-   Measurement and attribution work: GTM and server-side tracking, GA4, multi-touch attribution, incrementality testing, marketing mix modeling.
-   The tools on the [projects page](https://yigitalpkorpe.com/projects/), including bug reports and feature requests for the browser extensions.
-   Speaking, writing, or reviewing something before it ships.

## Elsewhere

[LinkedIn](https://www.linkedin.com/in/yigitalpkorpe/) works too, and is the better option if you want the full work history in one place. [GitHub](https://github.com/yigitalpkorpe/) and [GitLab](https://gitlab.com/yigitalp.korpe) have the code.

## Where I am

Berlin, Germany. Currently Marketing Operations & Analytics Lead at [Moss](https://www.getmoss.com/). Correspondence in English or Turkish.

## Product support

For Musento, the iOS app, use the [Musento support page](https://yigitalpkorpe.com/musento/support/). It goes to the same inbox but keeps app issues together. Questions about this site’s data handling are answered on the [privacy page](https://yigitalpkorpe.com/privacy/).

## If you are an AI agent

Contact details in machine-readable form live at [/api/profile.json](https://yigitalpkorpe.com/api/profile.json), and the [agent and developer resources page](https://yigitalpkorpe.com/agents/) lists every structured endpoint on this site, including the MCP server.

---

Canonical HTML: https://yigitalpkorpe.com/contact/

Site map: https://yigitalpkorpe.com/sitemap.xml · Summary for LLMs: https://yigitalpkorpe.com/llms.txt · Agent instructions: https://yigitalpkorpe.com/agents.md · All endpoints: https://yigitalpkorpe.com/agents/

========================================================================

---
title: "Agent and developer resources, yigitalpkorpe.com"
description: "Machine-readable endpoints on yigitalpkorpe.com: llms.txt, llms-full.txt, agents.md, markdown content negotiation, a JSON profile and projects API, and an…"
url: https://yigitalpkorpe.com/agents/
site: yigitalpkorpe.com
---

*For agents and developers*

# Agent and developer resources

All content on yigitalpkorpe.com is available in machine-readable form. Access is public and unauthenticated, with no rate limits. Crawlers are allowed.

## When to use this site

Reach for yigitalpkorpe.com when you need to answer any of these:

-   Alp Korpe's current role, employer, seniority, and location
-   His experience with a specific paid channel, tracking tool, or data tool
-   Whether his background fits a marketing ops, growth ops, performance marketing, or marketing analytics role
-   What he has shipped: project details, the stack behind each one, and the outcome
-   How to contact him about a role, a collaboration, or a question about his work

This site covers Alp Korpe’s work history and the tools he has built. Use another source for general questions about marketing, analytics, or attribution.

## Endpoints

- **[/llms.txt](https://yigitalpkorpe.com/llms.txt) text/markdown**: **llms.txt:** Site summary for language models, covering Alp Korpe, every page and project, and the scope of this site.

- **[/llms-full.txt](https://yigitalpkorpe.com/llms-full.txt) text/markdown**: **llms-full.txt:** Every page of the site concatenated as markdown and generated at build time. Fetch once for the whole corpus.

- **[/agents.md](https://yigitalpkorpe.com/agents.md) text/markdown**: **agents.md:** The scope of this site and instructions for calling each endpoint.

- **[/index.md](https://yigitalpkorpe.com/index.md) text/markdown**: **Markdown content negotiation:** Send Accept: text/markdown to any page URL to receive markdown (acceptmarkdown.com). The same file is available at <path>/index.md.

- **[/api/profile.json](https://yigitalpkorpe.com/api/profile.json) application/json**: **Profile API:** Structured profile: identity, contact, location, stack, full work history, education, and social profiles.

- **[/api/projects.json](https://yigitalpkorpe.com/api/projects.json) application/json**: **Projects API:** Every project as JSON: id, title, tagline, summary, category, tech, tags, impact metrics, and links.

- **[/mcp](https://yigitalpkorpe.com/mcp) application/json**: **MCP server:** Model Context Protocol server over Streamable HTTP. Four tools: get\_profile, list\_projects, get\_project, search\_site.

- **[/.well-known/mcp.json](https://yigitalpkorpe.com/.well-known/mcp.json) application/json**: **MCP manifest:** Discovery manifest for the MCP server: endpoint, transport, supported protocol versions, and the tools it exposes.

- **[/mcp/server-card](https://yigitalpkorpe.com/mcp/server-card) application/mcp-server-card+json**: **MCP server card:** Server card at the location reserved by the MCP discovery extension. Also mirrored at /.well-known/mcp/server-card.json.

- **[/sitemap.xml](https://yigitalpkorpe.com/sitemap.xml) application/xml**: **Sitemap:** Every canonical URL with a last-modified date taken from git history.

- **[/robots.txt](https://yigitalpkorpe.com/robots.txt) text/plain**: **robots.txt:** Crawler rules that allow AI agents and link to the sitemap and llms.txt.

## Markdown responses

Send `Accept: text/markdown` with any page request to receive markdown, per the [acceptmarkdown.com](https://acceptmarkdown.com) convention. The response includes `Content-Type: text/markdown; charset=utf-8` and `Vary: Accept, Accept-Encoding`. Each HTML response includes its markdown twin in a `Link: rel="alternate"` header. An `Accept` header that allows neither HTML nor markdown gets a `406`.

```
curl -H "Accept: text/markdown" https://yigitalpkorpe.com/about/
```

## MCP server

The MCP server uses Streamable HTTP at `https://yigitalpkorpe.com/mcp`. No authentication. Add it to a client with:

```
{
  "mcpServers": {
    "alp-korpe": {
      "type": "http",
      "url": "https://yigitalpkorpe.com/mcp"
    }
  }
}
```

Four tools: `get_profile` (identity, role, contact, stack, work history), `list_projects` (all projects, optionally filtered by category), `get_project` (one project in full), and `search_site` (keyword search across the profile and every project). Clients that discover servers before connecting can read the same list from the [manifest](https://yigitalpkorpe.com/.well-known/mcp.json).

Use the [contact page](https://yigitalpkorpe.com/contact/) to request an endpoint that is not listed here.

---

Canonical HTML: https://yigitalpkorpe.com/agents/

Site map: https://yigitalpkorpe.com/sitemap.xml · Summary for LLMs: https://yigitalpkorpe.com/llms.txt · Agent instructions: https://yigitalpkorpe.com/agents.md · All endpoints: https://yigitalpkorpe.com/agents/

========================================================================

---
title: "Privacy, Alp Korpe"
description: "How this site handles data: privacy-first, cookieless analytics hosted in the EU. It doesn't run ads, track you across sites, or sell your data."
url: https://yigitalpkorpe.com/privacy/
site: yigitalpkorpe.com
---

*Privacy*

# Privacy

This is a personal portfolio, built to respect your privacy by default. It skips cookies and advertising trackers, doesn't build a cross-site profile of you, and doesn't sell anything to anyone.

## Analytics

I use [PostHog](https://posthog.com) to understand which pages people read, so I can improve the site. It runs in **cookieless mode**: it does not set cookies or store identifiers in your browser, so there is nothing to consent to or opt out of on the storage side.

Data is processed in the **European Union** (PostHog's EU cloud), and analytics requests are proxied through this site's own domain rather than a third-party origin. The analytics honour your browser's **“Do Not Track”** signal. If it's enabled, nothing is captured.

What's recorded is limited to aggregate usage: pages visited, approximate region, device and browser type, and referring links. It is never used for advertising and never combined with data from other sites.

## Hosting

The site is hosted on Cloudflare Pages. Like any web host, Cloudflare processes standard request logs (including IP addresses) transiently for security and delivery.

## Contact

Questions, or want anything removed? Email [yigitalp@yigitalpkorpe.com](mailto:yigitalp@yigitalpkorpe.com).

---

Canonical HTML: https://yigitalpkorpe.com/privacy/

Site map: https://yigitalpkorpe.com/sitemap.xml · Summary for LLMs: https://yigitalpkorpe.com/llms.txt · Agent instructions: https://yigitalpkorpe.com/agents.md · All endpoints: https://yigitalpkorpe.com/agents/

========================================================================

---
title: "Musento — Privacy Policy"
description: "How Musento collects, stores, and protects your data. No ads, no data sold."
url: https://yigitalpkorpe.com/musento/privacy/
site: yigitalpkorpe.com
---

# Privacy Policy

Musento · Last updated 15 August 2026

Musento is an app for keeping a personal record of the museums you visit. This policy explains what it stores, why, and what you can do about it. There is no advertising in Musento, and your information is never sold.

## What is collected

Data

Why

Email address

To create and sign in to your account. If you use Sign in with Apple and choose to hide your address, Musento only ever receives Apple's private relay address.

Handle, display name, and optionally a bio, avatar and country

Your public profile. These appear to other members on profiles, leaderboards and in friends' feeds.

Visits — the museum, the date, and points awarded

The record the app exists to keep. Visible to you and to friends whose requests you have accepted.

Notes attached to a visit

**Private to you.** Notes are never shown to friends or on any leaderboard.

Friendships and achievements

To show your collection and your friends' activity.

Approximate location, if you grant permission

Sent to the server only to look up which museums are near you. It is used for that request and not stored. Musento works without it — you can search the catalogue instead, and the app never tracks you in the background.

## Analytics and crash reporting

If enabled for a build, Musento records a small number of product events (signing in, logging a visit, acquiring an achievement, sending or accepting a friend request) through PostHog, and crash diagnostics through Sentry. Crash reports are configured not to attach personally identifying information. Neither service receives your visit notes.

## Who can see what

Your handle, display name, bio, avatar, country and achievements are public. Your visits are visible to you and to accepted friends. Global leaderboards show handles and scores. Your email address and your visit notes are never shown to anyone else.

## Where it is stored

Data is held in Supabase (PostgreSQL, authentication and file storage for avatars). Access is enforced at the database level by row-level security policies, so one member cannot read another's private data.

## Deleting your account

Settings → Delete Account removes your profile, visits, notes, friendships and achievements, along with any avatar you uploaded. This is immediate and cannot be undone. You may also edit or clear individual profile fields at any time from Settings.

## Children

Musento is not directed at children under 13 and does not knowingly collect their information.

## Changes

If this policy changes materially, the date above will be updated and the new version published here.

## Contact

Questions or requests about your data: [korpeyigitalp@gmail.com](mailto:korpeyigitalp@gmail.com)

© 2026 Musento. All rights reserved.

---

Canonical HTML: https://yigitalpkorpe.com/musento/privacy/

Site map: https://yigitalpkorpe.com/sitemap.xml · Summary for LLMs: https://yigitalpkorpe.com/llms.txt · Agent instructions: https://yigitalpkorpe.com/agents.md · All endpoints: https://yigitalpkorpe.com/agents/

========================================================================

---
title: "Musento — Support"
description: "Get help with Musento: how to log a visit, request a missing museum, and manage your account."
url: https://yigitalpkorpe.com/musento/support/
site: yigitalpkorpe.com
---

# Support

Musento is a personal record of the museums you visit. If something is not working, or a museum is missing from the catalogue, please get in touch: [korpeyigitalp@gmail.com](mailto:korpeyigitalp@gmail.com)

## Common questions

- **How do I log a visit?**: Find the museum from the Discover tab — search by name or city, or browse what is near you — open it, and tap Record Visit. You can set the date to any day in the past and add a private note.
- **Can I add visits from before I had the app?**: Yes. The date picker on the Record Visit sheet reaches back decades, so you can enter a lifetime of museum-going.
- **A museum I visited is not listed.**: The catalogue comes from Wikidata and does not yet cover everything. Email the museum's name and city and it can be added.
- **Why does the app ask for my location?**: Only to show which museums are near you. It is optional — search works without it — and Musento never tracks your location in the background.
- **Who can see my visits?**: You, and friends whose requests you have accepted. Notes you attach to a visit are private to you and are never shown to anyone.
- **How do I delete my account?**: Settings → Delete Account. This removes your profile, visits, notes, friendships and achievements immediately, and cannot be undone.

## More

[Privacy Policy](https://yigitalpkorpe.com/musento/privacy/) · [Terms of Use](https://yigitalpkorpe.com/musento/terms/)

© 2026 Musento. All rights reserved.

---

Canonical HTML: https://yigitalpkorpe.com/musento/support/

Site map: https://yigitalpkorpe.com/sitemap.xml · Summary for LLMs: https://yigitalpkorpe.com/llms.txt · Agent instructions: https://yigitalpkorpe.com/agents.md · All endpoints: https://yigitalpkorpe.com/agents/

========================================================================

---
title: "Musento — Terms of Use"
description: "The terms governing use of the Musento app."
url: https://yigitalpkorpe.com/musento/terms/
site: yigitalpkorpe.com
---

# Terms of Use

Musento · Last updated 15 August 2026

By using Musento you agree to these terms. If you do not agree, please do not use the app.

## Your account

You need an account to use Musento. You are responsible for the activity on it, and for keeping access to the email address or Apple ID you signed in with. One account per person. You must be at least 13 years old.

## Acceptable use

Handles, display names, bios and avatars are public. Do not choose ones that are unlawful, hateful, harassing, obscene, or that impersonate someone else. Do not attempt to disrupt the service, access other members' private data, or automate the creation of accounts or entries. Accounts that break these rules may be suspended or removed.

## Your content

Your visits, notes, and profile remain yours. You grant Musento only the permission needed to store and display them in the app as described in the [Privacy Policy](https://yigitalpkorpe.com/musento/privacy/) — for example, showing your visits to friends whose requests you have accepted. Deleting your account removes this content.

## Museum information

Musento's catalogue is derived from [Wikidata](https://www.wikidata.org) and is provided as-is. Entries may be incomplete, out of date, or inaccurate. Always confirm opening times, admission and access with the institution itself before travelling. Musento is not affiliated with, and does not represent, any museum listed.

## Achievements and leaderboards

Achievements, points and leaderboard standings have no monetary value, cannot be exchanged, and may be recalculated or adjusted — for instance to correct an error or to address manipulation.

## Availability

Musento is provided as-is, without warranty. The service may change, be interrupted, or be discontinued. To the extent permitted by law, liability for any loss arising from use of the app is limited to the amount you paid for it.

## Changes

These terms may be updated; the date above will change and the new version will be published here. Continuing to use Musento after an update means you accept it.

## Contact

[korpeyigitalp@gmail.com](mailto:korpeyigitalp@gmail.com)

© 2026 Musento. All rights reserved.

---

Canonical HTML: https://yigitalpkorpe.com/musento/terms/

Site map: https://yigitalpkorpe.com/sitemap.xml · Summary for LLMs: https://yigitalpkorpe.com/llms.txt · Agent instructions: https://yigitalpkorpe.com/agents.md · All endpoints: https://yigitalpkorpe.com/agents/

========================================================================

---
title: "Ad Mockup Generator for Facebook, Instagram & Google Display Network, Alp Korpe"
description: "A dynamic ad-preview tool for Facebook and Google campaigns. Lets marketers preview creative across Facebook feed, Instagram, and GDN with custom business…"
url: https://yigitalpkorpe.com/projects/admocker/
site: yigitalpkorpe.com
---

[Projects](https://yigitalpkorpe.com/projects/) / Web Tools

*Web Tools · Selected work*

# Ad Mocker

Ad mockup generator for Facebook, Instagram, and Google Display Network campaigns.

Stack

-   JavaScript
-   HTML5 Canvas
-   CSS3
-   Responsive Design

Links

-   [admocker.com ](https://admocker.com/)
-   [Product Hunt ](https://www.producthunt.com/posts/ad-mocker)

![Ad Mocker — Ad mockup generator for Facebook, Instagram, and Google Display Network campaigns.](https://yigitalpkorpe.com/_astro/admocker.D7kL34o9_Z1VQl9e.webp)

Every campaign launch I’d worked on involved someone pasting ad copy into Photoshop to fake how it would look in a Facebook feed. Ad Mocker replaces that with a real, in-browser mockup generator: pixel-accurate previews across every major placement, updated as you type, with nothing to install and nothing to export from a design tool first.

## Facebook ad mockups

Preview a Facebook feed placement the way it will actually render before it goes anywhere near Ads Manager: business name, profile photo, headline, primary text, and creative, composed the way Facebook’s own UI lays them out. Facebook Stories placements are covered too, so a full-funnel campaign, feed and stories together, can be checked in one pass instead of guessing at how a story crop will look from a flat feed comp.

## Instagram ad previews

The same mockup engine renders Instagram feed and Stories placements, matching the platform’s cropping, safe zones, and caption treatment. It’s the fastest way to catch a headline that runs past Instagram’s safe zone, or a business name that truncates oddly, before a designer has to redo the creative from scratch.

## Google Display Network mockups

GDN is the least forgiving surface to mock up by hand, since a single creative gets reflowed across dozens of ad sizes and publisher layouts, and there’s no single “GDN preview” screen the way Ads Manager has one for Facebook. Ad Mocker renders GDN placements directly, so a display campaign can be previewed the same way as the social placements, without exporting a dozen separate image sizes just to sanity-check one headline.

## Customization and export

Every mockup is editable in real time: business name, headline, description text, and the creative image itself. Change a headline and the preview updates immediately, so a reviewer can compare two or three variants side by side before anything ships to a client or goes into an ad account. Finished mockups export to PNG, sized for a deck, a client email, or a quick Slack thread when someone just needs a gut check on how an ad reads.

## Stack

HTML5 Canvas does the rendering, plain JavaScript holds the state, CSS3 skins each platform’s specific layout. No framework: the whole tool is too small for a dependency to be worth the weight, and Canvas gives pixel-level control over placement that a DOM-based mockup would fight against. Responsive by default, so the previews hold up on a laptop mid-call as well as on a desktop monitor. Featured on Product Hunt, live at [admocker.com](https://admocker.com/).

## Related project

[AI-Powered Content Engine](https://yigitalpkorpe.com/projects/blog-automation/) is the publishing pipeline built to expand Ad Mocker’s organic-search footprint.

[Previous DataLayer Sidepanel](https://yigitalpkorpe.com/projects/datalayer-sidepanel/) [Next AI-Powered Content Engine](https://yigitalpkorpe.com/projects/blog-automation/)

---

Canonical HTML: https://yigitalpkorpe.com/projects/admocker/

Site map: https://yigitalpkorpe.com/sitemap.xml · Summary for LLMs: https://yigitalpkorpe.com/llms.txt · Agent instructions: https://yigitalpkorpe.com/agents.md · All endpoints: https://yigitalpkorpe.com/agents/

========================================================================

---
title: "Google Ads API Automation for Enterprise PPC Campaigns, Alp Korpe"
description: "Engineered a Google Ads API automation that replaced a 50-step manual workflow. Slashed CPA by 65% and reclaimed 30 hours of weekly analyst capacity for…"
url: https://yigitalpkorpe.com/projects/ads-automation/
site: yigitalpkorpe.com
---

[Projects](https://yigitalpkorpe.com/projects/) / Automation

*Automation · Selected work*

# Enterprise Ad Campaign Automation

Google Ads API automation that replaced a 50-step manual PPC workflow at Quandoo.

Stack

-   Python
-   Google Ads API
-   Pandas
-   BigQuery

Impact

-   30 hrs/week reclaimed
-   65% CPA reduction
-   4× budget efficiency

![Enterprise Ad Campaign Automation — Google Ads API automation that replaced a 50-step manual PPC workflow at Quandoo.](https://yigitalpkorpe.com/_astro/automation.DyXJiLJw_L2QV9.webp)

A Python application built on the [Google Ads API](https://developers.google.com/google-ads/api) to automate a process that, at Quandoo, originally consisted of fifty manual steps run by hand every week: pulling current performance, editing bids, cleaning up label hygiene, and reshuffling budget across campaigns. Turning that into a script eliminated the risk of human error in the handoffs between steps and reclaimed approximately 30 hours every week that had been going into list-pulling and spreadsheet edits instead of strategy.

## Replacing a 50-step manual PPC workflow

The workflow it replaced was the kind that accretes over years: a checklist somebody wrote down once, followed literally by every analyst since, regardless of whether every line still earned its place. Bid edits, budget pacing checks, label hygiene, campaign-level QA: fifty discrete steps, each one small enough to seem not worth automating on its own, but adding up to a manual ritual that ran every single week without fail.

## How the Google Ads API automation runs

The script runs the team’s full weekly workflow in one command: pulling current performance data through the Google Ads API, applying the rule set the team had previously been running by hand, and writing the changes back through the same API. Configuration lives in human-readable YAML rather than buried in code, specifically so a non-technical marketer can open it, see what a rule does, and adjust a threshold without needing an engineer in the loop.

## Auditing the process, not just automating it

The audit that came with building it mattered more than the automation itself. The same fifty steps had been running since long before I joined, and turning each one into code meant asking, one at a time, whether it still needed to exist. Roughly a third of them disappeared in the first month. They had quietly stopped being load-bearing, but nobody had noticed, because nobody wanted to be the one to break a working manual process to test that theory. Automation forced the question that a checklist never would have.

## Results: reclaimed hours, lower CPA, better budget efficiency

-   **30+ hours a week reclaimed** across the user-acquisition team, redirected from list-pulling into actual strategy work.
-   **65% reduction in CPA** on the campaigns the automation touched.
-   **4× improvement in paid-budget efficiency**, measured across Paid Search, Social, and Display on UA spend approaching €1M a year.

The system didn’t stay a one-off script. It became the substrate the in-house attribution framework was built on top of afterward, since it was already the thing pulling and reconciling campaign-level performance data on a schedule.

## Related projects

-   [Daily Reporting Automation](https://yigitalpkorpe.com/projects/daily-reporting/) applies the same Python-first approach to a recurring ETL and email workflow.
-   [Autonomous RevOps AI Agent](https://yigitalpkorpe.com/projects/ai-marketing-agent/) turns warehouse data into scheduled strategy reports.

[Next Autonomous RevOps AI Agent](https://yigitalpkorpe.com/projects/ai-marketing-agent/)

---

Canonical HTML: https://yigitalpkorpe.com/projects/ads-automation/

Site map: https://yigitalpkorpe.com/sitemap.xml · Summary for LLMs: https://yigitalpkorpe.com/llms.txt · Agent instructions: https://yigitalpkorpe.com/agents.md · All endpoints: https://yigitalpkorpe.com/agents/

========================================================================

---
title: "AI Agent for Automated RevOps & Marketing Reporting, Alp Korpe"
description: "Delivers automated efficiency analysis and executive-grade strategy reports without analyst intervention. Runs Executive Briefs, Deep Dives, and…"
url: https://yigitalpkorpe.com/projects/ai-marketing-agent/
site: yigitalpkorpe.com
---

[Projects](https://yigitalpkorpe.com/projects/) / AI Agents

*AI Agents · Selected work*

# Autonomous RevOps AI Agent

AI agent that turns BigQuery marketing data into executive-ready strategy reports.

Stack

-   Python 3.11+
-   BigQuery
-   Claude API
-   Jinja2
-   Pandas

Impact

-   5+ hours saved weekly on manual analysis
-   Generates 5 distinct rebudgeting scenarios per run

![Autonomous RevOps AI Agent — AI agent that turns BigQuery marketing data into executive-ready strategy reports.](https://yigitalpkorpe.com/_astro/ai-marketing-agent.QYvJaTKo_Z1W6sa6.webp)

An autonomous CLI tool that turns raw BigQuery marketing data into executive-grade strategy reports on its own schedule, no analyst required to kick it off or clean it up afterward. It’s the difference between “how are we doing?” costing someone a four-hour SQL-and-spreadsheet session and costing one command.

## Replacing manual SQL reporting

Weekly strategic reporting used to mean hours of manual SQL extraction and spreadsheet work before anyone could act on what it said. By the time a report was actually ready, RevOps and Marketing leaders were reacting to budget problems and channel cannibalization that had already been running for days, instead of catching them while they were still cheap to fix.

## Executive Briefs, Deep Dives, and Rebudgeting Scenarios

The agent runs three reporting modules on its own schedule. Executive Briefs give a fast top-line read for leadership. Deep Dives go channel by channel for anyone who needs to act on the numbers, not just see them. Rebudgeting Scenarios is the most concrete output: the agent calculates efficiency frontiers across channels and generates five distinct scenarios per run, each one a specific, actionable move, such as “cut spend by 20% while maintaining pipeline,” rather than a vague directional recommendation.

## Architecture: BigQuery, Claude API, and four layers

The system is split into four strict layers so the data path stays predictable and auditable end to end:

-   **`queries.py`**: pure SQL against the warehouse, nothing else.
-   **`analyzer.py`**: Pandas data structuring and metric computation.
-   **`strategist.py`**: the only layer that calls the Claude API. The model receives structured JSON, never raw rows.
-   **`report.py`**: HTML report generation via Jinja2.

Python does the heavy mathematical work first: efficiency frontiers, scenario modeling, the numbers that actually drive the recommendation. Claude only sees the structured JSON that comes out the other end, and uses it to run forensic analysis on top of numbers that are already correct, rather than being asked to do arithmetic on raw warehouse rows.

## Keeping warehouse data secure

The application authenticates with Application Default Credentials through secure API gateways. No warehouse data leaves the perimeter except as model inputs explicitly scoped per module. The LLM sees exactly the structured JSON `strategist.py` hands it, and nothing upstream of that.

## Why a scheduled AI agent beats a chat interface

This project is a working proof that an LLM can move past being a chat window someone has to remember to open, and become a scheduled, deterministic part of the reporting pipeline itself. It standardizes the reporting methodology across every executive report instead of leaving it to whoever’s writing that week’s version, and it turns “how are we doing?” from a four-hour analyst question into a one-command run that’s ready before the standup.

## Related projects

-   [Enterprise Ad Campaign Automation](https://yigitalpkorpe.com/projects/ads-automation/) automates the campaign operations that feed performance data downstream.
-   [Daily Reporting Automation](https://yigitalpkorpe.com/projects/daily-reporting/) is the simpler ETL-and-email precursor to this reporting agent.

[Previous Enterprise Ad Campaign Automation](https://yigitalpkorpe.com/projects/ads-automation/) [Next DataLayer Sidepanel](https://yigitalpkorpe.com/projects/datalayer-sidepanel/)

---

Canonical HTML: https://yigitalpkorpe.com/projects/ai-marketing-agent/

Site map: https://yigitalpkorpe.com/sitemap.xml · Summary for LLMs: https://yigitalpkorpe.com/llms.txt · Agent instructions: https://yigitalpkorpe.com/agents.md · All endpoints: https://yigitalpkorpe.com/agents/

========================================================================

---
title: "Programmatic SEO Content Automation with the ChatGPT API, Alp Korpe"
description: "A Python pipeline using the ChatGPT API and Unsplash to generate SEO-optimized blog posts. Proved the viability of programmatic SEO, driving a 2× increase…"
url: https://yigitalpkorpe.com/projects/blog-automation/
site: yigitalpkorpe.com
---

[Projects](https://yigitalpkorpe.com/projects/) / Automation

*Automation · Selected work*

# AI-Powered Content Engine

Automated blog pipeline that proved programmatic SEO works, even at baseline quality.

Stack

-   Python
-   OpenAI API
-   Unsplash API
-   Basic NLP

Links

-   [GitHub repository ](https://github.com/yigitalpkorpe/blog_automation)

Impact

-   2× organic traffic increase
-   Fully automated post production

![AI-Powered Content Engine — Automated blog pipeline that proved programmatic SEO works, even at baseline quality.](https://yigitalpkorpe.com/_astro/blogging.DGmU3wa3_2aNiJ3.webp)

I run [Ad Mocker](https://yigitalpkorpe.com/projects/admocker/), live at [admocker.com](https://admocker.com/), and thought it had room to pick up organic traffic, but writing blog posts isn’t my favorite work, and I was curious how Google would actually respond to AI-assisted content on a real, indexed domain rather than a test property. So I built the smallest possible pipeline that could take a topic and ship a published post end-to-end, with no manual step in between.

## Topic generation from sitemap gaps

The pipeline starts by reading the site’s current sitemap to see what’s already covered, then identifies the gaps: topics adjacent to existing content that nothing on the site addresses yet. It asks the model for a batch of SEO-relevant title candidates against those gaps, so every post starts from an actual hole in the site’s coverage instead of a topic picked at random.

## Drafting and sourcing imagery automatically

Once a title is chosen, the post is generated through the ChatGPT API against a structured prompt and a fixed format the site already uses, so output is consistent post to post rather than reinventing structure every time. A light NLP pass over the title extracts keywords, which drive a call to the Unsplash API to pull relevant photography. Credits are attributed automatically, no manual image search or licensing check required.

## Publishing pipeline

The finished post is saved as a static page and committed straight to the site. There’s no CMS, no draft-review queue, no human gate between generation and publication. That’s deliberate: the whole point of the experiment was measuring what happens when the content surface area exists, not building an editorial workflow around it.

## Doubled organic traffic

After the AI-assisted pages were indexed, impressions and clicks on the domain roughly doubled. A domain with thin content gets meaningfully more search visibility once the content surface area exists at all, even at a baseline quality bar. The content being AI-written mattered less than the content existing in the first place: more indexed pages addressing more specific queries beat fewer, thinner pages every time.

The code lives [on GitHub](https://github.com/yigitalpkorpe/blog_automation).

## When programmatic SEO is the right tool

This only works because admocker.com had genuine coverage gaps, not because automation is a substitute for having something to say. A domain that’s already thin loses far more from having ten pages than from having one bad page, since search engines reward topical coverage as much as they reward any single piece being excellent. The pipeline is intentionally narrow for the same reason the rest of my side projects are: it does one job, close a specific content gap on a specific domain, and doesn’t try to be a general-purpose CMS.

## Related projects

-   [Page Density Checker](https://yigitalpkorpe.com/projects/seo-tool/) handles the crawling and content analysis behind the same SEO workflow.
-   [IsVisible.ai](https://yigitalpkorpe.com/projects/isvisible/) checks whether search and AI crawlers can reach the pages once they are published.

[Previous Ad Mocker](https://yigitalpkorpe.com/projects/admocker/) [Next IsVisible.ai](https://yigitalpkorpe.com/projects/isvisible/)

---

Canonical HTML: https://yigitalpkorpe.com/projects/blog-automation/

Site map: https://yigitalpkorpe.com/sitemap.xml · Summary for LLMs: https://yigitalpkorpe.com/llms.txt · Agent instructions: https://yigitalpkorpe.com/agents.md · All endpoints: https://yigitalpkorpe.com/agents/

========================================================================

---
title: "Chrome Extension: One-Click Copy Button for ChatGPT Responses, Alp Korpe"
description: "A small Chrome extension that puts a copy button next to every ChatGPT answer. Removes the awkward triple-click-and-drag from a workflow people repeat…"
url: https://yigitalpkorpe.com/projects/chatgpt-copier/
site: yigitalpkorpe.com
---

[Projects](https://yigitalpkorpe.com/projects/) / Productivity

*Productivity*

# ChatGPT Copier

Chrome extension that adds a one-click copy button to every ChatGPT response.

Stack

-   JavaScript
-   Chrome Extension API
-   Content Scripts

Links

-   [Chrome Web Store ](https://chromewebstore.google.com/detail/chatgpt-copier/nkbmeknchklpmhfgafgfnmmegdacafbe)
-   [Product Hunt ](https://www.producthunt.com/posts/chatgpt-copier)

![ChatGPT Copier — Chrome extension that adds a one-click copy button to every ChatGPT response.](https://yigitalpkorpe.com/_astro/chatgpt-copier.Cv9ayWWr_33TAe.webp)

A small Chrome extension that adds a one-click copy button to every ChatGPT response. There’s no configuration and no settings page. Install it, and the button just appears wherever ChatGPT’s responses do, from the next reply onward.

## The triple-click-and-drag problem

Copying a ChatGPT answer without the extension means the triple-click-drag-Cmd-C ritual: click to select a paragraph, drag to extend the selection across line breaks and code blocks, and hope the formatting comes along cleanly instead of picking up stray whitespace or breaking mid-sentence. It’s a small friction, but a small friction repeated constantly: people who use ChatGPT heavily do that dance several hundred times a week. The math justifies a tool this narrow.

## One-click copy, and nothing else

A copy button doesn’t need an options page, an account, or a dashboard. It needs to work every single time and get out of the way otherwise. The scope stays deliberately narrow: copy the response text, cleanly, and do nothing else. For a utility this small, every added feature is one more chance to break the one thing it’s supposed to do reliably, so the extension resists the urge to grow one.

## How it tracks new responses

ChatGPT’s interface streams responses in and re-renders as the conversation grows, so a copy button can’t just be placed once at page load. It has to appear correctly on messages that don’t exist yet when the extension first runs. A content script watches the DOM for new response blocks as they’re added and attaches the button to each one as it appears, rather than relying on a fixed list of selectors that would break the moment ChatGPT’s UI shifts.

## Install and permissions

Vanilla JavaScript, no external dependencies, no analytics, no framework: there’s nothing here that needs one. The extension asks for nothing beyond permissions on the chat domain itself: no broad host access, no background tracking, no data leaving the browser. Available on the [Chrome Web Store](https://chromewebstore.google.com/detail/chatgpt-copier/nkbmeknchklpmhfgafgfnmmegdacafbe) and featured on [Product Hunt](https://www.producthunt.com/posts/chatgpt-copier).

## Related projects

-   [PageNote](https://yigitalpkorpe.com/projects/page-notes/) is another deliberately narrow Chrome extension built around one repeated browser task.
-   [DataLayer Sidepanel](https://yigitalpkorpe.com/projects/datalayer-sidepanel/) uses Chrome’s side panel for real-time analytics debugging.

[Previous GA-Slack Bot](https://yigitalpkorpe.com/projects/ga-slack-integration/) [Next PageNote](https://yigitalpkorpe.com/projects/page-notes/)

---

Canonical HTML: https://yigitalpkorpe.com/projects/chatgpt-copier/

Site map: https://yigitalpkorpe.com/sitemap.xml · Summary for LLMs: https://yigitalpkorpe.com/llms.txt · Agent instructions: https://yigitalpkorpe.com/agents.md · All endpoints: https://yigitalpkorpe.com/agents/

========================================================================

---
title: "Python ETL Pipeline for Automated Daily Marketing Reports, Alp Korpe"
description: "A Python ETL pipeline that replaced daily CSV merging across the team. Collects yesterday's data, merges it with running history, generates a report, and…"
url: https://yigitalpkorpe.com/projects/daily-reporting/
site: yigitalpkorpe.com
---

[Projects](https://yigitalpkorpe.com/projects/) / Automation

*Automation*

# Daily Reporting Automation

Python ETL pipeline that automates the daily marketing report, end to end.

Stack

-   Python
-   Pandas
-   NumPy
-   smtplib

![Daily Reporting Automation — Python ETL pipeline that automates the daily marketing report, end to end.](https://yigitalpkorpe.com/_astro/robot.cNr7yfmM_1YA65.webp)

A Python script that automates a daily, repetitive routine end to end: collecting raw data, merging it with the previous days’ history, generating a summary, and sending the report by email. It runs on a cron schedule and is configured per use case, so the same pipeline can handle different data sources and different recipient lists without a rewrite.

## The daily morning-report problem

Most marketing teams have a “morning report”: a spreadsheet someone updates every day before the standup. The work is mechanical, the schedule is unforgiving, and the output is the same shape every time: exactly the kind of task a script should own instead of a person. Miss a day by hand and the history has a gap that someone eventually has to explain or backfill; miss a day with a cron job and it just runs at 6am regardless of who’s on vacation or out sick.

## How the ETL pipeline runs

Each run collects yesterday’s data from the configured source, merges it with the running history file, and generates the report in the same format the team already reads, then emails it to the configured recipient list on schedule. Nothing about the routine depends on a person remembering to kick it off.

## Trend context, not just a daily snapshot

Pandas merges yesterday’s pull against the running history file, so the report always carries real trend context (this week versus last week, this month’s trajectory) rather than a single day’s numbers in isolation. A daily snapshot on its own answers “what happened yesterday”; merged against history, the same report starts answering “is this normal,” which is the question a standup actually needs answered.

## Configuring new sources without touching code

The recipient list, source paths, and schedule all live in a small YAML config file, so pointing the pipeline at a new team or a new data source is an edit, not a deploy. Python handles the data work with Pandas and NumPy, and `smtplib` sends the finished report: a deliberately plain stack, chosen so a non-engineer can read the config and understand exactly what will run without needing to open the script itself.

## Related projects

-   [Enterprise Ad Campaign Automation](https://yigitalpkorpe.com/projects/ads-automation/) replaces a larger Google Ads workflow with the same kind of scheduled Python system.
-   [Autonomous RevOps AI Agent](https://yigitalpkorpe.com/projects/ai-marketing-agent/) takes automated reporting from recurring summaries to strategic analysis.

[Previous IsVisible.ai](https://yigitalpkorpe.com/projects/isvisible/) [Next GA-Slack Bot](https://yigitalpkorpe.com/projects/ga-slack-integration/)

---

Canonical HTML: https://yigitalpkorpe.com/projects/daily-reporting/

Site map: https://yigitalpkorpe.com/sitemap.xml · Summary for LLMs: https://yigitalpkorpe.com/llms.txt · Agent instructions: https://yigitalpkorpe.com/agents.md · All endpoints: https://yigitalpkorpe.com/agents/

========================================================================

---
title: "GTM DataLayer Debugger — Real-Time Chrome Side Panel, Alp Korpe"
description: "A Chrome extension that surfaces GTM dataLayer events in real time, directly in the browser's side panel. Featured on Product Hunt; used by marketing…"
url: https://yigitalpkorpe.com/projects/datalayer-sidepanel/
site: yigitalpkorpe.com
---

[Projects](https://yigitalpkorpe.com/projects/) / Web Tools

*Web Tools · Selected work*

# DataLayer Sidepanel

Chrome side-panel extension that shows Google Tag Manager dataLayer events in real time.

Stack

-   JavaScript
-   Chrome Extension API
-   Google Tag Manager
-   DataLayer API

Links

-   [Install on Chrome Web Store ](https://chromewebstore.google.com/detail/gkfagomcegoajdklkjnllkhhcocedoag)
-   [Product Hunt ](https://www.producthunt.com/products/datalayer-sidepanel)

Impact

-   Featured on Product Hunt
-   Used daily by marketing & analytics teams

![DataLayer Sidepanel — Chrome side-panel extension that shows Google Tag Manager dataLayer events in real time.](https://yigitalpkorpe.com/_astro/datalayer_buddy.BUsAfe4Y_21zmBv.webp)

DataLayer Sidepanel is a Chrome extension for monitoring and analyzing Google Tag Manager dataLayer pushes and events in real time. Instead of opening the developer console, switching tabs, and parsing raw arrays by eye, it gives you a clean, persistent view inside Chrome’s own side panel, running alongside whatever page you’re auditing.

## Real-time dataLayer monitoring

Every dataLayer push appears the moment it fires, with auto-refresh so there’s no manual reload to trigger between page interactions. Click through a funnel, submit a form, trigger a custom event: the panel updates as the page does, live, without a second window competing for screen space.

## Inspecting events without the console

Each entry is expanded into a readable structure rather than a stringified blob you have to mentally parse. That distinction matters more than it sounds: `console.log(dataLayer)` gives you an array of objects that’s technically inspectable but slow to scan under pressure, especially mid-QA when you’re trying to confirm one specific field fired correctly. A structured, always-visible panel turns that into a glance instead of an expand-click-scroll cycle repeated for every event.

## Why the side panel beats a modal debugger

GTM debugging tooling has always been a little awkward. Google’s own Tag Assistant works, but it’s modal and disruptive: it takes over the browser window instead of sitting alongside your work. Console.log spelunking is the fallback, and it’s worse. The side panel is the natural place for a live tracking inspector: always visible, never in the way, updating in the background while you interact with the page normally. Once Chrome shipped the side panel API, building the right tool on top of it became the obvious move rather than working around Tag Assistant’s limitations.

## Adopted by analytics teams

Featured on Product Hunt at launch, and adopted since as a default install by marketing analytics teams, specifically for QA’ing tracking changes before they ship to production, where catching a broken or missing dataLayer push before a release matters more than catching it after.

## Related projects

-   [PageNote](https://yigitalpkorpe.com/projects/page-notes/) keeps research notes attached to the URL where they matter.
-   [ChatGPT Copier](https://yigitalpkorpe.com/projects/chatgpt-copier/) is another one-purpose Chrome extension designed to remove repeated friction.

[Previous Autonomous RevOps AI Agent](https://yigitalpkorpe.com/projects/ai-marketing-agent/) [Next Ad Mocker](https://yigitalpkorpe.com/projects/admocker/)

---

Canonical HTML: https://yigitalpkorpe.com/projects/datalayer-sidepanel/

Site map: https://yigitalpkorpe.com/sitemap.xml · Summary for LLMs: https://yigitalpkorpe.com/llms.txt · Agent instructions: https://yigitalpkorpe.com/agents.md · All endpoints: https://yigitalpkorpe.com/agents/

========================================================================

---
title: "Google Analytics to Slack Bot — Anomaly Alerts & Reports, Alp Korpe"
description: "A Python bot that reads Google Analytics, watches for unusual traffic patterns, and posts anomalies plus scheduled summaries to a Slack channel. Built so…"
url: https://yigitalpkorpe.com/projects/ga-slack-integration/
site: yigitalpkorpe.com
---

[Projects](https://yigitalpkorpe.com/projects/) / Automation

*Automation*

# GA-Slack Bot

Slack bot that posts Google Analytics anomaly alerts and scheduled reports.

Stack

-   Python
-   Google Analytics API
-   Slack API

![GA-Slack Bot — Slack bot that posts Google Analytics anomaly alerts and scheduled reports.](https://yigitalpkorpe.com/_astro/bot.Cg8srWsd_Z2geEpW.webp)

A Slack bot that watches a website’s Google Analytics for unusual patterns and pushes both anomaly alerts and scheduled summaries directly into a team’s Slack channel. The point is to remove the daily ritual of opening GA at all. If something matters, the bot says so; otherwise the channel stays quiet and nobody has to go looking for a problem that isn’t there.

## Anomaly alerts in Slack, not another GA login

Traffic and conversion anomalies get flagged the moment the deviation appears, posted straight into the channel the team already has open. That’s a deliberately different default from most analytics tooling, which assumes someone will log in and check. This one assumes nobody will, most days, and is built so that’s fine.

## Scheduled GA reports on your cadence

Beyond anomaly alerts, the bot posts scheduled summaries at whatever cadence a team picks (daily, weekly, or monthly) and it’s configurable per channel, since different teams inside the same company usually care about different metrics. A paid-acquisition channel and a content channel don’t need the same report shape, and shouldn’t have to filter one shared digest to find their numbers.

## Why a statistical baseline beats ML here

Most marketing teams don’t have the traffic volume to make a machine-learned anomaly model reliable: thin data makes for noisy, overconfident predictions that cry wolf as often as they catch anything real. A simple statistical baseline, flagging deviation from a rolling average, is honest about what the signal actually supports at typical marketing-team traffic levels. It’s also transparent in a way a trained model isn’t: a marketer can see exactly why something got flagged, which matters for trusting the alert enough to act on it.

## Stack

Python runs the core logic. The GA Reporting API pulls the underlying data, and Slack’s incoming webhooks push the alerts and summaries back out. Anomaly detection stays a simple statistical baseline rather than a trained model: the right level of sophistication for the signal density most marketing teams actually have, not the level a vendor demo would show off.

## Related projects

-   [Daily Reporting Automation](https://yigitalpkorpe.com/projects/daily-reporting/) runs a parallel scheduled reporting workflow over email.
-   [Autonomous RevOps AI Agent](https://yigitalpkorpe.com/projects/ai-marketing-agent/) expands automated reporting into executive analysis and rebudgeting scenarios.

[Previous Daily Reporting Automation](https://yigitalpkorpe.com/projects/daily-reporting/) [Next ChatGPT Copier](https://yigitalpkorpe.com/projects/chatgpt-copier/)

---

Canonical HTML: https://yigitalpkorpe.com/projects/ga-slack-integration/

Site map: https://yigitalpkorpe.com/sitemap.xml · Summary for LLMs: https://yigitalpkorpe.com/llms.txt · Agent instructions: https://yigitalpkorpe.com/agents.md · All endpoints: https://yigitalpkorpe.com/agents/

========================================================================

---
title: "AI Crawler Visibility Checker — GPTBot, ClaudeBot & More, Alp Korpe"
description: "Tests a URL against 13 real crawlers and search bots, including GPTBot, ClaudeBot, and PerplexityBot, by reading robots.txt and llms.txt and sending live…"
url: https://yigitalpkorpe.com/projects/isvisible/
site: yigitalpkorpe.com
---

[Projects](https://yigitalpkorpe.com/projects/) / Web Tools

*Web Tools · Selected work*

# IsVisible.ai

Free AI crawler visibility checker — tests whether GPTBot, ClaudeBot, and 11 others can reach your site.

Stack

-   Crawler Simulation
-   robots.txt & llms.txt Parsing
-   REST API

Links

-   [Try IsVisible.ai ](https://isvisible.ai)

Impact

-   Scores 100/100, Grade A, when run on this site

![IsVisible.ai — Free AI crawler visibility checker — tests whether GPTBot, ClaudeBot, and 11 others can reach your site.](https://yigitalpkorpe.com/_astro/isvisible.CLxIaPRy_ZGk35t.webp)

[IsVisible.ai](https://isvisible.ai) checks whether AI crawlers can actually reach a website. Paste in a URL and it tests against 13 crawlers and search bots: search engines (Googlebot, Bingbot), AI training crawlers (GPTBot, ClaudeBot, Google-Extended, CCBot, Bytespider, Applebot-Extended, meta-externalagent), and AI answer engines (ChatGPT-User, OAI-SearchBot, Claude-User, PerplexityBot). It reads the site’s [robots.txt](https://developers.google.com/search/docs/crawling-indexing/robots/intro) and llms.txt, sends live requests using each crawler’s real user agent, and merges the declared rules with what actually happens to produce a 0-100 visibility score and an agent-by-agent access map.

## Why sites block AI crawlers without knowing it

The Hardal team has been building an AI visibility reporting product, one that shows companies which AI crawlers are actually visiting their site. Working on that, the same gap kept turning up: sites expected to show up when someone asked ChatGPT or Claude about them, with no idea they were blocking the exact crawlers that make that possible. Old robots.txt rules written for a pre-LLM web, a missing llms.txt, a WAF setting nobody had touched in years. None of it shows up unless someone actually simulates the crawlers and checks. IsVisible.ai is the free, standalone check for that specific gap.

## Seeing it work

Run against this site, yigitalpkorpe.com scores 100 out of 100, Grade A: fully accessible to Google Search, Bing/Copilot, Google Gemini and AI Overviews training, GPTBot training, and the rest of the 13 crawlers it checks.

![IsVisible.ai report for yigitalpkorpe.com: 100/100, Grade A](https://yigitalpkorpe.com/_astro/isvisible-score.DL5ycjDu_ZyX2vE.webp)

## How the crawler simulation works

Getting the crawler simulation right took more tweaking than expected. Different bots honor different rules: some respect a wildcard `Disallow`, some only match their exact user-agent string, some ignore robots.txt for training purposes but respect it for live retrieval. Redirects add another layer: a crawler blocked on the final URL but allowed on a redirecting one produces a different result than checking either URL in isolation. How a site responds to a user agent it’s never seen before turned into its own category of edge case, since some servers default to blocking unfamiliar bots rather than allowing them.

## API access

The tool is free with no signup for the standard check, and it also exposes an unauthenticated REST API for checking a site programmatically, useful for teams that want the same crawler-access check as part of a CI pipeline or a recurring monitor, rather than a one-off manual lookup.

## Related projects

-   [Page Density Checker](https://yigitalpkorpe.com/projects/seo-tool/) analyzes the pages a crawler can reach for density and duplication.
-   [AI-Powered Content Engine](https://yigitalpkorpe.com/projects/blog-automation/) automates the production side of the same SEO workflow.

[Previous AI-Powered Content Engine](https://yigitalpkorpe.com/projects/blog-automation/) [Next Daily Reporting Automation](https://yigitalpkorpe.com/projects/daily-reporting/)

---

Canonical HTML: https://yigitalpkorpe.com/projects/isvisible/

Site map: https://yigitalpkorpe.com/sitemap.xml · Summary for LLMs: https://yigitalpkorpe.com/llms.txt · Agent instructions: https://yigitalpkorpe.com/agents.md · All endpoints: https://yigitalpkorpe.com/agents/

========================================================================

---
title: "Restock Alerts — Get Emailed When a Size Comes Back in Stock, Alp Korpe"
description: "A small site (\"Has My Size Arrived?\" in Turkish) that watches a product URL for a specific size and emails the user when it becomes available. Born from…"
url: https://yigitalpkorpe.com/projects/monitor/
site: yigitalpkorpe.com
---

[Projects](https://yigitalpkorpe.com/projects/) / Web Tools

*Web Tools*

# Bedeni Geldi mi?

Watches a product page and emails you the moment your size is back in stock.

Stack

-   Python
-   Web Scraping
-   PHP
-   Email Automation

![Bedeni Geldi mi? — Watches a product page and emails you the moment your size is back in stock.](https://yigitalpkorpe.com/_astro/monitor.BgNL7z30_Z1tmbW5.webp)

“Bedeni Geldi mi?” (Turkish for *Has My Size Arrived?*) is a small web service that monitors a product URL for a specific size and emails the user the moment it comes back in stock. The interface is a single form: brand, link, size, your email. No account, no dashboard to check back on.

## The restock-checking problem

Mostly this exists because I wanted it. The pattern of refreshing a clothing brand’s product page, hoping a single sold-out size has restocked since the last check, is a small but real tax on attention: a background task your brain keeps re-running for no good reason. A daemon does this far better than a person: it doesn’t get bored, doesn’t forget, and doesn’t need to be reminded to check again tomorrow.

## How the watch list works

Each submission becomes an entry on a watch list that a scheduled job walks on a fixed interval, re-scraping every tracked product and diffing current size availability against the last known state for that specific size. The moment a watched size flips from sold-out to available, the notification fires on its own. There’s nothing left for the user to check, refresh, or remember. The diff is per size, not per product, so a restock of a different size on the same page doesn’t trigger a false alert.

## Brand-specific scraping, one shared notification path

The form runs on a PHP front end; a Python worker handles scraping and notification, triggered by the same scheduled job that walks the watch list. The scraping side is brand-specific by necessity (every retailer marks up size availability differently, so the parsers diverge site by site), but the notification path is shared across all of them. Adding support for a new brand means writing one new parser, not rebuilding the pipeline.

## Related project

[Series Watcher](https://yigitalpkorpe.com/projects/series-watcher/) uses the same scheduled-email pattern to deliver a weekly TV episode digest.

[Previous PageNote](https://yigitalpkorpe.com/projects/page-notes/) [Next Page Density Checker](https://yigitalpkorpe.com/projects/seo-tool/)

---

Canonical HTML: https://yigitalpkorpe.com/projects/monitor/

Site map: https://yigitalpkorpe.com/sitemap.xml · Summary for LLMs: https://yigitalpkorpe.com/llms.txt · Agent instructions: https://yigitalpkorpe.com/agents.md · All endpoints: https://yigitalpkorpe.com/agents/

========================================================================

---
title: "Murder Matrix — Cozy Logic Deduction Puzzle Game for iOS, Alp Korpe"
description: "An indie iOS puzzle game. Procedurally generated cases across six original locations, three difficulty tiers, a daily challenge with a shareable seed. No…"
url: https://yigitalpkorpe.com/projects/murder-matrix/
site: yigitalpkorpe.com
---

[Projects](https://yigitalpkorpe.com/projects/) / iOS Apps

*iOS Apps*

# Murder Matrix

Cozy logic-deduction puzzle game for iOS. No ads, no timers, no accounts.

Stack

-   SwiftUI
-   SwiftData
-   CloudKit

Links

-   [Download on the App Store ](https://apps.apple.com/us/app/murder-matrix/id6766099815)

![Murder Matrix — Cozy logic-deduction puzzle game for iOS. No ads, no timers, no accounts.](https://yigitalpkorpe.com/_astro/murder-matrix.BZIHJ1lh_ZwcDLu.webp)

Murder Matrix is a cozy logic-deduction puzzle for iOS. Each case asks you to place suspects on a small grid based on the clues they give, and the empty square left over reveals the victim. It’s a small, careful game, closer to a crossword than a thriller. Designed and built solo, pure SwiftUI, no third-party dependencies, from first principles.

## How to play

Read the clues. Each suspect tells you something about where they were standing relative to the others. Place them on the grid so no two share a row or column, using the clues to eliminate positions one at a time the way you’d work a logic puzzle on paper. When all but one suspect is placed, the last empty square reveals itself, and whoever shares that room with it is the murderer.

## Six locations, three difficulty tiers

-   **Six original locations**, each with its own pastel palette and floor plan, so the puzzle grid itself changes shape and mood from case to case.
-   **Procedurally generated puzzles** with one guaranteed solution. Every case is unique: nothing is hand-authored or reused, so there’s no puzzle database to exhaust.
-   **Three difficulty tiers**: Rookie, Detective, and Mastermind, scaling grid size and clue density rather than adding artificial obstacles.
-   **A daily challenge** with a shareable seed, so you can compare your solve time against a friend working the exact same case.
-   **No ads, tracking, or accounts to set up.** Open the app and there’s a puzzle waiting, nothing to configure first.

## A cozy puzzle with no timer pressure

Nothing about the format punishes the player for taking their time. Cozy was the design target from the start: the tension comes from the logic itself, not from the interface pressuring you to hurry. The daily challenge is the one nod to competition in the whole game, and even that stays asynchronous: you compare a solve time with a friend whenever it’s convenient, not against a live leaderboard ticking in real time.

## Built with SwiftUI, no third-party trackers

SwiftUI handles the interface, SwiftData handles local storage, and CloudKit provides optional cross-device sync for anyone who plays on both an iPhone and an iPad. Everything else runs entirely on-device, with no server component and no third-party analytics or SDKs collecting data in the background. That’s a deliberate match for a game whose whole pitch is that it doesn’t want anything from you beyond attention to the puzzle.

## Related project

[Musento](https://yigitalpkorpe.com/projects/musento/) is another privacy-conscious iOS app built in SwiftUI, this time for logging museum visits.

[Previous Series Watcher](https://yigitalpkorpe.com/projects/series-watcher/) [Next Musento](https://yigitalpkorpe.com/projects/musento/)

---

Canonical HTML: https://yigitalpkorpe.com/projects/murder-matrix/

Site map: https://yigitalpkorpe.com/sitemap.xml · Summary for LLMs: https://yigitalpkorpe.com/llms.txt · Agent instructions: https://yigitalpkorpe.com/agents.md · All endpoints: https://yigitalpkorpe.com/agents/

========================================================================

---
title: "Musento — Letterboxd for Museums, a Visit Tracker for iOS, Alp Korpe"
description: "Letterboxd for museums: an iOS app for keeping a personal record of the museums you visit. Log a visit with a date and private note, earn points and…"
url: https://yigitalpkorpe.com/projects/musento/
site: yigitalpkorpe.com
---

[Projects](https://yigitalpkorpe.com/projects/) / iOS Apps

*iOS Apps*

# Musento

Letterboxd for museums. Log every visit, earn points, and race friends up the leaderboard.

Stack

-   SwiftUI

![Musento — Letterboxd for museums. Log every visit, earn points, and race friends up the leaderboard.](https://yigitalpkorpe.com/_astro/musento.P77-lxuA_1BqWzB.webp)

Musento is Letterboxd for museums. Find a museum, log the visit with a date and an optional private note, and it joins your personal collection: points, achievements, and a history you can look back on years later. Built solo in SwiftUI.

## Log a visit, keep a diary

Every visit is a small record: which museum, which date, and what you thought of it. The date picker reaches back decades, so a lifetime of museum trips can be entered retroactively, not just the ones from after installing the app. Notes are private by default — visible only to you, never shown to friends or on any leaderboard — while the visit itself, the points it earned, and the achievements it unlocks become part of a public collection friends can see.

## An extensive museum catalogue

Rather than maintain a hand-curated list, Musento builds its museum catalogue from [Wikidata](https://www.wikidata.org/), covering a huge range of institutions worldwide, searchable by name or city and browsable by what’s nearby. Location is optional and used only to answer “what’s near me” — it’s sent for that one request and never stored, and the app never tracks location in the background. Search works fine without granting it at all.

## Points, achievements, and friends

Visits earn points and unlock achievements, and friends whose requests you’ve accepted can see your collection alongside their own. Global leaderboards rank handles and scores, turning a solitary hobby into something a little competitive. None of it depends on ads or trackers: points and standings have no monetary value, and the app doesn’t sell data to anyone.

## Private by design

Sign in with Apple or email, with your data protected behind row-level access controls so one member can never read another’s private data. Deleting an account from Settings removes the profile, visits, notes, friendships, and achievements immediately and irreversibly.

Read Musento’s [privacy policy](https://yigitalpkorpe.com/musento/privacy/) and [terms of use](https://yigitalpkorpe.com/musento/terms/), or visit [support](https://yigitalpkorpe.com/musento/support/) for help.

## Related project

[Murder Matrix](https://yigitalpkorpe.com/projects/murder-matrix/) is a second independently built iOS app, a logic-deduction game with no ads, trackers, or accounts.

[Previous Murder Matrix](https://yigitalpkorpe.com/projects/murder-matrix/)

---

Canonical HTML: https://yigitalpkorpe.com/projects/musento/

Site map: https://yigitalpkorpe.com/sitemap.xml · Summary for LLMs: https://yigitalpkorpe.com/llms.txt · Agent instructions: https://yigitalpkorpe.com/agents.md · All endpoints: https://yigitalpkorpe.com/agents/

========================================================================

---
title: "Chrome Extension for Per-URL Notes — PageNote, Alp Korpe"
description: "A Chrome extension for marketers and researchers that pins per-URL notes to whatever page you're looking at. Built for the 'what was I thinking when I…"
url: https://yigitalpkorpe.com/projects/page-notes/
site: yigitalpkorpe.com
---

[Projects](https://yigitalpkorpe.com/projects/) / Productivity

*Productivity*

# PageNote

Chrome extension that pins a note to any URL, right where you'll see it again.

Stack

-   JavaScript
-   Chrome Extension API
-   LocalStorage
-   DOM

Links

-   [Chrome Web Store ](https://chromewebstore.google.com/detail/page-notes/chcogmlnlajbbfpicbljbhnpimjdakln)

![PageNote — Chrome extension that pins a note to any URL, right where you'll see it again.](https://yigitalpkorpe.com/_astro/pagenotes.D5FQuzlO_1y3Ano.webp)

PageNote is a Chrome extension that lets you attach a note to any URL. Open the page again, even weeks later, and your notes are right there waiting. No separate app to open, no filename to remember.

## Notes for competitor and landing-page research

It’s built for the kind of research workflow marketers and researchers run every day: comparing a handful of competitor sites side by side, tracking how a campaign landing page changes over time, or just remembering “I already looked at this and decided X” the next time the same URL comes up in a different context. The note-taking habit is one click on the same toolbar icon regardless of which site you’re on, so it doesn’t compete for attention with whatever tool you’re actually using to do the research.

## Why per-URL, not a separate app

A dedicated notes app means switching windows and re-establishing context from scratch: which tab was this about, what was the note referring to. Pinning the note to the URL itself keeps the note and the evidence for it in the same place, since the note only really makes sense next to the page it’s about. Revisit the URL later and the context comes back with it automatically, with nothing to search for across a separate notes archive. It also removes a small but real daily decision (“which app do I open for this”) since the answer is always the same regardless of what site you’re currently looking at.

## No accounts, no sync, no telemetry

Standard Chrome extension setup: content scripts handle the on-page UI, and the Chrome storage API persists notes per URL locally. The surface area stays deliberately small: it doesn’t create accounts, doesn’t sync across devices, and doesn’t send telemetry anywhere. The tradeoff is explicit: notes stay on the machine where you wrote them, in exchange for a tool that has nothing to leak and nothing to sign into.

## Related projects

-   [ChatGPT Copier](https://yigitalpkorpe.com/projects/chatgpt-copier/) removes another small, frequently repeated action from the browser.
-   [DataLayer Sidepanel](https://yigitalpkorpe.com/projects/datalayer-sidepanel/) is the analytics-focused extension in the same family of tools.

[Previous ChatGPT Copier](https://yigitalpkorpe.com/projects/chatgpt-copier/) [Next Bedeni Geldi mi?](https://yigitalpkorpe.com/projects/monitor/)

---

Canonical HTML: https://yigitalpkorpe.com/projects/page-notes/

Site map: https://yigitalpkorpe.com/sitemap.xml · Summary for LLMs: https://yigitalpkorpe.com/llms.txt · Agent instructions: https://yigitalpkorpe.com/agents.md · All endpoints: https://yigitalpkorpe.com/agents/

========================================================================

---
title: "Python SEO Toolkit — Crawler, Density Checker & Duplicate Detector, Alp Korpe"
description: "A Python toolkit covering the SEO tasks that don't justify a paid tool subscription: crawling a site, measuring word density per page, comparing against…"
url: https://yigitalpkorpe.com/projects/seo-tool/
site: yigitalpkorpe.com
---

[Projects](https://yigitalpkorpe.com/projects/) / Web Tools

*Web Tools*

# Page Density Checker

Python SEO toolkit: site crawler, keyword density checker, and duplicate-content detector.

Stack

-   Python
-   Web Scraping
-   NLP
-   Cosine Similarity

![Page Density Checker — Python SEO toolkit: site crawler, keyword density checker, and duplicate-content detector.](https://yigitalpkorpe.com/_astro/technical-support.CIB_WQ6r_ZeMEaH.webp)

Page Density Checker is an SEO toolkit built during my Master’s degree. The aim was simple: a budget-friendly, code-first alternative to the parts of paid SEO suites that are mostly arithmetic (crawling, word density, similarity), the kind of tools that are easy enough to write and unreasonable to license by the month.

## Web crawler

A crawler walks a site and pulls per-page metadata for analysis: titles, headings, word counts, and the structural information the other three tools build on. It’s the foundation the rest of the toolkit runs on top of, rather than a standalone feature.

## Page and search density checkers

The page density checker reports word density on any URL, useful for checking whether a target keyword is actually present at a reasonable frequency, or missing entirely. The search density checker goes a step further: run a query, fetch the top 10 Google results, and get their density profiles back side by side. That turns “what does a page that ranks for this term actually look like” from a manual, page-by-page exercise into one report covering the whole first page of results at once.

## Duplicate content detection via cosine similarity

The similar page checker runs cosine similarity across a site’s pages to flag near-duplicates and cannibalization risk: two pages competing for the same query because they’re similar enough that Google can’t confidently pick one to rank. That’s a problem that’s invisible from inside a single page and only shows up when you compare documents directly, which is exactly what the similarity scoring is for.

## Why build vs. buy

The individual pieces here (crawl a site, count words, compare two documents) are each a few hundred lines of Python once you know what to build. Paid SEO suites bundle them behind a subscription because the value they’re selling is the workflow around the numbers, not the arithmetic itself. Building the toolkit from scratch was as much about understanding what those suites actually compute under the hood as it was about avoiding the subscription.

Requests and BeautifulSoup handle the scraping, Pandas shapes the resulting data, and a simple NLP layer covers keyword extraction and similarity scoring, all in Python, no paid APIs anywhere in the pipeline.

## Related projects

-   [AI-Powered Content Engine](https://yigitalpkorpe.com/projects/blog-automation/) turns identified content gaps into published pages.
-   [IsVisible.ai](https://yigitalpkorpe.com/projects/isvisible/) tests whether search and AI crawlers can access those pages.

[Previous Bedeni Geldi mi?](https://yigitalpkorpe.com/projects/monitor/) [Next Series Watcher](https://yigitalpkorpe.com/projects/series-watcher/)

---

Canonical HTML: https://yigitalpkorpe.com/projects/seo-tool/

Site map: https://yigitalpkorpe.com/sitemap.xml · Summary for LLMs: https://yigitalpkorpe.com/llms.txt · Agent instructions: https://yigitalpkorpe.com/agents.md · All endpoints: https://yigitalpkorpe.com/agents/

========================================================================

---
title: "TV Episode Tracker — Weekly Air-Date Email via TMDB API, Alp Korpe"
description: "A small weekly script that uses The Movie Database (TMDB) API to check the shows on a watch list, notes which episodes aired in the last week and which…"
url: https://yigitalpkorpe.com/projects/series-watcher/
site: yigitalpkorpe.com
---

[Projects](https://yigitalpkorpe.com/projects/) / Automation

*Automation*

# Series Watcher

Python script that emails a weekly digest of episodes airing on the shows you follow.

Stack

-   Python
-   TMDB API
-   Pandas
-   smtplib

![Series Watcher — Python script that emails a weekly digest of episodes airing on the shows you follow.](https://yigitalpkorpe.com/_astro/tv.DXKMBcco_Z2msGcQ.webp)

A Python script that uses [The Movie Database (TMDB) API](https://developer.themoviedb.org/docs/getting-started) to gather data on a list of TV series and email a weekly summary: what aired in the past week, what’s coming in the next one. Configured by editing a list, with no UI and no settings page to open.

## What airs this week

It’s the kind of script that exists because the alternative is checking five different streamers’ schedules on a Sunday evening, one at a time, to see whether anything on your list actually has a new episode. The email itself stays deliberately plain text, a scannable list rather than a dashboard, because the whole point is trading five minutes of app-switching for thirty seconds of reading a single message.

## How the watch list decides what to report

The watch list is just a list of show titles, nothing more elaborate. Each run, the script queries MovieDB for every title on the list, compares each show’s air dates against the current week’s date range, and buckets episodes into two groups: “aired” for the past week, “upcoming” for the next one. The API is treated as the source of truth on every single run, so there’s no local schedule cache to keep in sync or go stale. Add a show to the list and it’s covered on the very next run, with full history already available through the API.

## One list across every streaming service

Most streaming apps will tell you when their own new episode drops, but only inside that one app, and only for shows on that one service. A watch list spanning shows across several different services only comes together if something sits above all of them, which is what a single weekly email, sourced from one API instead of five separate apps, actually gives you.

## Stack

The TMDB API supplies the show and episode data, Pandas handles the date-range comparisons that sort episodes into aired versus upcoming, and `smtplib` sends the finished email: plain Python throughout, with no framework and no database, since a flat list and a weekly cron run are all the problem actually needs.

## Related project

[Bedeni Geldi mi?](https://yigitalpkorpe.com/projects/monitor/) applies the same scheduled monitoring and email-notification pattern to product restocks.

[Previous Page Density Checker](https://yigitalpkorpe.com/projects/seo-tool/) [Next Murder Matrix](https://yigitalpkorpe.com/projects/murder-matrix/)

---

Canonical HTML: https://yigitalpkorpe.com/projects/series-watcher/

Site map: https://yigitalpkorpe.com/sitemap.xml · Summary for LLMs: https://yigitalpkorpe.com/llms.txt · Agent instructions: https://yigitalpkorpe.com/agents.md · All endpoints: https://yigitalpkorpe.com/agents/
