Skip to content

Storefront · product page

Questions your product page can actually answer.

The second of Refik’s five storefront blocks. It sits inside the product page and offers a short row of questions — but only questions it has the data to answer for that product. Pick one and the answer opens in the same panel.

Placement

A section block you place, on the product template.

It is one block of Refik’s theme app extension, placed inside the page by you, and where it sits on that page is your decision.

Placement

Product template only

You add it yourself: Section → Add block → Apps. The block’s own schema restricts it to the product template, so the theme editor offers it on the one template where a product is there to read.

Your switch

You turn it on, and off

A search of this codebase for the calls an app would need to reach a theme file comes back empty. The block belongs to the extension, so removing the app removes the block and leaves your theme byte for byte as it was.

Plan

Growth and above

On the entry plan only the chat bubble runs. This block is held back by its plan flag, and the part of it that costs money — the automatic summary — is refused by the server as well, so the server has the final word on a paid surface, whatever a theme flag says.

The free-text box at the bottom of the panel sends the same request to the same endpoint as the chat bubble, along that one server path. It is deliberately not a form. A product page already has one — the cart form — and a form nested inside another is invalid markup that makes the Enter key add to cart in some themes.

Questions

Every question shown is one it can answer.

A suggested question is worth printing where the answer is already in your data, so each one is gated on a field that has to exist for that product. The check runs in Liquid, on your own product data, which is why the row of questions costs what the page costs.

Usage instructions

“How do I use this?”

Shown when the product carries usage instructions, or the longer A+ description some catalogues keep beside it. One of those two fields is where the answer is read from.

A colour option

“Which shade suits me?”

Shown when one of the product’s own option names reads as colour or shade and there is more than one variant. A shade question needs two shades to choose between.

A second variant

“Which size should I get?”

The same slot as the shade question, for products whose options carry sizes. One of the two appears, never both — one row asks one thing about the options.

Complementary products

“What goes with this?”

Shown when you have set complementary products on that product in Shopify. The pairing is read from your own data, so the answer is yours, and a filled field is what puts the question on the row.

An ingredient list

“What’s in it?”

Shown when an ingredient list exists as a field on the product. The field itself is the evidence, so a title that happens to mention an ingredient leaves this question off the row — a question about contents earns its place once the contents are there to read.

A published policy

“Shipping and returns?”

The one question on the row that belongs to the store rather than the product, so it reads your published shipping or return policy instead of a product field. Nothing published, no question — and the answer comes from your configured shipping and return rules, not from the policy page text.

Six settings, at most five questions at once, because the shade and size questions share a slot. Each row above is a condition written into the block’s own code.

All five fields empty

The module stays off — and you are told

An empty “ask us” box repeats what the bubble already does, so a product missing all five fields above keeps the module off the page. It speaks to you, though: the theme editor names the fields that would bring it back, and a warning goes to the browser console. That note reaches you alone.

Two strings

The chip is short; the question is full

The chip says “this”; the question that reaches Refik carries the product’s full title, so the answer names the item the shopper is standing on. They were one string once, and a product title long enough to overflow a chip is an ordinary thing in a real catalogue.

Your wording

You can rewrite all five

The five question texts are settings you can edit in your own voice, and a placeholder in them is replaced with the product. The condition behind each one lives in the code, and that is the part deciding which questions your page carries.

Interface illustration, drawn from this page’s own condition list — a question reaches the row only where the field it reads exists on that product, so the row is assembled per product. The shade and size questions share one slot, which is why six settings print at most five questions at once, and the policy question is the one reading the store rather than the product. The dashed row at the foot is the all-empty case: the module stays off and the note goes to you, in the theme editor and the browser console. This is a drawing rather than a screenshot, and nothing here is a measured figure — the live-store evidence is still the placeholder further down.

The answer

One body of knowledge, whichever block asked.

