Student for 90 days → a review request
Every Monday, ask for a Google review from the students who joined three months ago, after a first run that sends nothing, with n8n or Make.
Every Monday at 9 am, the students who joined three months ago get a message in the app that asks them for a Google review. This use case writes in your name: it needs a key with Students › Read (students:read) and Messages › Write (messaging:write), and an offer that includes writes. Create the key in the app, terms of use accepted.
What this use case does
- Trigger: every Monday at 9 am. The window runs from 97 to 90 days ago: seven days, so each student is asked once.
- Students:
GET /studentswithlimit=50, every page. Keep those whosejoined_atis in the window, unless their contract isPAUSEDorEXPIRED. - Send: one
POST /operations/messaging.sendper student kept.
curl -X POST https://api.fitdistance.io/api/partner/v1/operations/messaging.send \
-H "Authorization: Bearer fd_live_xxxxxxxx" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: avis-42-2026-10-26" \
-d '{"text": "Hi Léa, …", "studentId": 42}'The Idempotency-Key is avis-<id>-<YYYY-MM-DD>, with the date of the run: a replay the same day is refunded. See Writes and idempotency. If your tool is off on a Monday, the students of that window are not caught up.
The message
Hi Léa, we've been working together for three months. If you have two minutes, your Google review would help me a lot:
https://g.page/r/XXXXXXXX/review. Thank you!
A review is asked of every student of the window, never only of the satisfied ones, and never bought: Google forbids soliciting only positive reviews and offering anything in exchange. The message stays yours: read it and change it before you enable sending, without making it depend on how satisfied the student is. Your link is in your Google Business Profile, on a computer: Read reviews, Get more reviews, the share icon, then Copy.
What it costs
A page read costs one credit, debited before the call; each message sent costs one. With 100 students: 2 pages read with limit=50, 1 with limit=200, then one message per student of the week. A refused parameter still costs a credit; a 401, a 403 or a 429 costs nothing; a replay is refunded.
A first run that sends nothing
messaging.send has no preview by studentId: dry_run: true gives a 400 DRY_RUN_UNSUPPORTED, free. So the first run lists the students without messaging them, for the price of the reads only.
In n8n
- Choose Import from URL… and paste
https://fitdistance.io/documentation/api/cas-pratiques/avis-google-90-jours.n8n.json, or download the workflow and choose Import from File…. Pick theFit'Distance APIcredential from Connect n8n in each HTTP Request node. - Put your review link at the top of the code of Students to remind: while
XXXXXXXXis still in it, the node stops. The text is in French: replace it with the English message above. - Run the workflow and read the output of Students to remind: one item per student, with its text.
Sending writes to real students
Send message ships disabled: enable it only after this first run. The Idempotency-Key carries the date of the day: a run by hand on another day shifts the window and may write twice to the same student. Once sending is enabled, let the schedule work.
- Enable Send message, then activate the workflow. It sends at most one message per second.
The loop is the one of Connect n8n: More students? is the If node and Students, next page reads the next page. The hours and the windows follow the time zone of the workflow (Timezone in its settings, New York by default).
In Make
- HTTP › Make a request (schedule: every Monday at 9 am):
GETonhttps://api.fitdistance.io/api/partner/v1/students,limit=200, Parse response set toYes. - Iterator on
data, then a filter:joined_atlater than or equal to{{addDays(now; -97)}}and earlier than{{addDays(now; -90)}},contract_statusdifferent fromPAUSEDandEXPIRED. - Read the result of the filter, then add HTTP › Make a request:
POSTon/operations/messaging.send,Idempotency-Key=avis-{{id}}-{{formatDate(now; YYYY-MM-DD)}}, Body content typeapplication/JSON, Body input methodJSON string, body{"text": "…", "studentId": {{id}}}.
Make reads only 200 students; the n8n workflow reads every page. Reference: students, sending a message.