{"slug": "the-decline-of-google-and-rise-of-alternative-searches-as-the-source-of-traffic", "title": "The decline of Google and rise of alternative searches as the source of traffic", "summary": "The share of traffic to a personal blog from Google has steadily declined since July 2024, while visits from alternative search engines have risen, according to self-hosted analytics data analyzed by the blog's author. The author used Python and Pandas to extract and examine two years of Umami analytics data from a PostgreSQL database. The shift aligns with Google's increasing integration of AI into its search results, which has prompted some users to seek other search platforms.", "body_md": "## The decline of Google and rise of alternative searches as the source of traffic\n\n[Click to skip the introduction and go straight to the results.](#result)\n\nThe first part of the story is that, as I already wrote\n[here](https://stfn.pl/blog/40-umami-self-hosted-analytics/) and\n[here](https://stfn.pl/blog/88-i-got-hacked/), I am using self-hosted\n[Umami](https://umami.is) as the analytics engine for this blog. I am using it\nbecause I am curious to know how many people visit my blog, and I like numbers\nand graphs. Of course in this day and age, saying \"humans\" is a stretch, because\nyou can never be sure if a visit is a human, or a bot. Umami does filter out a\nlot of the automated traffic because it requires JS on the client to count the\nvisit, but it is not foolproof.\n\nThe second part is that lately I've been into Data Science and ML, I am doing an\nAssociate Data Scientist course at [datacamp.com](https://datacamp.com), and\ncombining it with exercises at [Kaggle](https://kaggle.com). Right now I am\nfocusing on [Pandas](https://pandas.pydata.org/), sadly not the monochrome\nbears, but a library for data analysis and manipulation.\n\nAnd the third part is that for the last months I have been witnessing a steady\ndecline of visits coming to my blog from Google, and on the other appendage, a\nrise with visitors finding my blog through other search engines. This seems to\nbe in line with the fact that Google is pushing more and more AI into its search\nengine to the point that [it plans to no longer show search results as\nlinks](https://techcrunch.com/2026/05/19/google-search-as-you-know-it-is-over/),\nand that causes a reaction of people leaving Google Search for other search places.\n\nThis blog post is an attempt to connect those dots, and see in concrete numbers how the visits coming from various search engines have been changing for the last two years. Two years, because I have been using Umami since July 2024.\n\nHere's how I did it.\n\n## Data Extraction\n\nI am running Umami as a Docker Compose service in one of my VPSes. The service consists of the web worker container, and a Postgres container running the database. I cannot, and don't want to connect straight to that database, because it is not reachable outside the Docker internal network, and should not be.\n\nThe first step was to create a dump of the database by running the command below on the VPS:\n\n```\ndocker compose exec -t db pg_dumpall -U umami > dump.sql\n```\n\nThis extracts the database into a `.sql`\n\nfile. I then `scp`\n\nit into my laptop.\n\nI have a PostgreSQL database running in an LXC container in my Proxmox node in\nthe homelab, which is easily reachable from my laptop. So I decided that the\nnext step was to `scp`\n\nthe dump file to the database LXC, restore the dump to\nthat database, and use it to query the data. But first I had to create the user\nand the database in my local PostgreSQL.\n\n```\nsu postgres\ncreateuser --pwprompt umami\ncreatedb -O umami umami\n# providing host enforces password authentication\npsql --username umami -h localhost -W umami < dump.sql\n```\n\nNow I have a mirror of the Umami database in my local homelab to which I can easily connect and ingest the data.\n\n## Data Analysis\n\nDuring the last [P.I.W.O](https://piwo.sh/pl/) (Poznań Free Software Fest) I\nattended a lecture about [Marimo](https://marimo.io/), which aims to be the next\ngen replacement of Jupyter Notebooks. The next day I installed it on my laptop\nand got instantly hooked, Marimo feels so nice, much more polished than Jupyter,\nand fits perfectly into my current Data Science plot arc. And so it has been the\ntool of choice for this investigation.\n\n### Here's how I did the analysis in Python and Pandas:\n\nFirst, connecting to the database and fetching the data:\n\n``` python\nimport pandas as pd\nimport psycopg2\nfrom sqlalchemy import create_engine\n\nhost = \"192.168.88.XXX\"\nport = 5432\ndbname = \"umami\"\nusername = \"umami\"\npwd = \"correcthorsebatterystaple\"\n\nengine = create_engine(f'postgresql+psycopg2://{username}:{pwd}@{host}/{umami}',connect_args={\"options\": \"-c client_encoding=utf8\"})\n\nvisits = pd.read_sql(\"SELECT * FROM website_event where website_id = 'b28dd954-acaa-48b1-a1db-dd161dd35d98';\", con=engine)\n```\n\nThis is basic, self-explanatory Python. Import the packages, define the\nvariables for the connection. Then use a popular SQL ORM, SQLAlchemy to do the\nactual connection handling, and finally load the table into a Pandas Dataframe.\n`website_event`\n\nis the table storing the visits to my blog, which each row being\na single visits to a page. One thing of note is the WHERE clause, I have more\nthan one website tracked in Umami, so I had to filter the visits to include this\nblog only.\n\nAnd the analysis itself:\n\n```\nsummary = (\n    visits\n    .groupby(pd.Grouper(key='created_at', freq='MS'))\n    .agg(\n        all_visits=(\"event_id\", \"count\"),\n        google_visits=('referrer_domain', lambda x: x.str.contains('google', case=False, na=False).sum()),\n        ddg_visits=('referrer_domain', lambda x: x.str.contains('duckduckgo', case=False, na=False).sum()),\n        bing_visits=('referrer_domain', lambda x: x.str.contains('bing', case=False, na=False).sum()),\n        ecosia_visits=('referrer_domain', lambda x: x.str.contains('ecosia', case=False, na=False).sum()),\n        qwant_visits=('referrer_domain', lambda x: x.str.contains('qwant', case=False, na=False).sum()),\n        startpage_visits=('referrer_domain', lambda x: x.str.contains('startpage', case=False, na=False).sum()),\n        kagi_visits=('referrer_domain', lambda x: x.str.contains('kagi', case=False, na=False).sum()),\n        brave_visits=('referrer_domain', lambda x: x.str.contains('search.brave', case=False, na=False).sum())\n    )\n      .reset_index()\n      .sort_values(by='created_at')\n)\n\nsummary[\"non_google_visits\"] = (\n    summary[\"ddg_visits\"] \n    + summary[\"bing_visits\"]\n    + summary[\"ecosia_visits\"]\n    + summary[\"qwant_visits\"]\n    + summary[\"startpage_visits\"]\n    + summary[\"kagi_visits\"] \n    + summary[\"brave_visits\"]\n)\nsummary[\"ratio\"] = summary[\"non_google_visits\"] / summary[\"google_visits\"] * 100\n\n# drop the row because it's for the current month which has not finished yet\nsummary.drop(summary.tail(1).index, inplace=True)\n\nfinal = summary[[\"created_at\", \"google_visits\", \"non_google_visits\", \"ratio\"]]\n```\n\nThis is where things get serious. First I take the dataframe and group it by months. Then I do the aggregation, collecting the counts of traffic coming from different search engines based on the referrer of the request.\n\nThe next step is to add a column with the sum of all visits coming from search engines other than Google.\n\nFinally, the metric I chose is the percentage of Google traffic to non-Google traffic.\n\nIt works so that if in a given month I had the same number of visits from Google as from other search engines, the percentage is 100%. If for every 10 visits coming from Google I had four from other places, the result is 40%. Not sure if this is the correct way, probably not? I am just a software developer, I don't have a theoretical background in maths or statistics. If you know the industry standard for this, let me know! Nonetheless, this metric gave me the answer to my question, so I guess it did ok?\n\nAnother cool thing about Marimo is that it has built-in tools for creating graphs from dataframes, and this is what I used to create the visualisations below.\n\nAnd?\n\n## Is Google Search a declining source of traffic for my blog?\n\nThe answer is: I would say yes? The graph speaks for itself. In 2024, non-Google\nsearch engine traffic was around 10-15% of the number of visits from Google, and\nin the last months it has been around 35%. That downward spike in October of\n2025 is an outlier, that month my [blog post about the Orange Pi Zero\n3](https://stfn.pl/blog/85-orange-pi-zero-3-first-impressions/) was promoted on\nthe Google discover page and for two days I was getting a lot of visits from\nthere.\n\nThe second graph is the monthly number of visits from Google, showing a downward trend, again with that single outlier month.\n\nThe third graph show the number of visits coming from search engines other than Google. the number of visits had been rising upto August of 2025, after that there is a slow fall, but it is still less than the fall of Google-originating visits.\n\n## The bottom line\n\nI hope that this is good news. The biggest strengths of the Internet are its decentralisation and egalitarianism, and the monopoly of Google search has been the total opposite of those. I am happy to see that other search engines are growing in popularity and I hope this trend will continue. Web search should be as it says on the tin, search providing links to websites, and replacing links with an AI generated summary with a high chance of malforming their content is just not the right way, dangerous for the openness and freedom of the web.\n\nP.S. Personally I use [Startpage](https://www.startpage.com/) as my default\nsearch engine.\n\nThanks for reading!\n\n**Previous**:\n[This is the 100th post of this blog](/blog/100-post-100/)", "url": "https://wpnews.pro/news/the-decline-of-google-and-rise-of-alternative-searches-as-the-source-of-traffic", "canonical_source": "https://stfn.pl/blog/101-decline-of-google/", "published_at": "2026-06-12 19:36:18+00:00", "updated_at": "2026-06-12 19:50:56.180377+00:00", "lang": "en", "topics": ["machine-learning", "artificial-intelligence", "ai-products", "ai-tools"], "entities": ["Google", "Umami", "Datacamp", "Kaggle", "Pandas"], "alternates": {"html": "https://wpnews.pro/news/the-decline-of-google-and-rise-of-alternative-searches-as-the-source-of-traffic", "markdown": "https://wpnews.pro/news/the-decline-of-google-and-rise-of-alternative-searches-as-the-source-of-traffic.md", "text": "https://wpnews.pro/news/the-decline-of-google-and-rise-of-alternative-searches-as-the-source-of-traffic.txt", "jsonld": "https://wpnews.pro/news/the-decline-of-google-and-rise-of-alternative-searches-as-the-source-of-traffic.jsonld"}}