A shopper who asks here and a shopper who asks in the corner bubble get the same answer, because both read the same thing: your store. Every source this panel reads is listed below.

Where the answer comes from

  • Your catalogue — titles, options, variants and the product copy
  • Live stock, so the options offered are the ones a shopper can buy
  • Your own shipping and return policy text, for a policy question
  • The complementary products you set yourself, for a pairing or a set
  • The answers you wrote in the console, for the questions your catalogue leaves open

Where this block stops

  • Change a product, an option, a price or an order
  • Reads inside one store: that separation is a query boundary, held below the model
  • Write to a theme file, or place itself on a page
  • Quote a rating, a review count or a “bestseller” line in the automatic summary
  • Promise that something out of stock is coming back

An answer can carry product cards with an add button, and a set built here lands on the routine table the shopper sees — with a meter naming which of the concerns they mentioned the set still leaves open. A sold-out product is marked on its card, in full view.

Measured

Three numbers this panel is held to.

0

model calls to decide which questions appear. The row is Liquid, reading your own fields.

1

summary generated per product, shared by every view of it. Thousands of views read one.

420

characters, the ceiling on that summary. A panel under the add-to-cart button earns its place by being short.

Source: this block’s own code and the limits in the module that writes the summary. All three are ceilings the code enforces, and a test in this repository recounts them from those files on every run.

Automatic summary

The text nobody asked for gets the strictest check.

About a second after the page opens, the panel can show a short read of the product above the question row. It is the one thing Refik writes on its own initiative — so it is the text most likely to be taken for the page’s own, and it is checked in code, outside the prompt.

Cached by content

One per product, invalidated by its own data

The storage key contains a fingerprint of the product: title, series, role, need tags, actives, usage text, description, price and variant list. Change any of those and the key changes, so the old text stops being reachable. A “clear the cache” button would have work to do only while a stale summary still had an address, and the fingerprint takes the address away.

Price

The price stays outside the prompt

The price block is written by code, and one figure is printed only when every sellable option costs the same. Any mention of price, cost or your currency symbol has the whole text rejected. A shopper was once told a product came in one size when it came in two; the answer to that was to stop asking a model to describe options at all.

Rejected text

A refused draft is dropped

The check refuses absence claims about your catalogue, result and efficacy claims, ratings and “bestseller” lines, and any single option name on a product with several. A refused summary leaves the slot empty and the page exactly as it was, releasing the space it would have taken. Repeated refusals back off further each time, so one rejection is paid for once.

The panel labels it as the assistant’s read and says it is AI-generated, because a shopper should be able to tell it from your own copy at a glance. “Hide” applies to that one product and leaves a button to bring it back, so a stray tap leaves the summary one press away. Stock is deliberately outside the fingerprint: the summary keeps to what stays still, and stock changes by the hour.

Limits

“I don’t know” is an answer this panel is allowed to give.

Handing a question to a person beats a confident wrong answer. On this surface handing over depends on the chat bubble being on, and the panel says which of the two states it is in.

It says so

Said plainly

Where the answer is out of reach, the panel says so in those terms, and a guess dressed as an answer stays off the page. The question reaches your console either way, which is how it becomes visible to you.

Chat window present

A person takes it

With the chat bubble switched on, the conversation can be handed to your team and the panel points the shopper at that window, where your replies appear. The handoff waits in the Refik inbox, and a connected helpdesk picks it up from there.

Chat bubble off

Then the handoff is left unoffered

With the bubble off, your replies have nowhere to land, so Refik is told so for that request and leaves “a person will take over” unsaid. It gives your support e-mail where a valid one is set, and where that field is empty it leaves the contact line out.

Unanswered questions are grouped as well as logged. The console keeps a list called “Questions the product page does not answer”, marked for whoever writes your content, beside searches that came back empty and products a shopper looked at together. That report is counted on the server, from records the conversations already left behind.

Two different absences

“Sold out” and “sold on another channel” are different sentences.

