Inspiration
A salesperson walking into a meeting adapts to whoever is in the room. A website cannot. It shows the same headline to a factory owner, a logistics manager and a lawyer, written for none of them.
Personalisation software exists, but it does something else. It either reacts to behaviour, so a visitor who looked at the pricing page gets shown the demo prompt, or it assembles: a marketer writes headline variants for a list of segments in advance and the system picks the closest one. The category's own literature describes the state of the art as software that "selects and arranges pre-built content components." A person still writes the components, and that person is why these tools carry five-figure annual licences and need a team to run them.
Nothing we could find writes the sentence itself, for the specific company standing at the door, at the moment it arrives. That is what we wanted.
We already had the part that makes it possible. Our company sells one thing: working out which business is visiting a website, from the visitor's IP address. In August 2025 a customer asked us to use that signal to change what their site shows. We built it for them by hand. It worked, and it has since served 726,420 personalised responses.
It also took a month of custom engineering for one customer. We were not going to do that again, so we built the version that needs no engineering at all.
What it does
You put one line of script on your website. In our dashboard your page appears as a copy you can click on. You click a headline. That is the setup.
After that, when a business visits your site, we identify which company it is and Gemini writes that headline for them while the page is loading. A visitor from a construction firm and a visitor from a hospital read different sentences on the same page.
The first visitor from a given company waits under a second while the model writes. Everyone after that is served from cache in about 200 milliseconds, because the text is written once per company and then reused. On our older system 94.1% of all requests are cache hits.
Nobody approves the text. There is no review queue and no library of pre-written variants. The model writes it and the visitor reads it.
Two things separate this from a demo.
The first is that what the page sells never changes. Ask a language model to personalise a headline for a cleaning-equipment manufacturer and it will happily turn "Websites and online shops" into "Digital cleaning solutions". Now the page advertises something the business does not do. Most of our work went into preventing exactly that.
The second is that nothing breaks. If the model is slow, unreachable, or writes something too long for the layout, the original text stays. There is no failure mode where a customer's website looks wrong.
How we built it
The product runs on Gemini 3.5 Flash Lite on Vertex AI, in the EU multi-region.
We picked that configuration by measuring, not by preference. We benchmarked 120 combinations of model and region from our production servers. Two findings shaped the product. Turning off the model's internal reasoning step made it 21 times faster, because it had been spending 1,570 reasoning tokens on an eight-word headline. And the EU multi-region endpoint keeps processing inside European jurisdiction, which our German customers care about.
The instruction we give the model was chosen the same way. We ran 20 companies through several page elements with different versions of the instruction and had every output graded blind by 20 independent AI raters against a fixed error taxonomy. The variant names were hidden, so the production version could not win by being recognised, and the scores were counted in code rather than summarised by a model. Our first version scored 3.20 out of 5 and produced 25 flagged errors. The version in production scores 4.15 with 3. It works by making the model name what the business sells before it writes anything, and by ranking the rules: if the text runs too long, drop the reference to the visitor, never the description of the product.
Hard limits sit around the model. Replacement text can never be longer than the original, so the layout cannot move. Text under 45 characters is left alone, because a four-word headline has no spare word to trade for an industry reference. Buttons are excluded completely.
What the AI does, and what I do. I am one person. The AI writes the code, and it also runs the product: it decides, per visitor and without me, what sentence a company reads. I decide what it must never do. That division is the whole job now. I spent more time building the evaluation that tells me whether a prompt got better than I spent on the feature, because with nobody reviewing the output, the measurement is the only safety net there is. Day to day this means I write specifications and acceptance criteria, the model writes the implementation, and I check the result against numbers rather than against my taste. Eleven working days produced 14,268 lines of production code this way.
What this creates for people who are not me. The predecessor of this product took a month of custom engineering for a single customer, which is why only one company could ever afford it. Smart Pages needs no engineering at all, and that moves the work to people who were previously locked out of it. Our second customer is a digital agency, now deploying personalisation across three of their own clients. They sell a service they could not have offered a month ago, without hiring a developer to do it. Every agency, freelance marketer and in-house team on the German mid-market has the same opening. That is where the jobs are: not on my payroll, but in the work this makes sellable by people who write copy rather than code.
Challenges we ran into
Speed was the first problem. The text has to be there before the visitor reads the page, and our first version took 1.7 to 2.5 seconds. Far too slow. We rebuilt it to generate all the texts in parallel and put them in the first response instead of fetching them afterwards. It now lands under a second, and repeat visits come from cache in around 200 milliseconds.
The second problem was the model quietly changing what the business sells. This was not an occasional glitch. It happened in 15 of our early test cases. What fixed it was a better instruction, not a better model, and the only reason we know it was better is that we measured it.
The third one surprised us. We first capped replacement text by word count. In German, compound nouns make word count almost meaningless for line width, and the model would sacrifice the product description to fit the count. Switching to a character cap cut that error from 15 cases to 9 and raised the quality score on our test page from 2.65 to 3.75.
Accomplishments we're proud of
Independent revenue three weeks after the first commit: a two-year licence worth €14,728.80 net, paid on 17 August, and a digital agency deploying it across three of their own clients on a recurring six-month contract. Neither had bought from us before.
An AI that writes customer-facing copy unsupervised in production, and a second AI that grades it blind against a fixed error taxonomy.
And the cost structure. Each text is generated once per company and reused after that. Our older system runs at a 94.1% cache hit rate. Total model spend for the new product across its entire life so far is €0.12.
What we learned
The hard part of shipping an unsupervised AI is not the model. It is working out what it must never do, writing that down precisely enough that a model can follow it, and having some way to tell whether a change made things better. We spent more time on the evaluation than on the feature itself.
Both of our biggest wins came from measurements we would not have guessed. The 21x speed gain and the largest quality gain were both counterintuitive before we ran the numbers.
What's next
A proper holdback group, so we can show the effect on conversion instead of comparing two groups that were never randomly assigned. More element types than text. And the channel our second customer showed us: agencies, who can now offer personalisation to their clients without an engineering project behind it. We will also be showing it at DMEXCO in Cologne, Europe's leading digital marketing event.
Built With
- fastapi
- google-cloud
- google-gemini
- javascript
- mongodb
- python
- react
- redis
- tailwindcss
- typescript
- vertex-ai
Log in or sign up for Devpost to join the conversation.