Skip to content
megapromotingLet's talk

Expertise · AEO

We translate the page into data that a machine reads without guessing, and we check the result with the engine’s tool.

Structured data, questions and answers in readable form, breadcrumb trail, organisation node. Of the three subjects, this is the one where the result can be tested, not just assumed.

Already builtThree in-house implementations, all open on disk and verifiable externally today. First: the product pages of this site serve a 1,479-byte graph with `WebPage`, `SoftwareApplication` and `BreadcrumbList` linked together, generated from the same data as the visible text — 23 pages. Second: a proprietary analysis module for direct answers, 51 lines, eight checks with points explicitly written in code, weighted 0.10 in the analyser's overall score. Third: a public structured data generator on our site, five types, which returns 200. The reserve we state in the same sentence: the same analysis module gives our own product page 30 out of 100 because it does not know how to read a graph — the limitation is in the tool, it is written below, and it is fixable.

An engine that shows a direct answer does not compose text: it extracts a piece from a page and places it under the question. To extract without guessing, it needs an unambiguous correspondence between question and answer, between product and its status, between page and the organisation that publishes it. Structured data is exactly that — not an SEO decoration, but the page written a second time, for a reader that does not understand appearance, only structure.

The difference from the other two topics is that here the result is tested. It is not assumed and not hoped for: you take the address, give it to the engine’s validation tool and see whether the block is read, which types it recognises and which fields it lacks. That is why this page can cite more than the one about generated answers — and why it is written as completed work, not as an offer.

This is what the situation looks like on this site, counted today, not estimated: 147 addresses in the sitemap. Twenty-three product pages carry a correct 1,479-byte graph. All the others carry exactly one block, of 265 bytes, with six fields: context, type, identifier, name, address, description. No logo, no postal address, no point of contact and no links to public profiles — although six are written in the site configuration. The FAQ page has ten questions in HTML, no machine-readable question block, and it is not in the sitemap.

The part that changes the discussion is the inventory of text already written. In the content sources of this site there are 233 question-and-answer pairs on the service pages, 175 on the product pages and ten on the FAQ page — 418 in total, written, reviewed, with real answers. Zero are today in a form a machine reads. That is usually the work: not producing new content, but translating the existing one. A site that does not have the questions written has another problem, a bigger one, and we say it first.

What it covers

The work, by component

We inventory what a machine reads today from each address

We request each address, extract each block of structured data, parse it and write the types and size. The result is a table, not an impression. On this site: a product page returns two blocks, of 265 and 1,479 bytes, with four types between them; the homepage, catalogue, blog, contact, FAQ and service pages return just one, of 265 bytes, with one type. Here you can also see what is silently broken: a block that does not parse gives no visible error, it simply does not exist for the engine.

We translate the questions already written, we do not invent others

418 question-and-answer pairs already exist in the content sources of this site and none is in a machine-readable form. The question block is generated from exactly the same source as the visible text, not written a second time by hand. The rule is strict and it is the reason: if questions or answers appear in the data that are not on the page, the engine treats that as a mismatch, and the result is losing the special display, not a bonus.

A single graph per page, with nodes that know each other

Instead of separate blocks that repeat the same data, a graph in which the page, the main entity and the navigation trail refer to each other by identifier, and the organisation is a single node for the entire site. This is what our product pages look like: the page points to the organisation as publisher, the main entity points to the same organisation as author, the navigation trail has three real steps. The detail you do not see: when writing, the `<` sign is replaced with its escape sequence, so that text from the data cannot close the block and become code on the page. It is one line, it is in the file.

We verify with the engine’s tool, not with our own opinion

Every page type goes through the engine validation tool, which says what it read and which field is missing. It is the only place in the three topics where there is an external, immediate and reproducible verdict. What we deliver is the capture of the verdict for each page type, not a statement that “we implemented schema.”

An in-house analysis module, with the points written in code

Our direct answers module runs eight checks with explicit scoring: any readable block exists 20 points, frequently asked questions 20, step-by-step instructions 10, sections marked for voice reading 10, breadcrumb 10, reviews 10, organisation 10, article or product 10, capped at 100. It has a weight of 0,10 in the analyser’s overall score. The points are not hidden in an algorithm; they are eight lines you can read.

The limit of our own tool, stated before you find it yourself

The same module reads the type only at the top level of the block or inside an array. A graph has no top-level type, so the types inside it are not seen. The consequence, measured on our own site: the product page gets 30 out of 100 from our analyser, although it carries three correct types, two of which are scored by the module. The figure is wrong, the page is not. We wrote this here because a tool whose defect you learn from the supplier is more useful than one about which you find out yourself, on the second run.

The organisation node, once for the whole site

