1
4 Comments

Traffic from ChatGPT now brings a quarter of our sign-ups. How we track it, and what we changed

My Website is a freelance marketplace in Japan that I've run since 2004.

Over the last few weeks, more and more of the people signing up have been arriving from ChatGPT.
This is the share, week by week, and the list of what we changed on the site, with dates.

Share of sign-ups on My Website that came from ChatGPT, by week

Share of all sign-ups that came from ChatGPT, by month

・April: 3.7%
・May: 10.6%
・June: 14.5%
・July: 15.3%
・August: 13.3%
・September (1st to 26th): 24.5%

In the week of September 21 (six days so far), it was 33%. One in three.

Perplexity, Gemini, Copilot and Claude together were 1.4% of sign-ups over the whole period, against 14.6% for ChatGPT. Almost all of it is ChatGPT.

First, we couldn't see it

The counting turned out to be the hard part.

Since April 4, the site has recorded where each member first arrived from. On the first visit it stores the referrer and the landing URL in a cookie, keeps them for 30 days, and writes them to the member's record when they sign up.

Two things went wrong with that.

1. ChatGPT was being counted as X.
The code decided the source by checking whether the referrer contained a known domain. chatgpt.com contains the string t.co, which is X's link shortener. So ChatGPT visits were labeled as coming from X. I fixed that on April 18.

2. Most ChatGPT visits have no referrer at all.
Of the sign-ups from ChatGPT since April, two thirds arrived with no referrer. What almost all of them did have (98%) was ?utm_source=chatgpt.com on the landing URL, which ChatGPT adds to the links it shows. Our admin screen was deciding the source from the referrer only, so those sign-ups all showed up as "unknown". On August 24 I changed it to check the landing URL's utm_source first.

The landing URL itself had been saved all along, so every number in this post is recounted from the raw records, not from what the admin screen used to show.

If you're checking your own site, look at the landing URL, not only the referrer.

What we changed, in order

March 16 to 28

・Added a sitemap and robots.txt
・Added structured data to every page type: articles, breadcrumbs, FAQs, and job postings
・Added a "key points" summary box at the top of every blog article, with author and FAQ data in JSON-LD
・Connected Bing Webmaster Tools and started sending new URLs through IndexNow
・Opened a FAQ page
・On March 28, allowed AI crawlers by name in robots.txt

The robots.txt section now looks like this:

User-Agent: GPTBot
User-Agent: ChatGPT-User
User-Agent: OAI-SearchBot
User-Agent: ClaudeBot
User-Agent: Claude-SearchBot
User-Agent: Claude-User
User-Agent: PerplexityBot
User-Agent: Google-Extended
Allow: /
Disallow: /_admin/
Disallow: /api/

ChatGPT-User is the one that fetches a page when someone asks ChatGPT a question and it goes to read your site. OAI-SearchBot builds the index for ChatGPT search. GPTBot collects training data. They are three different bots, and blocking one does not block the others.

April 4

Started recording where each member first arrived from (described above).

July 9

・Added a block under every article showing who reviewed it, when it was published and last updated, and a link to the editorial policy
・Published an editorial policy page and a company information page
・Fixed dateModified in the structured data, which had been stuck at the publish date

July 21

Added CollectionPage and ItemList structured data to the directory pages.

September 20

・Put an llms.txt at the root: a short map of the site in plain text, with what each section is for
・For job listings that are no longer open, added only a publish date for machines. Open listings keep the full JobPosting data

Everything in this list is ordinary. None of it is a trick.

Where ChatGPT sends people

This is the part I didn't expect.

In April and May, most of the people ChatGPT sent to us landed on blog articles.
From June, they started landing on individual job listings.

・April: blog article 80%, job listing 0%, elsewhere 20%
・May: blog article 53%, job listing 13%, elsewhere 33%
・June: blog article 12%, job listing 73%, elsewhere 15%
・July: blog article 33%, job listing 57%, elsewhere 10%
・August: blog article 16%, job listing 61%, elsewhere 23%
・September: blog article 10%, job listing 71%, elsewhere 19%

(Share of sign-ups from ChatGPT in each month, by the page they first landed on.)

People are asking ChatGPT for work, and ChatGPT is pointing them at a specific listing.
That's closer to a job board's search box than to a search engine sending traffic to an article.

JSON-LD on every page

Every page type on the site carries JSON-LD, and we keep it accurate.
Job listings use JobPosting while they are open, with the application deadline and the fact that the work is remote. Once a listing closes, it no longer claims to be an open job.
Blog articles carry Article with correct publish and update dates, and FAQPage where the article has questions and answers.

What I can't tell you

I can't tell you which change did it.

Look at the weekly chart. There's no step up the week after any one of these changes. The share rises slowly with a lot of noise, and the last two weeks are the highest so far.

What I can say is that the site was readable for these bots from late March, and that when sign-ups from ChatGPT started, we had already been recording where people came from, so we could go back and count them properly.

on September 26, 2026
  1. 1

    The t.co substring collision is the kind of attribution bug that probably affects more sites than realize it — any domain containing t.co gets silently bucketed under X. Worth checking for anyone with ifttt.com, scout.co, or ct.co in their analytics.

    The shift from blog articles to job listings is the bigger finding. ChatGPT went from sending people to your content to sending them to your product pages. That's the difference between traffic and demand. We built our free AEO scan around exactly this — checking whether AI crawlers can reach your transactional pages, whether your structured data describes what you sell, not just what you write about. Most sites optimize their blog for AI visibility and leave their money pages invisible. Your JSON-LD discipline, especially retiring JobPosting when listings close, is the detail most people skip.

  2. 1

    The t.co-inside-chatgpt.com bug is going to save a lot of people from miscounting, and thanks for publishing the raw numbers with dates.

    Two ideas for the "I can't tell you which change did it" part:

    Log ChatGPT-User fetches by URL and time. That bot fetches a page while someone is asking a question, so a listing fetched a few minutes before a sign-up that lands on it is a decent hint at what people were asking, without ever seeing the prompt. Counting those fetches per week next to the sign-up share would also tell you whether the rise is more questions or better conversion from the same questions.

    Treat the closed-listing page as a landing page. With 71% now arriving on individual listings, and ChatGPT's index lagging your site by some days, part of that traffic lands on jobs that just closed. Showing three similar open listings there (same skill, remote) turns a dead end into a second chance.

    Have you seen any difference in what ChatGPT-arriving members do afterwards, for example apply rate compared with members from Google?

  3. 1

    The distinction between referrer and landing URL is a great practical lesson—especially with AI traffic often having no referrer. Keeping the raw first-touch data also makes the later backfill possible; segmenting conversion quality by landing page should reveal even more than sign-up volume.

  4. 1

    The t.co substring bug is such a good catch. Anyone doing naive referrer matching probably has the same problem and doesn't know it. The shift from blog articles to individual job listings is the most interesting part for me: it suggests ChatGPT treats well-structured JobPosting pages as answers, not just sources. Have you compared how ChatGPT sign-ups behave after signing up (activation, first job applied) versus Google? I'd be curious whether they arrive with more intent because the model already did the matching.