How our marketing system works, from research to publish

Louie Valkhof12 min read

Why I am putting this on the table

People ask me fairly often how we produce content at Oase Creative. Most of them expect an answer about tools. Which AI model, which planner, which SEO suite.

The answer is not a tool. It is a production line with gates in it, and it runs every day whether or not I feel like it. This article is that line, front to back, including the places where it has jammed.

I am opening it up because a system is not a secret. You can read this in twenty minutes and still have nothing tomorrow, because it only works when it runs daily and when hundreds of small judgements have been written into it. What you can take are the mistakes. They cost us months. They will cost you an afternoon.

For scale: at the time of writing there are 72 articles in our knowledge base, each one in Dutch and in English, and 159 daily research reports behind them. Everything under that is machinery.

It starts at quarter past six in the morning

Before anything gets written, something gets researched. Every morning at 06:15 a research run starts that does not do one thing but three or four at once: that many agents come at the same subject from different angles, and only afterwards does anything get merged.

That sounds like overkill until you see what it catches. One agent that finds a number finds a number. Four agents coming at the same subject from four sides also find the places where the number does not hold.

The rule the whole thing rests on: every finding has to be verified three times before it makes the report. Not the same source three times, but three independent confirmations. What fails that does not quietly disappear. It lands in the report as a source failure.

That section is the most valuable part of the entire research pass. A sample from this morning's report, on brand positioning: a widely cited 2026 industry survey turned out not to demonstrably exist. A frequently quoted ratio from a large SEO platform turned out to name no sample size anywhere. And the same percentage appeared on two official channels of the same organisation as 95 and as 96.

Those are exactly the numbers that otherwise slide into your article, sit there for years, and then get picked up by somebody else.

An article is a pair, not a file

Writing does not start with an empty document. It starts with three checks. Is this subject already in the backlog? Is it already in the calendar? And have the voice files been read: the style guide, the positioning document, the product truth.

That last check exists because things can go wrong without anyone noticing. An article that is factually correct but phrases the positioning slightly differently from the rest of the site weakens the brand without containing a single identifiable error.

Every article comes with imagery, and that is not an afterthought: the cover is generated in the fixed brand style and the share image is built separately, so a link on LinkedIn or in an email does not land as a bare URL. That happens inside the same job, not after it.

After that it gets written in two languages at once. Not Dutch with a translation bolted on afterwards, but a Dutch and an English article as one job, which is not finished until both exist.

That is a correction we made to ourselves. Back when the English version came "after", it regularly did not come at all. The backlog grew, the English knowledge base became half a knowledge base, and then you are choosing between weeks of catching up or accepting that half of it is missing. Now the publishing gate refuses an article whose counterpart does not exist, and since September that refusal cannot be overridden.

Six gates before anything goes live

This is the biggest difference from how I did it five years ago. Back then publishing meant: file finished, press button. Now publishing is one command that walks a series of checks and stops at the first failure.

What gets checked, in order:

Approval. Is this article marked approved in the content schedule? If not, nothing happens. That sounds bureaucratic until the day you publish something that was not finished.

Language and style. Spacing around amounts, compounds written as one word, sentence variation, readability, opening patterns, and a list of words that make a text read as machine-made on sight.

The fact check against sources. Every figure with a citation is held against that citation. Not whether the source exists, but whether it says what we say it says.

Parity. Is there an English counterpart, is it marked published, and does it cover the same ground?

Internal links. Do they point at pages that exist, in both languages.

And the audit rule: before anything goes out, a file is written describing what is about to happen. Not after. Before. No audit file means the task aborts. There are 1,277 of them now.

Since August there is also a dry run at nine in the evening that tests every one of those gates against whatever is scheduled for the next morning. It publishes nothing. It only raises a flag when something is broken.

That dry run exists for a painful reason. Three blogs in a row failed the language check at a quarter to nine in the morning: a currency symbol without a space, a compound with a space in it, a technical term that was not in the dictionary. Each time nothing went live that day, and each time it was a two-minute fix that somebody could have made the evening before if they had known.

Where it goes, and why there

Once an article is live, the second half begins. Every channel has a different job, and that is deliberate:

The knowledge base on oasecreative.nl is the ground. The original lives there, in both languages, with its own slugs. Everything downstream points back to it.

louievalkhof.com, this site, is the person. What I write here does not belong on an agency site: too personal, too specific, too much "I". This article is an example of that itself.

Medium is the second leg for personal articles, always with a canonical link back to the original here. That link is the entire point: search engines keep louievalkhof.com as the source, and Medium brings the readers who are already there.

Reddit is not a distribution channel, it is a conversation. There is a hard rule on it: reply to what is there, do not post what we want to say. The moment it reads as promotion it is worthless to everybody.

LinkedIn and X do not get the article. They get the idea inside it, rewritten for that room. Pasting an article and putting a link under it works on neither.

Email is the channel that draws the least attention and does the most. A fixed morning send goes out, campaigns run through our own system rather than a separate newsletter tool, and there is a weekly round-up. An article that only sits on the site waits for someone to come past; an article in an email reaches people who already said yes.

The podcast takes some of the articles into audio, with the transcript as an expandable block under the matching knowledge-base article. Not every blog becomes an episode. That was an early assumption that turned out to be wrong, because a good article is not automatically a good episode.

What gets measured afterwards

A system that publishes and then looks away is not a system, it is a conveyor belt. So a measuring pass runs weekly and pulls four sources: visitor numbers from Analytics, search results from Search Console with clicks, impressions, click-through rate and position, the figures from the email campaigns, and index coverage. Separately, we measure whether our articles turn up in the answers AI search engines give, because that is a different channel now from the blue links.

What comes out of that is not always pleasant, and that is exactly why it exists.

