product-review.submitted
Sent when a customer submits a product review, with the review, the reviewer's profile and their loyalty standing.
Use it to copy reviews into a CRM or a support tool, or to alert a team about low ratings.
When it fires
- Once per review, when a customer submits it through a Cevoid review form or widget.
- Reviews imported through the API send no event.
- The review can still be waiting for moderation: check
data.product_review.statusbefore you show it anywhere. profiledescribes the reviewer. The event carries nopointsortier.
Receive it
Pick product-review.submitted in a webhook destination's events, or tick All events. See Create a destination.
To filter it or wait before sending, send it from a Flow on the Product review submitted trigger instead. See Send from a Flow.
The Company review request action can also send to a webhook from this trigger. It sends company-review-request.created, not the payload below.
Payload
{
"created_at": "2026-11-02T09:30:00.000Z",
"data": {
"product_review": {
"answers": [
{
"format": "CENTERED_RANGE",
"prompt": "How does it fit?",
"scale": {
"center_label": "Just right",
"end_label": "Too large",
"start_label": "Too small",
"steps": 5
},
"type": "PRODUCT_ATTRIBUTE",
"value": 3
},
{
"format": "SINGLE_SELECT",
"options": [
{
"label": "Blue",
"value": "blue"
},
{
"label": "Green",
"value": "green"
}
],
"prompt": "What is your favourite colour?",
"type": "PROFILE_PROPERTY",
"value": "blue"
}
],
"approved_at": "2026-09-01T10:00:00.000Z",
"body": "Comfortable and true to size.",
"channel": "REQUEST",
"created_at": "2026-09-01T10:00:00.000Z",
"helpful_down_count": 0,
"helpful_up_count": 3,
"id": "rev_abc123",
"identity_verification": "CONFIRMED",
"is_incentivized": false,
"is_insider": false,
"language": "en",
"market_id": "mar_abc123",
"media": [
{
"aspect_ratio": 1.5,
"aspect_ratio_type": "LANDSCAPE",
"moderation_status": "APPROVED",
"thumbnail_url": "https://cdn.cevoid.com/reviews/rev_abc123/photo-thumb.jpg",
"type": "IMAGE",
"url": "https://cdn.cevoid.com/reviews/rev_abc123/photo.jpg"
},
{
"aspect_ratio": 0.5625,
"aspect_ratio_type": "PORTRAIT",
"thumbnail_url": "https://cdn.cevoid.com/reviews/rev_abc123/clip-thumb.jpg",
"type": "VIDEO",
"url": "https://cdn.cevoid.com/reviews/rev_abc123/clip.mp4",
"video_length": 12
}
],
"order_id": "ord_abc123",
"pinned_at": "2026-09-01T10:00:00.000Z",
"product": {
"id": "prd_abc123",
"image_url": "https://cdn.example.com/products/everyday-shirt.jpg",
"options": [
"color:blue",
"size:m"
],
"price": {
"amount": 49.95,
"currency": "USD"
},
"sku": "SHIRT-BLUE-M",
"title": "Everyday shirt",
"variant_id": "var_abc123"
},
"profile_id": "prf_abc123",
"published_at": "2026-09-01T10:00:00.000Z",
"purchase_verification": "VERIFIED",
"rating": 5,
"rejection_reasons": [],
"responses": [
{
"author_type": "WORKSPACE",
"body": "Thank you for the kind words!",
"created_at": "2026-09-01T10:00:00.000Z",
"updated_at": "2026-09-01T10:00:00.000Z"
}
],
"source": {
"external_id": "review_123",
"platform": "cevoid",
"url": "https://example.com/reviews/123"
},
"status": "PUBLISHED",
"submitted_at": "2026-09-01T10:00:00.000Z",
"title": "Comfortable everyday fit",
"updated_at": "2026-09-01T10:00:00.000Z"
},
"profile": {
"avatar_url": "https://cdn.cevoid.com/avatars/prf_sarah/profile.jpg",
"bio": "Lifestyle creator and photography enthusiast",
"birthday": "1992-04-18",
"country": "US",
"created_at": "2026-01-15T09:30:00.000Z",
"email": "sarah.johnson@example.com",
"external_id": "customer_7391056823401",
"first_name": "Sarah",
"id": "prf_sarah",
"language": "en",
"last_name": "Johnson",
"location": "San Francisco, CA",
"name": "Sarah Johnson",
"notes": "VIP customer; prefers email communication",
"social_instagram_handle": "sarah.lifestyle",
"social_tiktok_handle": "sarah.creates",
"social_x_handle": "sarah_j",
"updated_at": "2026-01-20T14:22:15.000Z"
}
},
"id": "evt_m3p82kdq5xw7tz4c",
"type": "product-review.submitted",
"version": 1
}Show all 129 linesShow fewer lines
versionnumberrequiredThe version of this event type. A published version only gains fields, so ignore fields you do not use; a breaking change is a new version.
idstringrequiredStable event id (evt_ plus 16 characters), also sent as the webhook-id header. Retries and manual replays send the same id, so ignore an event whose id you have already processed.
typestringrequiredWhat data describes. New types are added over time, and an endpoint on "All events" receives them, so ignore any type you do not handle.
created_atstring<date-time>requiredWhen the event happened, as an ISO 8601 timestamp.
originobjectWhy your endpoint received the event. Omitted when the event was forwarded without a Flow of your own.
dataobjectrequiredThe resources the event carries, keyed by resource name. type decides which resources are included, and resources your plan does not include are left out.