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.
Storefront · product page
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
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
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
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
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
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.
“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.
“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.
“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.
“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.
“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.
“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
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 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
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.
The answer
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.
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
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
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
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 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
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
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
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
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
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
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.
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.
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.
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
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.
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.
Refik is not listed on the Shopify App Store yet, so the first live theme is still ahead of us.
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.
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 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.
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.
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.
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.
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.
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.
Next
Overview
Where each of the five blocks runs, what each one answers, and where each one stops. Two of the five leave the model out of the path.
Recorded
A scripted conversation where every exchange is shown with the request that went out and the payload that came back.
Access
The access scopes Refik asks you to approve, the ones it leaves unrequested, and the three paths by which data gets deleted.