In early September we went through ninety days of search results on oasecreative.nl with one question: where do we rank high without anybody clicking. It returned sixteen queries sitting at an average position of ten or better, together good for 5,643 impressions and zero clicks. Not few clicks. Zero. On a normal distribution that should be around 250 visitors.

Two examples: "e-commerce fotografie" sits at position 4.4 with 564 impressions and no clicks, and an English query about optimising bol listings sits at position 7.0 with 2,385 impressions and no clicks.

The easy conclusion is that this is a titles problem. That was my first instinct too. But at zero clicks on five thousand impressions there is no title that changes anything: either the answer is already given above our link, or the searcher wanted something other than what we offer. That is a different problem with a different fix, and we would never have seen it if we had only looked at visitor numbers instead of at the ratio between position and click.

How people find us

Everything above is about content. Content is not how clients arrive, so for completeness, that part too, even though it is a different system held to a different bar.

The brand audit is the main one. Somebody scans their brand on our site and gets their score straight away. Behind that sits a chain that builds the full audit as a document and delivers it, followed by an email sequence that branches on behaviour: whoever opens the first email gets a different second message from whoever does not, and whoever clicks skips the middle and gets the invitation to a conversation immediately. Not one linear sequence that sends everybody the same thing.

The inbox is worked through every half hour. Anything that looks like a lead, a contact form or a brand audit, always goes to Louie and is never cleared automatically. The rest is archived rather than deleted, because a wrongly classified email has to be recoverable.

Reddit is not a distribution channel, it is a conversation, and there is a hard limit on it: at most two replies a day, and only to what is actually there. A check afterwards demands the address of the posted comment as proof, or an explicit note that nothing was posted on purpose.

And then the honesty that belongs with this: not all of it is running. The scan of freelance job boards has been switched off since the end of August because that is not a direction we want right now, and the read statistics from X have been down since May on an expired key. Both are written down with a reason and a date, because a paused component nobody remembers is the same thing as a broken one.

What went wrong

This is the part that is actually useful to you.

The date that came from the draft. An article that had sat in the backlog for weeks went live carrying the date it was written. That looked harmless until I worked out that one field is three things at once: the sort key of the index, the publication date in the structured data, and the last-modified date in the sitemap. So a brand new article appeared at the bottom of the index and told Google it was months old. Since early September the publishing gate stamps the date on the day it goes live, and the version history decides whether it is a first publish or a republish, not a manual flag.

The gate that asked the wrong question. Our Reddit pipeline sat still for two days without producing a single error. Two causes. The running scheduler still had old code in memory and was working from an instruction that had already been replaced. And the check that was supposed to establish whether a task had succeeded looked at whether a draft file existed. It did. Nothing had been done with it.

That is the mistake I have learned the most from: a check that looks at evidence of the action instead of the action. That same check now demands a real permalink to the posted comment, or an explicit marker that nothing was posted on purpose.

The override that became a habit. The parity check between Dutch and English had an escape hatch. Meant for exceptions. You can guess the rest. It came out in September, and it should have come out two months earlier.

What you can take from this

Not the setup. That one is ours, it fits our work and the fact that I have a system running on a machine next to me around the clock. Do not rebuild it.

These three, though:

Leave your checks fail-closed. Every escape hatch you build for "the exception" becomes the main road on a busy day. If a check matters enough to exist, it matters enough to stop you.

Make your research write down what it could not find. The source-failure section in our daily reports is more useful than the findings themselves. A number you leave out because you could not find the sample size is an article that still holds up in two years.

Check the thing, not evidence of the thing. Does the file exist is not the same question as did it work. Those two look identical until the day they diverge, and by then it has been quiet for two days.

And measure the ratio, not the number. Visitor counts tell you whether things are going well or badly. The ratio between position and click tells you where it goes wrong. Without that second measurement we would have had sixteen queries that looked perfectly healthy on paper and did nothing in practice.

Everything above is fixed in a single architecture document with 144 rules in it, read first thing in every session. Not because I like documentation, but because a system that is not written down does something slightly different every week.

Wondering how this would work for you? Email me or have a look at oasecreative.nl.

Louie Valkhof
Louie ValkhofFounder Oase Creative & Oase

Frequently asked questions

How does the content system at Oase Creative work?

Every morning at quarter past six a research run starts that sends several agents at the same subject from different angles and has every finding verified three times over. What survives goes into a writing pass that produces a Dutch and an English article as one job. After that it passes a series of gates: language and style checks, a fact check against the sources it cites, a parity check between the two languages, and a dry run at nine in the evening. Only then can anything go live.

Why does every article publish in two languages at once?

Because half a pair breaks faster than you think. When the English version comes later, it often does not come at all. The publishing gate now refuses an article whose counterpart is missing, and since September 2026 that refusal can no longer be overridden. An article here is a pair, not a file.

Why is Louie Valkhof publishing this system openly?

Because the system is not a secret, it is a habit. You can read the whole setup in twenty minutes and still get nothing out of it, because the value sits in running it daily and in the hundreds of small judgements written into it. What does transfer are the mistakes we made along the way, so you do not have to make them yourself.

What happens when an article fails a check?

It does not go live. The gates are fail-closed: no approval in the schedule means no publish, a missing English counterpart means no publish, and a source that does not say what we claim means no publish. There is no manual route around them. That is deliberate, because any route around a gate becomes the default route on a busy day.

How does Oase Creative measure whether published content works?

Four sources are pulled weekly: visitor numbers from Analytics, search results from Search Console with clicks, impressions, click-through rate and position, the figures from the email campaigns, and index coverage. Separately, we measure whether articles appear in the answers AI search engines give. The most useful measurement is not the visitor count but the ratio between position and click: that is what surfaced sixteen queries ranking high and returning zero clicks.