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 Google 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.