Skip to content

Placeholder Text is a Violated Contract

Adityo Guni Waluyo

Replacing [PLACEHOLDER] with verifiable facts, and why generic filler sits close to Google's scaled content spam signal.

TL;DR

Generic filler text on placeholder company cards isn't a fix; Google flags scaled content abuse, and hollow copy signals spam. Real research produced verifiable facts like sectors, cities, and founding years, applied consistently across both locale files. Type validation only checks strings, not quality, so content deserves first-class treatment.

I opened the homepage of the site I just deployed, and on the six company profile cards, all I saw was this: [PLACEHOLDER] ... pending manual research & verification. That text was visible to every single visitor. My first reaction was a brief panic, followed immediately by a quick-fix instinct: just generate some generic marketing copy for each card. Any text has to be better than an unfinished placeholder marker, right? At least the layout would look clean and free of empty holes.

Turns out, that instinct was dead wrong. I had recently skimmed through Google's spam policies, and the assumption that "any text is better than empty" is actually dangerous. Google explicitly calls out scaled content abuse as the practice of creating pages at scale just to manipulate search rankings, rather than to help users [8]. Content created solely to attract search engine crawlers will not be rewarded by their ranking systems. Their self-assessment questions even explicitly ask whether the content provides original information or research beyond what is already obvious [5].

The Generic Text Trap

Filling those profile cards with hollow sentences like "we are a leading company providing innovative solutions" is not a fix. It is practically a spam signal. Pattern-matching algorithms easily recognize this lack of substance, and more importantly, it gives zero value to the reader. If we flood the site with text like that, we are not fixing a problem. We are just adding technical debt in the form of worthless content.

I decided to step back and do the actual brief research. Instead of guessing or relying on generic text generators, I hunted for verifiable public data for each entity in this corporate group. The result was a paired update to frontend/src/content/id/home.ts and frontend/src/content/en/home.ts.

The facts I inserted were highly specific and directly verifiable:

* A holding company acting in a commissioner role.

* A property company managing a clearly defined headquarters address.

* An IT technology company developing attendance systems, based in Bandung.

* A firm focused entirely on business consulting services.

* A building design and construction company established in 2004 in Bandung.

Every single description now has a real sector, role, city, or founding year. This is exactly why descriptions from research will always beat any placeholder. The text might be shorter, but every word has a traceable origin.

The Actual Data Contract

There is a sharp lesson here about frontend development. Imagine the TypeScript interface defining the structure of these company cards. It probably looks like an object with sector, description, founded, and location as string fields. The compiler only checks if the description property is a string — it does not care if that string is [PLACEHOLDER] or a paragraph of AI-generated marketing fluff. As long as the type matches, the compiler gives a green light and the build passes. This is a classic frontend trap: type validation is absolutely not the same as content quality validation.

A content module that still carries a placeholder marker is a violated technical contract. The type system might compile without errors, and the page might render smoothly in the browser. But practically, garbage is silently slipping into production.

Replacing that text was not just a typing exercise to meet a word quota and make the page look full. It was the moment the page finally earned the right to be indexed properly. I made sure this change was done in pairs for every locale. The same facts were delivered with different phrasing between the Indonesian and English versions, keeping consistency without sounding like a rigid machine translation. Fields like sector, description, founded, and location were locked together with mutually supporting data. While handling this tmp en retry deskripsi task, I realized that treating content as a first-class citizen in the codebase prevents these silent failures.

People often mistake content filling for a game of quantity. But empty but real is far better than filled but fake. When I checked the browser output again, those six cards finally had clear identities. No more hanging text waiting for a manual verification that might never happen.

I am much more careful now. Every time I see a placeholder marker in the code, I no longer rush to patch it with meaningless sweet talk. I would rather spend fifteen minutes finding one concrete fact about the entity I am representing in the code. Because ultimately, the data integrity of our site is the direct responsibility of what we type into those content configuration files.

Sources

Related articles