The legal name, address, contact point, logo and links to public profiles, in a single node to which all pages point. It is the thing that ties the site to the rest of your public traces. On this site the node has six fields and none of these links, although six profiles are written in the configuration. It is a missing item, it is counted, and it is first on the repair list because it is fixed in one place.

The sharing card, generated from the page title

The image that appears when someone shares the address is generated from the page title and description, in the site colours, so the preview shows the page it links to. Our product pages have their route and return a real image. The lack, stated as a lack: service pages declare in metadata an image address for which no route exists in code — requested directly, it returns 404. Production currently serves the general image, so the defect appears only after publication, on 25 pages. It is signposted, not hidden.

What we never put in structured data

Notes and reviews that cannot be proved with a public source. Prices that are not written on the page. Delivery times as a guarantee. The reason is not caution: an assessment declared in data without a public source is exactly what a manual penalty targets, and a false statement in a machine-readable format is a lie made to circulate — it is the one that gets quoted. We found such a thing in our own repository and below we write what it was and what we did.

What it looks like

The path, step by step.

01

Today’s inventory, address by address

The first delivery is the table: every address, every block, recognised types, size in bytes, and blocks that do not parse. From here on, every statement has a line behind it. It is also the moment when blocks left over from an earlier version of the site appear, which contradict today’s page.

02

The organisation node and the breadcrumb

They are done once and applied everywhere: a single organisation node, with identifier, to which all pages point, and a breadcrumb that matches the real address structure. The order is not negotiable — otherwise, you repair a hundred pages for something that is fixed in one file.

03

The existing questions, put into form

The questions block is generated from the same source as the visible list on the page. We also deliver the list of addresses where the questions exist in the text but were not declared — on this site there came out 418 written pairs and none declared.

04

The external validation, for each page type

We go through the engine tool one page of each type and deliver the verdict: which types were read, which fields are missing, which warnings appeared. We do not declare anything finished on the basis that the block “is in the code.”

05

The check that stays after us

A script run after each publication, which fails if a block has stopped parsing, if a type has disappeared from a page template, or if the questions block has separated from the visible text. Without it, the work erodes exactly like any unwritten convention: someone adds a new template and forgets, and nobody notices because nothing looks broken on the screen.

1Inventory2traducere3validarewhat a machine reads today from each address, what we declare from the already existing textscris, ce spune unealta motorului despre rezultat.
The path, in 3 steps

The data

What we touch, where it lives, and how long it stays

The questions anyone with a data protection officer would ask — asked here before they do.

What we read from your site
Only the public HTML and the data blocks that are already there. For inventory we do not need admin access. For validation we do not need anything extra: the engine tool works on the public address.
What we need from you, and cannot invent
The facts in the organisation node: the exact legal name, address, opening hours, contact number and real public profiles. Structured data that contradict reality is worse than its absence — it is a verifiable and wrong statement, published by you, in a format made to be read automatically.
What never goes into the data
Personal data of employees or clients. Evaluations without a public source. Prices that do not appear on the page. Questions and answers that the visitor does not see. Practical rule: if a person opening the page cannot find the information there, it has no place in the block.
Where the blocks are generated from
From the same data source as the visible text, not from a parallel file. It is the only way in which the two do not separate: someone changes an answer on the page, the block changes with it. A hand-written block falls behind in a few months and nobody notices, because it is not visible.
Where the results are kept and how long they remain
The inventory table, the validation tool verdicts and the post-publication check are versioned in the project repository, next to the code. They live as long as the repository lives. They do not contain anything that is not already on the site: an inventory of structured data is a reading of the public pages, not an extraction from your systems.

A case

418 questions written, none in the form a machine reads

The situation

Our own site, 147 addresses in the site map, with the text recently rewritten question by question. All pages responded 200 and looked correct. The starting question was not “what else do we add”, but “from what is on the page, what reaches a machine”.

What we built

We asked for representative pages for each type, extracted and parsed each structured data block, counted the types and bytes. We replicated over the live HTML the logic of our own analysis module, so we could see what score the site gives itself. We read the structured data components from the repository, including those used nowhere. And we counted the existing question-answer pairs in the content sources.

What came out

Twenty-three product pages carry a correct graph of 1,479 bytes, with three linked types. All the others carry a single 265-byte block, with six fields and no identity element — no logo, no address, no contact point, no links to the six profiles written in the configuration. The FAQ page has ten questions in HTML, no declared block, and is missing from the site map. There are 418 written question-answer pairs in the sources: 233 on service, 175 on product, ten on the questions page. Zero declared. Our own module gives the product page 30 out of 100, because it does not read types from a graph. And in the repository we found three unused components that declared an aggregate rating with signed reviews, a price catalogue and a step-by-step guide with deadlines — verified in production that none is served.