A product can be active, stocked and entirely real, and still belong to another sales channel — published there, absent from your online store. Its address returns a 404. Calling that out of stock would be false; calling it in stock would be an offer the shopper has any way to take.

In stock, published

Answered, and linked

The ordinary case. The answer can name the product, price it from your own data and link to its page, and it can appear as a card with an add button.

In stock, unpublished

Named, and left unlinked

Refik says plainly that the product exists and is sold on another channel, so the link and the order button both belong to that channel, and offers alternatives here. It does not say the product is out of stock, and it leaves a return date unpromised.

Out of stock, unpublished

Named, and silent about stock

Both halves are missing, so no claim is made about stock at all. Here “in stock” and “out of stock” are equally unverifiable, and the third honest option is to say neither and move on to what the shopper can buy.

An unpublished product stays in the catalogue on purpose: dropping it would have Refik deny a product you actually carry. What it loses is the link. Its handle never reaches the model, so an address is impossible to build from it, and it stays out of the product cards. The “tell me when it is back” flow deliberately skips this shared gate, because that flow exists for out-of-stock products — there the published half alone applies, and a request on an unpublished product is declined.

Honesty

What still needs evidence.

An in-page module is easy to sell with a number. Everything above is the block, its stylesheet and the server that answers it, described as plainly as we can manage. So here is what still needs evidence, in the same voice.

  • An engagement figure

    We have no measurement of what this module does to interaction on a real store, so the figure belongs to the first store that runs it.

  • A store running it

    Refik is not listed on the Shopify App Store yet, so the first live theme is still ahead of us.

  • What has been checked, and by whom

    This block’s code, its stylesheet, its translations and the server that answers it are covered by the tests in this repository, and those tests recount every number on this page from those files. The reading that remains is an outside one.

  • What the panel prints under every answer

    The panel says so under every answer, in these words: “Answers are AI-generated and can be wrong — check the product label before you buy.” What the module promises is narrower: a question reaches your page only where the field behind it exists.

Questions

The questions merchants actually ask about it.

Which products does the module appear on?

The ones that carry at least one of four things: usage instructions or an A+ description, an ingredient list, a second variant, or complementary products. A product missing all four keeps the module off the page, and the theme editor tells you which field would bring it back. That is the point of the gate: a box whose only answer is a shrug costs more than an absent box.

Can I change the questions?

You can rewrite all five texts in the block’s settings, in your own wording, and a placeholder in them is filled with the product. The condition behind each one stays in the code, and that is the part doing the work: it is what keeps a question ahead of your data off the page.

Does the summary cost a model call on every page view?

One call per product, then reads from storage, so thousands of views share a single summary. It regenerates on its own when the product’s own data changes, because that data is part of the storage key — and where the check refuses a draft, the slot stays empty and the draft is dropped.

Where does the free-text box send my shopper’s question?

To the same endpoint as the chat bubble, along that single server path. It sits outside a form, because the product page’s cart form is already there and nesting one form inside another is invalid markup that makes the Enter key add to cart in some themes.

What happens on a product I have kept unpublished?

The name travels, the link stays behind. Refik will name the product if a shopper asks for it, say the page for it lives on another channel, and offer alternatives — and it keeps “out of stock” for the products that actually are. The product stays in the catalogue so that a shopper who asks by name hears it exists.

Does this block slow the product page down?

Its stylesheet stays out of the first paint, and its scripts sit in an inert template until the panel is about 300 pixels from view, loaded in order once it is. Because the panel itself is rendered by the server it can paint before the stylesheet arrives, so the box metrics in the inline critical style are kept byte for byte identical to the stylesheet — the colours change when it lands, the heights hold, and the content below the panel keeps its place.

Where this page and your own theme editor disagree, the bug is on this page and we want to know. Every sentence above was read out of the block, its stylesheet, its translations and the server that answers it — and a sentence can be true and still be the wrong thing to say.