Connect Loox, Judge.me, Yotpo Reviews, Rivo or Yotpo Loyalty so review and loyalty activity starts automations, lands on the contact profile and feeds segments.
Senderz reads activity from the reviews and loyalty apps you already run. A submitted review, a points balance change, a tier upgrade or a referral becomes an event on the contact, can start an automation, and can be filtered in a segment.Every vendor is translated into one shared set of events. That is the point of the design: if you move from Loox to Judge.me, or from Rivo to Yotpo Loyalty, your automations and segments keep working. You reconnect the new app and the same triggers fire.
Reviews and review approvals. Senderz registers the webhooks in Judge.me for you and removes them when you disconnect.
Loox
Reviews. You paste a webhook address into Loox.
Yotpo Reviews
Reviews. You paste a webhook address into Yotpo.
Rivo
Loyalty, referrals and points. You paste a webhook address into Rivo.
Yotpo Loyalty & Referrals
Loyalty, referrals and points. You paste a webhook address into Yotpo.
All five appear as tiles on the Integrations page, under the Reviews and Loyalty categories. Connecting and disconnecting is limited to workspace owners and admins.
Nothing is imported from your history. Senderz only sees activity that
arrives after the webhook is live. Reviews you bulk imported into your reviews
app, and points people already hold, do not create events here. Existing
balances do reach the contact profile the first time that person is mentioned
in a live loyalty webhook.
Go to Integrations, filter to the Reviews category, and choose
Connect on Judge.me, Loox or Yotpo Reviews.
2
Fill in the fields
Store domain and API key are both optional for Loox and Yotpo
Reviews. Judge.me needs both: enter your shop domain and your Judge.me
private API token, or the connection is refused.
3
Finish in the reviews app
Judge.me is done at this point. For Loox and Yotpo Reviews, Senderz shows
you a webhook address and a signing key. Add the address in the reviews app
and subscribe it to review events.
You need your shop domain, for example your-store.myshopify.com, and a
Judge.me private API token from your Judge.me account.Both are under Judge.me → Settings → Integrations → View API tokens.
Enter the shop domain exactly as Judge.me shows it there.Senderz calls Judge.me with that token and registers two webhooks pointing
at your workspace address: review created and review updated. Connecting
again only adds whatever is missing, so a reconnect never leaves duplicate
webhooks behind. There is nothing to paste and no separate key to copy.Judge.me signs each delivery, and your private API token is the signing key.
If you rotate that token in Judge.me, reconnect in Senderz or deliveries
start failing verification. Judge.me also names the shop in every delivery,
and Senderz ignores a delivery that names a different shop than the one you
connected.
Loox
No credential is required. Leave the API key blank unless you have a reason
to store one.After connecting, open Loox → Settings → API Keys → Webhooks, add the
address Senderz gives you as the webhook destination, and subscribe it to
review events.
Yotpo Reviews
No credential is required. After connecting, open your Yotpo webhook
settings, add the address Senderz gives you, and subscribe it to review
events.
Go to Integrations, filter to the Loyalty category, and choose
Connect on Rivo or Yotpo Loyalty & Referrals.
2
Enter the credentials
Rivo needs your Developer Toolkit key. Yotpo Loyalty needs both the API key
and the GUID shown beside it. Both are required, unlike the reviews apps.
3
Add the webhook in the loyalty app
Senderz shows you a webhook address and a signing secret. In Rivo, open
Developer Toolkit → Webhooks. In Yotpo Loyalty, open the webhook
settings. Subscribe to points, redemption, tier, referral and expiry events,
then save.
The loyalty credential is not only for reading. It is also what lets the Grant points automation step write points back, so keep it valid.
The full address to paste into the vendor’s dashboard. It already contains
your workspace ID and, for the vendors that check a shared key, the key
itself. Paste it exactly as shown.
Shown once, immediately after connecting. Use it only if the vendor’s
dashboard has its own separate field for a signing or validation key.
The address looks like this, with your own workspace ID in place:
POST https://api.senderz.app/api/v1/integrations/reviews/inbound/loox/{workspaceId}?secret=…POST https://api.senderz.app/api/v1/integrations/loyalty/inbound/rivo/{workspaceId}?secret=…
Copy the key before you close the dialog. It is never shown again. If you lose
it, connect again: that mints a new key and replaces the old one, which means
you must update the webhook in the vendor’s dashboard too.
A signature header, judgeme-hmac-sha256 (also accepted as x-judgeme-hmac-sha256), a hex HMAC-SHA256 of the raw body keyed by your private API token, plus a check that the shop_domain in the body is the store you connected
Loox
The key in the address, or a matching header such as x-loox-signature or x-loox-validation-key
Yotpo Reviews
The key in the address, or a matching x-yotpo-token header
Yotpo Loyalty
The key in the address, or a matching x-yotpo-token header
Rivo
A signature header only: x-rivo-hmac-sha256, computed from the body using the signing secret
Rivo is the exception worth reading twice. Senderz checks a signature header
for Rivo and ignores the key sitting in the address, so you must set the
signing secret inside Rivo as well. The address carries the same value only so
you can copy it from one place. If Rivo sends no signature header, the
delivery is rejected.
Senderz reads the event name from a topic header when the vendor sends one, and otherwise from the event name inside the payload, so both styles work.
This is the step merchants skip, and the result is customers receiving two of everything.
Judge.me keeps sending its own review requests until you turn them off
Judge.me does not know Senderz is connected, so its own review request
emails keep going out. In Judge.me go to Settings → Request scheduling
and untick Send requests for domestic, international and POS orders, or
customers will get two requests. Send your review requests from a Senderz
automation instead (see below). Judge.me only switches its own emails off
automatically for its built-in Klaviyo trigger, which does not apply here.
Loox keeps sending some emails
Loox stops its review request and reminder emails, but thank you, photo and
video reminder, and discount reminder emails keep going out. Turn those off
in Loox if you plan to rebuild them in Senderz.
Yotpo Reviews does not stop anything by itself
In Yotpo go to Emails → Email setup → Review request email and
deactivate it, or customers will get two requests.
Rivo and Yotpo Loyalty
Turn off the matching loyalty notification emails in the vendor before you
publish the equivalent automation in Senderz, or customers can receive both
messages.
The reviews app says it is time to ask this person for a review
Review submitted
A review was submitted, published or not
Review approved
The review went live on the store. Fires once per review: together with the submitted event when the app publishes on submission, or later when the store owner approves it
Question or answer
A product question was asked or answered
Judge.me has a store-owner approval step the other apps do not. A review
can sit unpublished for days, or be rejected. That is why the approval is its
own event: a thank you built on Review approved only ever reaches people
whose review you actually published, and a negative-review alert built on
Review submitted still fires the moment a one-star review lands, published
or not. Approving a review in Judge.me also marks the earlier submitted event
as published, so a segment on published reviews stays accurate.
Judge.me does not send “Review request ready”. Its own timing engine has
no webhook, so build the request yourself: start an automation from Fulfilled
order or Shipment delivered, add a wait step for the number of days you
want, then send the email and link to the product page where the Judge.me
review form lives. Add a second email that only sends if the contact has not
submitted a review since the automation started, using the Submitted a
review event condition with the “since starting this flow” timeframe.
Rivo also sends a profile update that carries no event. Senderz uses it to refresh the contact’s loyalty fields quietly, with no timeline entry and no automation.
Open a contact and you will see the activity in the timeline, plus a set of properties that Senderz keeps up to date.
After a review is submitted
Senderz maintains a running summary on the contact:
Review count, incremented on each submitted review
Avg review rating, a running average across the reviews that carried a rating
Has left review media, true once the contact submits a review with a photo or video
Last review at, the time of the most recent review
Re-delivery of the same webhook does not double count.
After loyalty activity
Senderz stores the latest snapshot the vendor sent:
Membership tier and Total points
Credit balance, next tier and what is needed to reach it
Referral URL
Expiring points and the date they expire
Whether the contact has opted in to the loyalty programme
Values are only ever overwritten by a newer webhook, so the profile matches
the vendor.
Product details on a review event
A review event also carries the product it was about, including the product
ID, title, image and the link to the review, so the timeline entry is
recognisable.
No consent is ever changed by a review or loyalty event. If the person is
not already a contact, Senderz creates one with no marketing consent on any
channel, so they receive nothing until they opt in somewhere. Reviewing a
product is not permission to email someone. See
Consent.
Every trigger accepts filters on the details of the event itself, so one automation can branch on what happened.
Review triggers
Loyalty triggers
Available filters: rating, has photo, has video, published,
verified buyer, product id, qa kind and vendor.Practical uses:
Send a thank you and a coupon only when the rating is 4 or 5, and route 1 to 3 to a support follow-up
Reward a photo or video review more generously than a text review
Send “your review is live” from the Review approved trigger, so it waits for the store owner’s approval on Judge.me and still fires on submission for apps that publish immediately
Tell a question apart from an answer using qa kind
Available filters: points, tier, reason, stage,
referral kind and vendor.Practical uses:
Treat a move into your top tier differently from a move into the first tier
Split the expiry reminder between an early warning and a last chance using stage
Send one message to the referrer and another to the friend using referral kind
Only celebrate a points event above a threshold
The same values are available as merge tags inside the message that automation sends, so you can write the rating, tier, points or reward name directly into the copy.
Stops Rivo sending a parallel points email. Yotpo does not accept this
instruction, so disable the matching Yotpo notification inside Yotpo.
The step needs the contact to have an email address, because that is how both
vendors identify a member. Contacts without one are skipped and the automation
carries on to the next step. A contact never receives the same grant twice,
even if the step is retried.
Two event conditions are available in the segment builder.
Submitted a review
Filter on product id, rating, has photo, has video,
published, verified buyer and vendor, combined with a count and a
timeframe.This is how you build an ambassadors segment: people who submitted a
four-star-or-better review with a photo in the last 90 days.
Earned loyalty points
Counts points-earning events in a timeframe. This condition has no
parameters, so you can filter on how many times and how recently, but not on
the number of points in each event. To segment on a balance, use the
Total points contact field instead.
Membership tier and Total points are recognised contact fields, so they appear in Settings → Contact Fields under Loyalty and can be used directly as segment filters once loyalty data has arrived.
The review summary fields are a known gap. Review count, Avg review
rating, Has left review media and Last review at are written to the
contact and visible on the profile, but they are not offered in the segment
field picker. The similarly named Total reviews, Average review score
and Last review fields in the picker are separate fields that no
integration writes, so a segment built on them returns nobody. Use the
Submitted a review event condition instead.
Choose Disconnect on the tile. Senderz stops accepting events from that vendor and deletes the stored signing key.
For Loox and Yotpo, Senderz does not remove the webhook from the vendor’s
dashboard. The vendor keeps sending, and every delivery is answered with a
“not connected” response and discarded. Remove the webhook in the vendor’s
dashboard yourself to stop the traffic. For Judge.me, Senderz removes the
webhooks it registered as part of disconnecting.
Reconnecting later creates a new signing key. Update the webhook in the vendor’s dashboard to match, or deliveries will start failing verification.
The second half of the setup is almost always the cause. Confirm the webhook
exists in the vendor’s dashboard, that it points at the exact address Senderz
gave you, and that it is subscribed to the right events. Judge.me is the only
vendor where this step is done for you.
It worked and then stopped
Check whether the integration was reconnected. Reconnecting mints a new
signing key, and the old address in the vendor’s dashboard stops verifying.
Copy the new address and key across.For Judge.me, check whether the private API token was rotated. That token is
the signing key.
Rivo deliveries are rejected
Rivo is verified by a signature header, not by the key in the address. Set
the signing secret inside Rivo so it signs each delivery.
Reviews arrive but the automation never runs
Check the trigger filters. A filter on published will hold everything
back until the review is published in the reviews app, and a rating filter
excludes any review that arrived without a rating value.
A review arrived but no contact was created
Senderz needs an email address or a phone number to identify the reviewer. A
payload carrying neither is discarded.
No history import. There is no backfill of past reviews, past points or past tiers. Only new activity counts.
No review content block. The reviews block in the email builder is a static list you type yourself. It does not pull live reviews from a connected app.
No reviews or loyalty dashboard. These events do not appear in analytics or revenue reporting. The contact timeline and segment counts are the record.
Limited loyalty segmentation. Membership tier and total points are filterable. Credit balance, next tier, referral URL and expiry fields are stored on the contact but are not offered in the segment field picker.
Review summary fields are not filterable. See the warning above.
No points write-back for reviews apps. Only loyalty apps accept a write, through the Grant points step.
Every trigger, including trigger filters and re-entry rules.
Segments
Building segments from events and contact fields.
Inbound webhooks
Every inbound address, who provisions it, and how deliveries are verified.
Outbound webhooks
Forwarding review and loyalty events to your own systems.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Senderz","description":"Senderz is the Israel-first marketing platform for email, SMS, web push and voice. Documentation, guides, integrations and API reference.","colors":{"primary":"#141414","light":"#fafafa","dark":"#737373"},"logo":{"light":"https://mintcdn.com/senderz/TYfOlOCqzxvvnafR/logo/logo-light.png?fit=max\u0026auto=format\u0026n=TYfOlOCqzxvvnafR\u0026q=85\u0026s=716b2d481f50aa8a6539edb6be85247f","dark":"https://mintcdn.com/senderz/TYfOlOCqzxvvnafR/logo/logo-dark.png?fit=max\u0026auto=format\u0026n=TYfOlOCqzxvvnafR\u0026q=85\u0026s=fd55875da479e5492f832c94aadcaa4b","href":"https://senderz.app"},"favicon":"https://mintcdn.com/senderz/TYfOlOCqzxvvnafR/favicon.ico?fit=max\u0026auto=format\u0026n=TYfOlOCqzxvvnafR\u0026q=85\u0026s=536e1b773b66d5a4d4bdd0491fce1c5a","appearance":{"default":"light"},"background":{"color":{"light":"#f6f6f6","dark":"#0a0a0a"}},"navbar":{"links":[{"href":"mailto:hello@senderz.app","label":"Support"},{"href":"https://status.senderz.app","label":"Status"}],"primary":{"type":"button","label":"Open Senderz","href":"https://app.senderz.app"}},"footer":{"socials":{"website":"https://senderz.app","x":"https://x.com/senderz","linkedin":"https://www.linkedin.com/company/senderz"},"links":[{"header":"Product","items":[{"label":"Dashboard","href":"https://app.senderz.app"},{"label":"Pricing","href":"https://senderz.app/pricing"}]},{"header":"Legal","items":[{"label":"Terms","href":"https://app.senderz.app/terms"},{"label":"Privacy","href":"https://app.senderz.app/privacy"},{"label":"Acceptable use","href":"https://app.senderz.app/acceptable-use"}]}]},"search":{"prompt":"Search the Senderz docs"},"styling":{"eyebrows":"breadcrumbs","codeblocks":"system","latex":false},"navigation":{"languages":[{"language":"he","default":true,"href":"he/getting-started/introduction"},{"language":"en","href":"en/getting-started/introduction"}]}},"deployment":{"deploymentMetadataValue":{"subdomain":"senderz","hasAudioNarration":false,"actualSubdomain":"senderz","customDomains":["docs.senderz.app"],"gitSource":{"type":"github","owner":"appdever01","repo":"sender","deployBranch":"docs","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"entitlements":{"AI_CHAT":{"status":"DISABLED"}},"buildId":"6ac293e5f04d9190a8c6d0e9","clientVersion":"0.0.4124","searchFilterCounts":[{"language":"en","tag":"Guides","count":52},{"language":"en","tag":"Integrations","count":18},{"language":"en","tag":"Campaigns \u0026 automation","count":17},{"language":"en","tag":"API reference","count":15},{"language":"en","tag":"Public API","count":8},{"language":"en","tag":"E-commerce","count":8},{"language":"en","tag":"Audience","count":7},{"language":"en","tag":"Channels","count":6},{"language":"en","tag":"Account","count":5},{"language":"en","tag":"Automation \u0026 no-code","count":5},{"language":"he","tag":"מדריך","count":4},{"language":"he","tag":"אינטגרציות","count":4},{"language":"he","tag":"סקירה","count":4},{"language":"he","tag":"צעדים ראשונים","count":3},{"language":"he","tag":"רגולציה בישראל","count":1}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-rbac-roles","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-metadata","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"live-agents","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"en/integrations/reviews-and-loyalty","slug":"/en/integrations/reviews-and-loyalty","pageMetadata":{"title":"Reviews and loyalty apps","description":"Connect Loox, Judge.me, Yotpo Reviews, Rivo or Yotpo Loyalty so review and loyalty activity starts automations, lands on the contact profile and feeds segments.","icon":"star","href":"/en/integrations/reviews-and-loyalty"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Connect Loox, Judge.me, Yotpo Reviews, Rivo or Yotpo Loyalty so review and loyalty activity starts automations, lands on the contact profile and feeds segments.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,li:`li`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,..._provideComponents(),...props.components},{Accordion,AccordionGroup,Card,CardGroup,CodeBlock,Heading,Info,Note,ParamField,Step,Steps,Tab,Table,Tabs,Warning}=_components;if(!Accordion)_missingMdxReference(`Accordion`,true);if(!AccordionGroup)_missingMdxReference(`AccordionGroup`,true);if(!Card)_missingMdxReference(`Card`,true);if(!CardGroup)_missingMdxReference(`CardGroup`,true);if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Info)_missingMdxReference(`Info`,true);if(!Note)_missingMdxReference(`Note`,true);if(!ParamField)_missingMdxReference(`ParamField`,true);if(!Step)_missingMdxReference(`Step`,true);if(!Steps)_missingMdxReference(`Steps`,true);if(!Tab)_missingMdxReference(`Tab`,true);if(!Table)_missingMdxReference(`Table`,true);if(!Tabs)_missingMdxReference(`Tabs`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsx(_components.p,{children:`Senderz reads activity from the reviews and loyalty apps you already run. A submitted review, a points balance change, a tier upgrade or a referral becomes an event on the contact, can start an automation, and can be filtered in a segment.`}),`\n`,_jsx(_components.p,{children:`Every vendor is translated into one shared set of events. That is the point of the design: if you move from Loox to Judge.me, or from Rivo to Yotpo Loyalty, your automations and segments keep working. You reconnect the new app and the same triggers fire.`}),`\n`,_jsx(Heading,{level:`2`,id:`what-is-live-today`,children:`What is live today`}),`\n`,_jsxs(CardGroup,{cols:2,children:[_jsx(Card,{title:`Judge.me`,icon:`star`,children:_jsx(_components.p,{children:`Reviews and review approvals. Senderz registers the webhooks in Judge.me for you and removes them when you disconnect.`})}),_jsx(Card,{title:`Loox`,icon:`star`,children:_jsx(_components.p,{children:`Reviews. You paste a webhook address into Loox.`})}),_jsx(Card,{title:`Yotpo Reviews`,icon:`star`,children:_jsx(_components.p,{children:`Reviews. You paste a webhook address into Yotpo.`})}),_jsx(Card,{title:`Rivo`,icon:`gift`,children:_jsx(_components.p,{children:`Loyalty, referrals and points. You paste a webhook address into Rivo.`})}),_jsx(Card,{title:`Yotpo Loyalty \u0026 Referrals`,icon:`gift`,children:_jsx(_components.p,{children:`Loyalty, referrals and points. You paste a webhook address into Yotpo.`})})]}),`\n`,_jsxs(_components.p,{children:[`All five appear as tiles on the `,_jsx(_components.strong,{children:`Integrations`}),` page, under the `,_jsx(_components.strong,{children:`Reviews`}),` and `,_jsx(_components.strong,{children:`Loyalty`}),` categories. Connecting and disconnecting is limited to workspace owners and admins.`]}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Nothing is imported from your history.`}),` Senderz only sees activity that\narrives after the webhook is live. Reviews you bulk imported into your reviews\napp, and points people already hold, do not create events here. Existing\nbalances do reach the contact profile the first time that person is mentioned\nin a live loyalty webhook.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`connect-a-reviews-app`,children:`Connect a reviews app`}),`\n`,_jsxs(Steps,{children:[_jsx(Step,{title:`Open the tile`,children:_jsxs(_components.p,{children:[`Go to `,_jsx(_components.strong,{children:`Integrations`}),`, filter to the `,_jsx(_components.strong,{children:`Reviews`}),` category, and choose\n`,_jsx(_components.strong,{children:`Connect`}),` on Judge.me, Loox or Yotpo Reviews.`]})}),_jsx(Step,{title:`Fill in the fields`,children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Store domain`}),` and `,_jsx(_components.strong,{children:`API key`}),` are both optional for Loox and Yotpo\nReviews. Judge.me needs both: enter your shop domain and your Judge.me\nprivate API token, or the connection is refused.`]})}),_jsx(Step,{title:`Finish in the reviews app`,children:_jsx(_components.p,{children:`Judge.me is done at this point. For Loox and Yotpo Reviews, Senderz shows\nyou a webhook address and a signing key. Add the address in the reviews app\nand subscribe it to review events.`})})]}),`\n`,_jsx(Heading,{level:`3`,id:`where-each-credential-comes-from`,children:`Where each credential comes from`}),`\n`,_jsxs(AccordionGroup,{children:[_jsxs(Accordion,{title:`Judge.me`,icon:`star`,id:`judge-me`,children:[_jsxs(_components.p,{children:[`You need your shop domain, for example `,_jsx(_components.code,{children:`your-store.myshopify.com`}),`, and a\nJudge.me private API token from your Judge.me account.`]}),_jsxs(_components.p,{children:[`Both are under `,_jsx(_components.strong,{children:`Judge.me → Settings → Integrations → View API tokens`}),`.\nEnter the shop domain exactly as Judge.me shows it there.`]}),_jsx(_components.p,{children:`Senderz calls Judge.me with that token and registers two webhooks pointing\nat your workspace address: review created and review updated. Connecting\nagain only adds whatever is missing, so a reconnect never leaves duplicate\nwebhooks behind. There is nothing to paste and no separate key to copy.`}),_jsx(_components.p,{children:`Judge.me signs each delivery, and your private API token is the signing key.\nIf you rotate that token in Judge.me, reconnect in Senderz or deliveries\nstart failing verification. Judge.me also names the shop in every delivery,\nand Senderz ignores a delivery that names a different shop than the one you\nconnected.`})]}),_jsxs(Accordion,{title:`Loox`,icon:`star`,id:`loox`,children:[_jsx(_components.p,{children:`No credential is required. Leave the API key blank unless you have a reason\nto store one.`}),_jsxs(_components.p,{children:[`After connecting, open `,_jsx(_components.strong,{children:`Loox → Settings → API Keys → Webhooks`}),`, add the\naddress Senderz gives you as the webhook destination, and subscribe it to\nreview events.`]})]}),_jsx(Accordion,{title:`Yotpo Reviews`,icon:`star`,id:`yotpo-reviews`,children:_jsx(_components.p,{children:`No credential is required. After connecting, open your Yotpo webhook\nsettings, add the address Senderz gives you, and subscribe it to review\nevents.`})})]}),`\n`,_jsx(Heading,{level:`2`,id:`connect-a-loyalty-app`,children:`Connect a loyalty app`}),`\n`,_jsxs(Steps,{children:[_jsx(Step,{title:`Open the tile`,children:_jsxs(_components.p,{children:[`Go to `,_jsx(_components.strong,{children:`Integrations`}),`, filter to the `,_jsx(_components.strong,{children:`Loyalty`}),` category, and choose\n`,_jsx(_components.strong,{children:`Connect`}),` on Rivo or Yotpo Loyalty \u0026 Referrals.`]})}),_jsx(Step,{title:`Enter the credentials`,children:_jsx(_components.p,{children:`Rivo needs your Developer Toolkit key. Yotpo Loyalty needs both the API key\nand the GUID shown beside it. Both are required, unlike the reviews apps.`})}),_jsx(Step,{title:`Add the webhook in the loyalty app`,children:_jsxs(_components.p,{children:[`Senderz shows you a webhook address and a signing secret. In Rivo, open\n`,_jsx(_components.strong,{children:`Developer Toolkit → Webhooks`}),`. In Yotpo Loyalty, open the webhook\nsettings. Subscribe to points, redemption, tier, referral and expiry events,\nthen save.`]})})]}),`\n`,_jsxs(_components.p,{children:[`The loyalty credential is not only for reading. It is also what lets the `,_jsx(_components.strong,{children:`Grant points`}),` automation step write points back, so keep it valid.`]}),`\n`,_jsx(Heading,{level:`2`,id:`the-webhook-address-and-the-signing-key`,children:`The webhook address and the signing key`}),`\n`,_jsx(_components.p,{children:`For every vendor except Judge.me, connecting produces two things.`}),`\n`,_jsx(ParamField,{path:`Webhook address`,type:`URL`,id:`param-webhook-address`,children:_jsx(_components.p,{children:`The full address to paste into the vendor’s dashboard. It already contains\nyour workspace ID and, for the vendors that check a shared key, the key\nitself. Paste it exactly as shown.`})}),`\n`,_jsx(ParamField,{path:`Signing key`,type:`string`,id:`param-signing-key`,children:_jsx(_components.p,{children:`Shown once, immediately after connecting. Use it only if the vendor’s\ndashboard has its own separate field for a signing or validation key.`})}),`\n`,_jsx(_components.p,{children:`The address looks like this, with your own workspace ID in place:`}),`\n`,_jsx(CodeBlock,{numberOfLines:`3`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`3`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`POST https://api.senderz.app/api/v1/integrations/reviews/inbound/loox/{workspaceId}?secret=…`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`POST https://api.senderz.app/api/v1/integrations/loyalty/inbound/rivo/{workspaceId}?secret=…`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsx(Warning,{children:_jsx(_components.p,{children:`Copy the key before you close the dialog. It is never shown again. If you lose\nit, connect again: that mints a new key and replaces the old one, which means\nyou must update the webhook in the vendor’s dashboard too.`})}),`\n`,_jsx(Heading,{level:`3`,id:`how-each-vendor-is-verified`,children:`How each vendor is verified`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Vendor`}),_jsx(_components.th,{children:`How Senderz checks the delivery is real`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Judge.me`}),_jsxs(_components.td,{children:[`A signature header, `,_jsx(_components.code,{children:`judgeme-hmac-sha256`}),` (also accepted as `,_jsx(_components.code,{children:`x-judgeme-hmac-sha256`}),`), a hex HMAC-SHA256 of the raw body keyed by your private API token, plus a check that the `,_jsx(_components.code,{children:`shop_domain`}),` in the body is the store you connected`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Loox`}),_jsxs(_components.td,{children:[`The key in the address, or a matching header such as `,_jsx(_components.code,{children:`x-loox-signature`}),` or `,_jsx(_components.code,{children:`x-loox-validation-key`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Yotpo Reviews`}),_jsxs(_components.td,{children:[`The key in the address, or a matching `,_jsx(_components.code,{children:`x-yotpo-token`}),` header`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Yotpo Loyalty`}),_jsxs(_components.td,{children:[`The key in the address, or a matching `,_jsx(_components.code,{children:`x-yotpo-token`}),` header`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Rivo`}),_jsxs(_components.td,{children:[`A signature header only: `,_jsx(_components.code,{children:`x-rivo-hmac-sha256`}),`, computed from the body using the signing secret`]})]})]})]}),`\n`,_jsx(Note,{children:_jsx(_components.p,{children:`Rivo is the exception worth reading twice. Senderz checks a signature header\nfor Rivo and ignores the key sitting in the address, so you must set the\nsigning secret inside Rivo as well. The address carries the same value only so\nyou can copy it from one place. If Rivo sends no signature header, the\ndelivery is rejected.`})}),`\n`,_jsx(_components.p,{children:`Senderz reads the event name from a topic header when the vendor sends one, and otherwise from the event name inside the payload, so both styles work.`}),`\n`,_jsx(Heading,{level:`2`,id:`turn-off-the-vendor’s-own-emails`,children:`Turn off the vendor’s own emails`}),`\n`,_jsx(_components.p,{children:`This is the step merchants skip, and the result is customers receiving two of everything.`}),`\n`,_jsxs(AccordionGroup,{children:[_jsx(Accordion,{title:`Judge.me keeps sending its own review requests until you turn them off`,icon:`triangle-exclamation`,id:`judge-me-keeps-sending-its-own-review-requests-until-you-turn-them-off`,children:_jsxs(_components.p,{children:[`Judge.me does not know Senderz is connected, so its own review request\nemails keep going out. In Judge.me go to `,_jsx(_components.strong,{children:`Settings → Request scheduling`}),`\nand untick `,_jsx(_components.strong,{children:`Send requests`}),` for domestic, international and POS orders, or\ncustomers will get two requests. Send your review requests from a Senderz\nautomation instead (see below). Judge.me only switches its own emails off\nautomatically for its built-in Klaviyo trigger, which does not apply here.`]})}),_jsx(Accordion,{title:`Loox keeps sending some emails`,icon:`triangle-exclamation`,id:`loox-keeps-sending-some-emails`,children:_jsx(_components.p,{children:`Loox stops its review request and reminder emails, but thank you, photo and\nvideo reminder, and discount reminder emails keep going out. Turn those off\nin Loox if you plan to rebuild them in Senderz.`})}),_jsx(Accordion,{title:`Yotpo Reviews does not stop anything by itself`,icon:`triangle-exclamation`,id:`yotpo-reviews-does-not-stop-anything-by-itself`,children:_jsxs(_components.p,{children:[`In Yotpo go to `,_jsx(_components.strong,{children:`Emails → Email setup → Review request email`}),` and\ndeactivate it, or customers will get two requests.`]})}),_jsx(Accordion,{title:`Rivo and Yotpo Loyalty`,icon:`triangle-exclamation`,id:`rivo-and-yotpo-loyalty`,children:_jsx(_components.p,{children:`Turn off the matching loyalty notification emails in the vendor before you\npublish the equivalent automation in Senderz, or customers can receive both\nmessages.`})})]}),`\n`,_jsx(Heading,{level:`2`,id:`the-shared-event-vocabulary`,children:`The shared event vocabulary`}),`\n`,_jsx(_components.p,{children:`Whatever vendor sent it, activity is stored under one of these names. This is what makes an automation survive a vendor switch.`}),`\n`,_jsx(Heading,{level:`3`,id:`reviews`,children:`Reviews`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Event on the contact`}),_jsx(_components.th,{children:`What it means`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Review request ready`}),_jsx(_components.td,{children:`The reviews app says it is time to ask this person for a review`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Review submitted`}),_jsx(_components.td,{children:`A review was submitted, published or not`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Review approved`}),_jsx(_components.td,{children:`The review went live on the store. Fires once per review: together with the submitted event when the app publishes on submission, or later when the store owner approves it`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Question or answer`}),_jsx(_components.td,{children:`A product question was asked or answered`})]})]})]}),`\n`,_jsx(Note,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Judge.me has a store-owner approval step the other apps do not.`}),` A review\ncan sit unpublished for days, or be rejected. That is why the approval is its\nown event: a thank you built on `,_jsx(_components.strong,{children:`Review approved`}),` only ever reaches people\nwhose review you actually published, and a negative-review alert built on\n`,_jsx(_components.strong,{children:`Review submitted`}),` still fires the moment a one-star review lands, published\nor not. Approving a review in Judge.me also marks the earlier submitted event\nas published, so a segment on published reviews stays accurate.`]})}),`\n`,_jsx(Note,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Judge.me does not send “Review request ready”.`}),` Its own timing engine has\nno webhook, so build the request yourself: start an automation from `,_jsx(_components.strong,{children:`Fulfilled\norder`}),` or `,_jsx(_components.strong,{children:`Shipment delivered`}),`, add a wait step for the number of days you\nwant, then send the email and link to the product page where the Judge.me\nreview form lives. Add a second email that only sends if the contact has not\nsubmitted a review since the automation started, using the `,_jsx(_components.strong,{children:`Submitted a\nreview`}),` event condition with the “since starting this flow” timeframe.`]})}),`\n`,_jsx(Heading,{level:`3`,id:`loyalty`,children:`Loyalty`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Event on the contact`}),_jsx(_components.th,{children:`What it means`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Points earned`}),_jsx(_components.td,{children:`The contact earned points`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Points expiring`}),_jsx(_components.td,{children:`The contact’s points are about to expire`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Loyalty tier changed`}),_jsx(_components.td,{children:`The contact moved to a different tier`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Reward redeemed`}),_jsx(_components.td,{children:`The contact redeemed points for a reward`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Referral activity`}),_jsx(_components.td,{children:`A referral was shared, claimed or completed`})]})]})]}),`\n`,_jsx(_components.p,{children:`Rivo also sends a profile update that carries no event. Senderz uses it to refresh the contact’s loyalty fields quietly, with no timeline entry and no automation.`}),`\n`,_jsx(Heading,{level:`2`,id:`what-lands-on-the-contact`,children:`What lands on the contact`}),`\n`,_jsx(_components.p,{children:`Open a contact and you will see the activity in the timeline, plus a set of properties that Senderz keeps up to date.`}),`\n`,_jsxs(AccordionGroup,{children:[_jsxs(Accordion,{title:`After a review is submitted`,icon:`star`,id:`after-a-review-is-submitted`,children:[_jsx(_components.p,{children:`Senderz maintains a running summary on the contact:`}),_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Review count`}),`, incremented on each submitted review`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Avg review rating`}),`, a running average across the reviews that carried a rating`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Has left review media`}),`, true once the contact submits a review with a photo or video`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Last review at`}),`, the time of the most recent review`]}),`\n`]}),_jsx(_components.p,{children:`Re-delivery of the same webhook does not double count.`})]}),_jsxs(Accordion,{title:`After loyalty activity`,icon:`gift`,id:`after-loyalty-activity`,children:[_jsx(_components.p,{children:`Senderz stores the latest snapshot the vendor sent:`}),_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Membership tier`}),` and `,_jsx(_components.strong,{children:`Total points`})]}),`\n`,_jsx(_components.li,{children:`Credit balance, next tier and what is needed to reach it`}),`\n`,_jsx(_components.li,{children:`Referral URL`}),`\n`,_jsx(_components.li,{children:`Expiring points and the date they expire`}),`\n`,_jsx(_components.li,{children:`Whether the contact has opted in to the loyalty programme`}),`\n`]}),_jsx(_components.p,{children:`Values are only ever overwritten by a newer webhook, so the profile matches\nthe vendor.`})]}),_jsx(Accordion,{title:`Product details on a review event`,icon:`box`,id:`product-details-on-a-review-event`,children:_jsx(_components.p,{children:`A review event also carries the product it was about, including the product\nID, title, image and the link to the review, so the timeline entry is\nrecognisable.`})})]}),`\n`,_jsx(Info,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`No consent is ever changed by a review or loyalty event.`}),` If the person is\nnot already a contact, Senderz creates one with no marketing consent on any\nchannel, so they receive nothing until they opt in somewhere. Reviewing a\nproduct is not permission to email someone. See\n`,_jsx(_components.a,{href:`/en/audience/consent`,children:`Consent`}),`.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`automations-these-unlock`,children:`Automations these unlock`}),`\n`,_jsxs(_components.p,{children:[`Each event is a trigger you can pick in the automation builder, under the `,_jsx(_components.strong,{children:`Reviews`}),` and `,_jsx(_components.strong,{children:`Loyalty \u0026 referrals`}),` categories.`]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Trigger`}),_jsx(_components.th,{children:`Fires when`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Review request ready`}),_jsx(_components.td,{children:`A reviews app says it is time to ask for a review`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Submitted a review`}),_jsx(_components.td,{children:`A contact submits a product review`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Review approved`}),_jsx(_components.td,{children:`A review is approved and goes live on the store`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Asked or answered a question`}),_jsx(_components.td,{children:`A contact asks or answers a product question`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Earned loyalty points`}),_jsx(_components.td,{children:`A contact earns loyalty points`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Points expiring soon`}),_jsx(_components.td,{children:`A contact’s points are about to expire`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Loyalty tier changed`}),_jsx(_components.td,{children:`A contact moves to a different loyalty tier`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Redeemed a reward`}),_jsx(_components.td,{children:`A contact redeems points for a reward`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Referral activity`}),_jsx(_components.td,{children:`A referral is shared, claimed, or completed`})]})]})]}),`\n`,_jsx(Heading,{level:`3`,id:`filtering-the-trigger`,children:`Filtering the trigger`}),`\n`,_jsx(_components.p,{children:`Every trigger accepts filters on the details of the event itself, so one automation can branch on what happened.`}),`\n`,_jsxs(Tabs,{children:[_jsxs(Tab,{title:`Review triggers`,id:`review-triggers`,children:[_jsxs(_components.p,{children:[`Available filters: `,_jsx(_components.strong,{children:`rating`}),`, `,_jsx(_components.strong,{children:`has photo`}),`, `,_jsx(_components.strong,{children:`has video`}),`, `,_jsx(_components.strong,{children:`published`}),`,\n`,_jsx(_components.strong,{children:`verified buyer`}),`, `,_jsx(_components.strong,{children:`product id`}),`, `,_jsx(_components.strong,{children:`qa kind`}),` and `,_jsx(_components.strong,{children:`vendor`}),`.`]}),_jsx(_components.p,{children:`Practical uses:`}),_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`Send a thank you and a coupon only when the rating is 4 or 5, and route 1 to 3 to a support follow-up`}),`\n`,_jsx(_components.li,{children:`Reward a photo or video review more generously than a text review`}),`\n`,_jsxs(_components.li,{children:[`Send “your review is live” from the `,_jsx(_components.strong,{children:`Review approved`}),` trigger, so it waits for the store owner’s approval on Judge.me and still fires on submission for apps that publish immediately`]}),`\n`,_jsxs(_components.li,{children:[`Tell a question apart from an answer using `,_jsx(_components.strong,{children:`qa kind`})]}),`\n`]})]}),_jsxs(Tab,{title:`Loyalty triggers`,id:`loyalty-triggers`,children:[_jsxs(_components.p,{children:[`Available filters: `,_jsx(_components.strong,{children:`points`}),`, `,_jsx(_components.strong,{children:`tier`}),`, `,_jsx(_components.strong,{children:`reason`}),`, `,_jsx(_components.strong,{children:`stage`}),`,\n`,_jsx(_components.strong,{children:`referral kind`}),` and `,_jsx(_components.strong,{children:`vendor`}),`.`]}),_jsx(_components.p,{children:`Practical uses:`}),_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`Treat a move into your top tier differently from a move into the first tier`}),`\n`,_jsxs(_components.li,{children:[`Split the expiry reminder between an early warning and a last chance using `,_jsx(_components.strong,{children:`stage`})]}),`\n`,_jsxs(_components.li,{children:[`Send one message to the referrer and another to the friend using `,_jsx(_components.strong,{children:`referral kind`})]}),`\n`,_jsx(_components.li,{children:`Only celebrate a points event above a threshold`}),`\n`]})]})]}),`\n`,_jsx(_components.p,{children:`The same values are available as merge tags inside the message that automation sends, so you can write the rating, tier, points or reward name directly into the copy.`}),`\n`,_jsx(Heading,{level:`3`,id:`grant-points-back-to-the-loyalty-app`,children:`Grant points back to the loyalty app`}),`\n`,_jsxs(_components.p,{children:[`The automation builder has a `,_jsx(_components.strong,{children:`Grant points`}),` step. It writes to the loyalty app rather than reading from it.`]}),`\n`,_jsx(ParamField,{path:`Loyalty app`,type:`select`,id:`param-loyalty-app`,children:_jsx(_components.p,{children:`Rivo or Yotpo Loyalty \u0026 Referrals. Only apps you have connected are offered.`})}),`\n`,_jsx(ParamField,{path:`Points adjustment`,type:`number`,id:`param-points-adjustment`,children:_jsx(_components.p,{children:`A positive number grants points. A negative number removes them.`})}),`\n`,_jsx(ParamField,{path:`Customer history title`,type:`string`,id:`param-customer-history-title`,children:_jsx(_components.p,{children:`The line the customer sees in their points history in the loyalty app.`})}),`\n`,_jsx(ParamField,{path:`Send email from Senderz only`,type:`toggle`,default:`on`,id:`param-send-email-from-senderz-only`,children:_jsx(_components.p,{children:`Stops Rivo sending a parallel points email. Yotpo does not accept this\ninstruction, so disable the matching Yotpo notification inside Yotpo.`})}),`\n`,_jsx(Note,{children:_jsx(_components.p,{children:`The step needs the contact to have an email address, because that is how both\nvendors identify a member. Contacts without one are skipped and the automation\ncarries on to the next step. A contact never receives the same grant twice,\neven if the step is retried.`})}),`\n`,_jsx(Heading,{level:`2`,id:`segments-these-unlock`,children:`Segments these unlock`}),`\n`,_jsx(_components.p,{children:`Two event conditions are available in the segment builder.`}),`\n`,_jsxs(AccordionGroup,{children:[_jsxs(Accordion,{title:`Submitted a review`,icon:`star`,id:`submitted-a-review`,children:[_jsxs(_components.p,{children:[`Filter on `,_jsx(_components.strong,{children:`product id`}),`, `,_jsx(_components.strong,{children:`rating`}),`, `,_jsx(_components.strong,{children:`has photo`}),`, `,_jsx(_components.strong,{children:`has video`}),`,\n`,_jsx(_components.strong,{children:`published`}),`, `,_jsx(_components.strong,{children:`verified buyer`}),` and `,_jsx(_components.strong,{children:`vendor`}),`, combined with a count and a\ntimeframe.`]}),_jsx(_components.p,{children:`This is how you build an ambassadors segment: people who submitted a\nfour-star-or-better review with a photo in the last 90 days.`})]}),_jsx(Accordion,{title:`Earned loyalty points`,icon:`gift`,id:`earned-loyalty-points`,children:_jsxs(_components.p,{children:[`Counts points-earning events in a timeframe. This condition has no\nparameters, so you can filter on how many times and how recently, but not on\nthe number of points in each event. To segment on a balance, use the\n`,_jsx(_components.strong,{children:`Total points`}),` contact field instead.`]})})]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Membership tier`}),` and `,_jsx(_components.strong,{children:`Total points`}),` are recognised contact fields, so they appear in `,_jsx(_components.strong,{children:`Settings → Contact Fields`}),` under Loyalty and can be used directly as segment filters once loyalty data has arrived.`]}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[`The review summary fields are a known gap. `,_jsx(_components.strong,{children:`Review count`}),`, `,_jsx(_components.strong,{children:`Avg review\nrating`}),`, `,_jsx(_components.strong,{children:`Has left review media`}),` and `,_jsx(_components.strong,{children:`Last review at`}),` are written to the\ncontact and visible on the profile, but they are not offered in the segment\nfield picker. The similarly named `,_jsx(_components.strong,{children:`Total reviews`}),`, `,_jsx(_components.strong,{children:`Average review score`}),`\nand `,_jsx(_components.strong,{children:`Last review`}),` fields in the picker are separate fields that no\nintegration writes, so a segment built on them returns nobody. Use the\n`,_jsx(_components.strong,{children:`Submitted a review`}),` event condition instead.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`forwarding-to-your-own-systems`,children:`Forwarding to your own systems`}),`\n`,_jsxs(_components.p,{children:[`Every review and loyalty event can also be forwarded to a URL of yours, set up in `,_jsx(_components.strong,{children:`Settings → Webhooks`}),`.`]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsx(_components.tr,{children:_jsx(_components.th,{children:`Event you can subscribe to`})})}),_jsxs(_components.tbody,{children:[_jsx(_components.tr,{children:_jsx(_components.td,{children:_jsx(_components.code,{children:`review.request_ready`})})}),_jsx(_components.tr,{children:_jsx(_components.td,{children:_jsx(_components.code,{children:`review.submitted`})})}),_jsx(_components.tr,{children:_jsx(_components.td,{children:_jsx(_components.code,{children:`review.approved`})})}),_jsx(_components.tr,{children:_jsx(_components.td,{children:_jsx(_components.code,{children:`review.question`})})}),_jsx(_components.tr,{children:_jsx(_components.td,{children:_jsx(_components.code,{children:`review.answer`})})}),_jsx(_components.tr,{children:_jsx(_components.td,{children:_jsx(_components.code,{children:`loyalty.points_earned`})})}),_jsx(_components.tr,{children:_jsx(_components.td,{children:_jsx(_components.code,{children:`loyalty.points_expiring`})})}),_jsx(_components.tr,{children:_jsx(_components.td,{children:_jsx(_components.code,{children:`loyalty.tier_changed`})})}),_jsx(_components.tr,{children:_jsx(_components.td,{children:_jsx(_components.code,{children:`loyalty.redemption`})})}),_jsx(_components.tr,{children:_jsx(_components.td,{children:_jsx(_components.code,{children:`loyalty.referral`})})})]})]}),`\n`,_jsxs(_components.p,{children:[`See `,_jsx(_components.a,{href:`/en/integrations/webhooks-outbound`,children:`Outbound webhooks`}),` for the payload shape and how deliveries are signed and retried.`]}),`\n`,_jsx(Heading,{level:`2`,id:`disconnecting`,children:`Disconnecting`}),`\n`,_jsxs(_components.p,{children:[`Choose `,_jsx(_components.strong,{children:`Disconnect`}),` on the tile. Senderz stops accepting events from that vendor and deletes the stored signing key.`]}),`\n`,_jsx(Warning,{children:_jsx(_components.p,{children:`For Loox and Yotpo, Senderz does not remove the webhook from the vendor’s\ndashboard. The vendor keeps sending, and every delivery is answered with a\n“not connected” response and discarded. Remove the webhook in the vendor’s\ndashboard yourself to stop the traffic. For Judge.me, Senderz removes the\nwebhooks it registered as part of disconnecting.`})}),`\n`,_jsx(_components.p,{children:`Reconnecting later creates a new signing key. Update the webhook in the vendor’s dashboard to match, or deliveries will start failing verification.`}),`\n`,_jsx(Heading,{level:`2`,id:`when-events-stop-arriving`,children:`When events stop arriving`}),`\n`,_jsxs(AccordionGroup,{children:[_jsx(Accordion,{title:`Nothing has ever arrived`,icon:`circle-question`,id:`nothing-has-ever-arrived`,children:_jsx(_components.p,{children:`The second half of the setup is almost always the cause. Confirm the webhook\nexists in the vendor’s dashboard, that it points at the exact address Senderz\ngave you, and that it is subscribed to the right events. Judge.me is the only\nvendor where this step is done for you.`})}),_jsxs(Accordion,{title:`It worked and then stopped`,icon:`circle-question`,id:`it-worked-and-then-stopped`,children:[_jsx(_components.p,{children:`Check whether the integration was reconnected. Reconnecting mints a new\nsigning key, and the old address in the vendor’s dashboard stops verifying.\nCopy the new address and key across.`}),_jsx(_components.p,{children:`For Judge.me, check whether the private API token was rotated. That token is\nthe signing key.`})]}),_jsx(Accordion,{title:`Rivo deliveries are rejected`,icon:`circle-question`,id:`rivo-deliveries-are-rejected`,children:_jsx(_components.p,{children:`Rivo is verified by a signature header, not by the key in the address. Set\nthe signing secret inside Rivo so it signs each delivery.`})}),_jsx(Accordion,{title:`Reviews arrive but the automation never runs`,icon:`circle-question`,id:`reviews-arrive-but-the-automation-never-runs`,children:_jsxs(_components.p,{children:[`Check the trigger filters. A filter on `,_jsx(_components.strong,{children:`published`}),` will hold everything\nback until the review is published in the reviews app, and a rating filter\nexcludes any review that arrived without a rating value.`]})}),_jsx(Accordion,{title:`A review arrived but no contact was created`,icon:`circle-question`,id:`a-review-arrived-but-no-contact-was-created`,children:_jsx(_components.p,{children:`Senderz needs an email address or a phone number to identify the reviewer. A\npayload carrying neither is discarded.`})})]}),`\n`,_jsx(Heading,{level:`2`,id:`not-available-yet`,children:`Not available yet`}),`\n`,_jsx(_components.p,{children:`Stated plainly so you can plan around it.`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`No history import.`}),` There is no backfill of past reviews, past points or past tiers. Only new activity counts.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`No review content block.`}),` The reviews block in the email builder is a static list you type yourself. It does not pull live reviews from a connected app.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`No reviews or loyalty dashboard.`}),` These events do not appear in analytics or revenue reporting. The contact timeline and segment counts are the record.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Limited loyalty segmentation.`}),` Membership tier and total points are filterable. Credit balance, next tier, referral URL and expiry fields are stored on the contact but are not offered in the segment field picker.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Review summary fields are not filterable.`}),` See the warning above.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`No points write-back for reviews apps.`}),` Only loyalty apps accept a write, through the `,_jsx(_components.strong,{children:`Grant points`}),` step.`]}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`related`,children:`Related`}),`\n`,_jsxs(CardGroup,{cols:2,children:[_jsx(Card,{title:`Automation triggers`,icon:`bolt`,href:`/en/messaging/flows/triggers`,children:_jsx(_components.p,{children:`Every trigger, including trigger filters and re-entry rules.`})}),_jsx(Card,{title:`Segments`,icon:`filter`,href:`/en/audience/segments`,children:_jsx(_components.p,{children:`Building segments from events and contact fields.`})}),_jsx(Card,{title:`Inbound webhooks`,icon:`arrow-right-to-bracket`,href:`/en/integrations/webhooks-inbound`,children:_jsx(_components.p,{children:`Every inbound address, who provisions it, and how deliveries are verified.`})}),_jsx(Card,{title:`Outbound webhooks`,icon:`arrow-right-from-bracket`,href:`/en/integrations/webhooks-outbound`,children:_jsx(_components.p,{children:`Forwarding review and loyalty events to your own systems.`})})]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"codeStyling":"system","config":{},"pageMetadata":{"title":"Reviews and loyalty apps","description":"Connect Loox, Judge.me, Yotpo Reviews, Rivo or Yotpo Loyalty so review and loyalty activity starts automations, lands on the contact profile and feeds segments.","icon":"star","href":"/en/integrations/reviews-and-loyalty"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"What is live today","slug":"what-is-live-today","depth":2,"children":[]},{"title":"Connect a reviews app","slug":"connect-a-reviews-app","depth":2,"children":[{"title":"Where each credential comes from","slug":"where-each-credential-comes-from","depth":3,"children":[]}]},{"title":"Connect a loyalty app","slug":"connect-a-loyalty-app","depth":2,"children":[]},{"title":"The webhook address and the signing key","slug":"the-webhook-address-and-the-signing-key","depth":2,"children":[{"title":"How each vendor is verified","slug":"how-each-vendor-is-verified","depth":3,"children":[]}]},{"title":"Turn off the vendor’s own emails","slug":"turn-off-the-vendor’s-own-emails","depth":2,"children":[]},{"title":"The shared event vocabulary","slug":"the-shared-event-vocabulary","depth":2,"children":[{"title":"Reviews","slug":"reviews","depth":3,"children":[]},{"title":"Loyalty","slug":"loyalty","depth":3,"children":[]}]},{"title":"What lands on the contact","slug":"what-lands-on-the-contact","depth":2,"children":[]},{"title":"Automations these unlock","slug":"automations-these-unlock","depth":2,"children":[{"title":"Filtering the trigger","slug":"filtering-the-trigger","depth":3,"children":[]},{"title":"Grant points back to the loyalty app","slug":"grant-points-back-to-the-loyalty-app","depth":3,"children":[]}]},{"title":"Segments these unlock","slug":"segments-these-unlock","depth":2,"children":[]},{"title":"Forwarding to your own systems","slug":"forwarding-to-your-own-systems","depth":2,"children":[]},{"title":"Disconnecting","slug":"disconnecting","depth":2,"children":[]},{"title":"When events stop arriving","slug":"when-events-stop-arriving","depth":2,"children":[]},{"title":"Not available yet","slug":"not-available-yet","depth":2,"children":[]},{"title":"Related","slug":"related","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"subdomain":"senderz","siteName":"Senderz","title":"Reviews and loyalty apps - Senderz","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{"he":{"href":"/he/getting-started/introduction","matchLevel":4},"en":{"href":"/en/integrations/reviews-and-loyalty","matchLevel":0}}},"lastModified":"2026-10-04T17:59:10.073Z","originalFileLocation":"en/integrations/reviews-and-loyalty.mdx","locale":"en"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"light\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Connect Loox, Judge.me, Yotpo Reviews, Rivo or Yotpo Loyalty so review and loyalty activity starts automations, lands on the contact profile and feeds segments.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Senderz\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/senderz/i8tUhenf4EX6qIDZ/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/senderz/i8tUhenf4EX6qIDZ/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/senderz/i8tUhenf4EX6qIDZ/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/senderz/i8tUhenf4EX6qIDZ/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/senderz/i8tUhenf4EX6qIDZ/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/senderz/i8tUhenf4EX6qIDZ/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/senderz/i8tUhenf4EX6qIDZ/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/senderz/i8tUhenf4EX6qIDZ/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/senderz/i8tUhenf4EX6qIDZ/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Reviews and loyalty apps - Senderz\">\u003cmeta data-mint-head property=\"og:description\" content=\"Connect Loox, Judge.me, Yotpo Reviews, Rivo or Yotpo Loyalty so review and loyalty activity starts automations, lands on the contact profile and feeds segments.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Senderz\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.senderz.app/en/integrations/reviews-and-loyalty\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://senderz.mintlify.site/_mintlify/api/og/v2?division=E-commerce\u0026amp;title=Reviews+and+loyalty+apps\u0026amp;description=Connect+Loox%2C+Judge.me%2C+Yotpo+Reviews%2C+Rivo+or+Yotpo+Loyalty+so+review+and+loyalty+activity+starts+automations%2C+lands+on+the+contact+profile+and+feeds+segments.\u0026amp;theme=5f67aa4bce0831aa15b0a1ff\u0026amp;signature=caa9aa489baab6801b8cb85b4cc53ba5824b1b62d4a7bb0a60f89549144d27a5\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Reviews and loyalty apps - Senderz\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Connect Loox, Judge.me, Yotpo Reviews, Rivo or Yotpo Loyalty so review and loyalty activity starts automations, lands on the contact profile and feeds segments.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://senderz.mintlify.site/_mintlify/api/og/v2?division=E-commerce\u0026amp;title=Reviews+and+loyalty+apps\u0026amp;description=Connect+Loox%2C+Judge.me%2C+Yotpo+Reviews%2C+Rivo+or+Yotpo+Loyalty+so+review+and+loyalty+activity+starts+automations%2C+lands+on+the+contact+profile+and+feeds+segments.\u0026amp;theme=5f67aa4bce0831aa15b0a1ff\u0026amp;signature=caa9aa489baab6801b8cb85b4cc53ba5824b1b62d4a7bb0a60f89549144d27a5\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/senderz/i8tUhenf4EX6qIDZ/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Senderz\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#141414\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.senderz.app/en/integrations/reviews-and-loyalty\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/en/integrations/reviews-and-loyalty.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.senderz.app/#organization\",\"name\":\"Senderz\",\"url\":\"https://docs.senderz.app\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/senderz/TYfOlOCqzxvvnafR/logo/logo-light.png?fit=max\u0026auto=format\u0026n=TYfOlOCqzxvvnafR\u0026q=85\u0026s=716b2d481f50aa8a6539edb6be85247f\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.senderz.app#website\",\"name\":\"Senderz\",\"url\":\"https://docs.senderz.app\",\"publisher\":{\"@id\":\"https://docs.senderz.app/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.senderz.app/en/integrations/reviews-and-loyalty#webpage\",\"url\":\"https://docs.senderz.app/en/integrations/reviews-and-loyalty\",\"name\":\"Reviews and loyalty apps\",\"description\":\"Connect Loox, Judge.me, Yotpo Reviews, Rivo or Yotpo Loyalty so review and loyalty activity starts automations, lands on the contact profile and feeds segments.\",\"dateModified\":\"2026-10-04T17:59:10.073Z\",\"isPartOf\":{\"@id\":\"https://docs.senderz.app#website\"},\"breadcrumb\":{\"@id\":\"https://docs.senderz.app/en/integrations/reviews-and-loyalty#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.senderz.app/en/integrations/reviews-and-loyalty#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"E-commerce\",\"item\":\"https://docs.senderz.app/en/integrations/shopify\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Reviews and loyalty apps\",\"item\":\"https://docs.senderz.app/en/integrations/reviews-and-loyalty\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.senderz.app/en/integrations/reviews-and-loyalty#article\",\"headline\":\"Reviews and loyalty apps\",\"name\":\"Reviews and loyalty apps\",\"description\":\"Connect Loox, Judge.me, Yotpo Reviews, Rivo or Yotpo Loyalty so review and loyalty activity starts automations, lands on the contact profile and feeds segments.\",\"url\":\"https://docs.senderz.app/en/integrations/reviews-and-loyalty\",\"mainEntityOfPage\":{\"@id\":\"https://docs.senderz.app/en/integrations/reviews-and-loyalty#webpage\"},\"dateModified\":\"2026-10-04T17:59:10.073Z\",\"publisher\":{\"@id\":\"https://docs.senderz.app/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.senderz.app#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Senderz\",\"publisher\":{\"@type\":\"Organization\",\"name\":\"Senderz\"},\"provider\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","agentPointerHref":"/en/integrations/reviews-and-loyalty.md","siteName":"Senderz","nav":{"global":null,"languages":[{"language":"he","default":true,"pages":[{"title":"he","href":"/he/getting-started/introduction"}]},{"language":"en","tabs":[{"tab":"Guides","pages":[{"title":"Guides","href":"/en/getting-started/introduction"}]},{"tab":"Integrations","groups":[{"group":"Overview","pages":[{"title":"Integrations overview","icon":"plug","href":"/en/integrations/overview"}]},{"group":"E-commerce","pages":[{"title":"Shopify","icon":"shopify","href":"/en/integrations/shopify"},{"title":"WooCommerce","icon":"wordpress","href":"/en/integrations/woocommerce"},{"title":"Konimbo","icon":"store","href":"/en/integrations/konimbo"},{"title":"Magento 2","icon":"store","href":"/en/integrations/magento"},{"title":"Wix","icon":"store","href":"/en/integrations/wix"},{"title":"WordPress","icon":"wordpress","href":"/en/integrations/wordpress"},{"title":"Payments and invoicing","description":"Stripe, Tranzila, iCount, Green Invoice and EZcount: what each one contributes today, how the connection works, and which parts you cannot reach from the app yet.","icon":"credit-card","href":"/en/integrations/payments-and-invoicing"},{"title":"Reviews and loyalty apps","icon":"star","href":"/en/integrations/reviews-and-loyalty"}]},{"group":"Automation \u0026 no-code","pages":[{"title":"Make","description":"Run Senderz automations from Make, using the Senderz app or plain HTTP modules over the public API.","icon":"puzzle-piece","href":"/en/integrations/make"},{"title":"Outbound webhooks","icon":"arrow-right-from-bracket","href":"/en/integrations/webhooks-outbound"},{"title":"Inbound webhooks","icon":"arrow-right-to-bracket","href":"/en/integrations/webhooks-inbound"},{"title":"Embedded forms","icon":"input-text","href":"/en/integrations/embedded-forms"},{"title":"Import from Google Sheets","icon":"table","href":"/en/integrations/google-sheets"}]},{"group":"Advertising","pages":[{"title":"Meta audiences","icon":"facebook","href":"/en/integrations/meta-audiences"},{"title":"Google Customer Match","icon":"google","href":"/en/integrations/google-customer-match"}]},{"group":"AI","pages":[{"title":"AI provider (your API key)","icon":"wand-magic-sparkles","href":"/en/integrations/ai-provider"},{"title":"MCP server (AI assistant access)","icon":"plug","href":"/en/integrations/mcp"}]}]},{"tab":"API reference","pages":[{"title":"API reference","href":"/en/api-reference/introduction"}]}]}]},"basePath":"","title":"Reviews and loyalty apps - Senderz","buildId":"dpl_8hoxaqFTU7hTr6A2fUraxAyjuiZo","deploymentId":"dpl_8hoxaqFTU7hTr6A2fUraxAyjuiZo","dynamics":[],"chunks":[]}