What the case does not say

Nothing from the list above was fixed on the day it was written. The inventory and findings are the deliverable of this stage; fixes are the next stage, and they have their own order — first what is resolved in a file, then what requires work on each template. And once again, because it is important: a valid block does not buy a special display. It makes it possible. The engine documentation decides the rest, and it changes.

Questions

What people ask us before they call

Do structured data guarantee me an enriched fragment in results?

No. The special display is granted by the engine, not by the markup. Valid data are the entry condition, not the purchase of the result. This is clear even from the type of markup sold everywhere: Google documentation states that FAQ rich results are shown only for well-known and authoritative government and health websites — a restriction that came into force in September 2023. So a provider who sells you “FAQ-rich fragments” today either has not read the documentation or hopes you have not read it.

Then why declare the questions at all, if they do not appear as a fragment?

Because the special display is only one of the consumers of the format. A correctly declared questions block says unambiguously which text is the question and which is the answer — information used by engines to extract fragments, by assistants that read the page at a user’s request, and by any system that takes the content without seeing the layout. And there is another effect, less discussed: the obligation to declare pairs forces you to have real answers to real questions. Websites that cannot complete the format usually have nothing to declare.

What does this do, compared with SEO and visibility in generated answers?

With form, not with inventory and not with composition. SEO answers the question “can the engine reach each page and does it know which is the official version”. Visibility in generated answers answers “can it be used as a source”, where the result cannot be promised. Here the question is “can a machine take the exact information from the page without guessing”, and it is the only one of the three with an external verdict: you give the validator tool’s address and get the answer immediately.

Can I put questions or information in the data that are not on the page?

No, and it is a mistake we find often. Markup that describes something other than the visible content is treated as a mismatch, and the consequence is loss of display, sometimes a manual penalty. The rule we apply is mechanical, not one of common sense: the block is generated from the same source as the page text, so it cannot contain something that is not visible. When someone asks us to add an answer in the data that they do not want to write on the page, the discussion stops there.

Competitors have stars in results. Why do we not?

Because we cannot prove a rating. An aggregate rating declared in the data must correspond to real reviews, publicly verifiable. Without that, it is a false claim in a machine-readable format. We are categorical here for a concrete reason: in our own repository we found a component that declared a rating of 4.9 from 87 reviews and six reviews signed with people’s names, and a second one that declared a catalogue of four offers with prices. Neither is rendered anywhere — production serves a single block today, verified — but they were one import away. We flagged them in the team’s decision log, not deleted them in silence.

What types do you actually use?

The ones we run: page, main entity of the page, breadcrumb, organisation and questions block. Our public generator covers five types — local business, organisation, article, product, FAQs — and is available on the site. Any other type is discussed on request, after a compatibility check with what the engine actually displays for your domain. What we do not do: we do not add types because they exist in the specification. A block that no engine uses for your site is weight, not an advantage.

How do you check that it works?

In three places, because one alone lies. The engine’s validation tool gives the external verdict. Our analysis module gives a score with eight checks and points written in code, so you can compare between runs. And a script run after each publication fails if a block has stopped parsing or a type has disappeared. We also add our module’s limitation, so you do not discover it yourself: it does not yet read types from a graph, so it gives a lower score than the reality of correctly built pages — including our own.

What breaks over time?

The link between the block and the page. Someone changes an answer in the text, the block stays with the old one, and nothing looks broken on screen — that is why it goes unnoticed for months. The second thing that breaks is the blocks left over from an earlier version of the site, which describe an offer that no longer exists. Both have the same remedy: blocks are generated from the text source, and what is not generated is deleted.

What do you actually deliver?

The inventory table with each address, each block, types and bytes. The implemented blocks, generated from the content source. The validation tool verdict for each page type. The verification script run after publication. And the list of remaining gaps, written as gaps — on this site, for example, the organisation node without links to profiles, the questions page absent from the site map, and a shared image route declared in metadata that does not exist in the code.

What the statements above rest on (13 sources)
  1. Google’s documentation says that the rich result for FAQs is shown only for well-known and authoritative government and health sites, a restriction announced in September 2023https://developers.google.com/search/docs/appearance/structured-data/faqpage · 2026-09-06
  2. The site map has 147 addresseshttps://www.megapromoting.com/sitemap.xml · 2026-09-06

11 of them are code and files from our repositories. We don't publish their name or line: together, on a single page, they would describe too precisely how systems that aren't only ours are built. We go through them with you, in the repository, on request — verification stays possible, it just happens in a conversation.

What would you want to work better?

Tell us about your process. Together we decide what is worth building, what we can connect, and how we check the result.

Let's talk