Review requests module
Module id: review_request. Dependencies: checkout.
Some days after an order is marked shipped, the customer gets one email asking them to review the shop. By default the button goes to the website's Google review page, so new reviews show up on Google and, through the Google reviews sync, on the site itself.
The module is off on every website until it is switched on in the Modules tab. The sidebar item (Review requests, Commerce section, next to Newsletter) opens its settings.
Who is asked, and when
Once a day, at 08:00 UTC, the platform looks for orders that were marked shipped at least Days after shipping ago and were never asked. Each of those customers gets one email, in their language (the customer's, else the order's, else the website default).
Not asked:
- bol.com orders. bol asks its own buyers for reviews, about bol.
- Orders refunded or cancelled before the request went out.
- Customers who unsubscribed from review requests on this website.
- Returning customers asked recently: someone asked within Ask a returning customer again after days is not asked again for a new order. 0 asks after every order.
An order whose request is more than 7 days overdue is let go. That is what stops switching the module on from emailing the whole order history, and it also means a missed run, or a website that fixes its sender address, still asks last week's customers.
There is no "delivered" status, so the delay counts from the day the order was marked shipped. For a pickup order that is the day it was collected.
What operators set
| Setting | Default | What it does |
|---|---|---|
| Days after shipping | 7 | 1 to 60. Leave time for delivery and for trying the product. |
| Ask a returning customer again after | 180 days | 0 to 730. 0 = ask after every order. |
| Review link | Blank = the Google review page of the website's Google place id. An https link sends customers to another review site instead. | |
| Email text (per language) | built-in text | Subject and opening paragraph. Blank = the built-in text in that language. %shop%, %ref% (order number) and %name% (first name) are filled in. |
Nothing is sent while the website has no review link (no Google place id and no review link set) or no sender address. The settings screen says so in red.
The Google place id is set on the website itself: Websites → General →
Google reviews. The review link it gives is
https://search.google.com/local/writereview?placeid=<place id>; open it
from the settings screen to check it is the right business.
Rules a shop must keep
Google removes reviews, and can restrict the business profile, when requests break its policy:
- Ask everyone the same way. Do not send only satisfied customers to Google ("review gating"). The module sends every customer the same link.
- Offer nothing in return. No discount code, no competition entry, in the email text or anywhere else.
Treat a review request as a marketing email (that is the safe reading of Dutch and EU rules). To existing customers about their own purchase it is allowed without separate consent, provided they were told when they gave their address that they may get one, and every mail carries a working opt-out. The mail has the opt-out (see below). Telling them is up to the shop: mention review requests in the privacy statement and near the email field at checkout. The checkout has no "don't ask me" box of its own.
Unsubscribe
Every request carries an unsubscribe link and a one-click
List-Unsubscribe header (RFC 8058). Unsubscribing stops review requests
from this website to that address, nothing else: order mails and the
newsletter are not affected. The link keeps working after the module is
switched off.
Where to see what was sent
Each request is in the order's Emails tab as Review request, with its full text, sent or failed (and why). The settings screen shows how many went out in the last 30 days.
Each order is asked at most once. If a send fails (the mail server was down, the address bounced at once) it is recorded as failed and not retried: one review fewer is better than a customer asked twice.
Public routes
| Route | Method | What |
|---|---|---|
/review-request/unsubscribe/{token} |
GET, POST | Opt-out link from the email; POST is the one-click unsubscribe from mail providers. |
Overridable templates
| Template | What |
|---|---|
review_request/email/review_request.html.twig (+ .txt.twig) |
The email. Inputs: order, website, subject, locale, reference, customer_name, message (the shop's own text or null), review_url, unsubscribe_url. |
review_request/unsubscribe.html.twig |
The page after unsubscribing. Inputs: website, result (done or invalid). |
Scheduled job
cms-cron-reviews-request in cms-k8s runs
app:schedule:dispatch reviews:request daily at 08:00 UTC. It only queues
the work; cms-worker sends the mails on the analytics queue.