> ## Documentation Index
> Fetch the complete documentation index at: https://docs.senderz.app/llms.txt
> Use this file to discover all available pages before exploring further.

# Reviews and loyalty apps

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

## What is live today

<CardGroup cols={2}>
  <Card title="Judge.me" icon="star">
    Reviews. Senderz registers the webhooks in Judge.me for you.
  </Card>

  <Card title="Loox" icon="star">
    Reviews. You paste a webhook address into Loox.
  </Card>

  <Card title="Yotpo Reviews" icon="star">
    Reviews. You paste a webhook address into Yotpo.
  </Card>

  <Card title="Rivo" icon="gift">
    Loyalty, referrals and points. You paste a webhook address into Rivo.
  </Card>

  <Card title="Yotpo Loyalty & Referrals" icon="gift">
    Loyalty, referrals and points. You paste a webhook address into Yotpo.
  </Card>
</CardGroup>

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.

<Warning>
  **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.
</Warning>

## Connect a reviews app

<Steps>
  <Step title="Open the tile">
    Go to **Integrations**, filter to the **Reviews** category, and choose
    **Connect** on Judge.me, Loox or Yotpo Reviews.
  </Step>

  <Step title="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.
  </Step>

  <Step title="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.
  </Step>
</Steps>

### Where each credential comes from

<AccordionGroup>
  <Accordion title="Judge.me" icon="star">
    You need your shop domain, for example `your-store.myshopify.com`, and a
    Judge.me private API token from your Judge.me account.

    Senderz calls Judge.me with that token and registers two webhooks pointing
    at your workspace address: review created and review updated. 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.
  </Accordion>

  <Accordion title="Loox" icon="star">
    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.
  </Accordion>

  <Accordion title="Yotpo Reviews" icon="star">
    No credential is required. After connecting, open your Yotpo webhook
    settings, add the address Senderz gives you, and subscribe it to review
    events.
  </Accordion>
</AccordionGroup>

## Connect a loyalty app

<Steps>
  <Step title="Open the tile">
    Go to **Integrations**, filter to the **Loyalty** category, and choose
    **Connect** on Rivo or Yotpo Loyalty & Referrals.
  </Step>

  <Step title="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.
  </Step>

  <Step title="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.
  </Step>
</Steps>

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 webhook address and the signing key

For every vendor except Judge.me, connecting produces two things.

<ParamField path="Webhook address" type="URL">
  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.
</ParamField>

<ParamField path="Signing key" type="string">
  Shown once, immediately after connecting. Use it only if the vendor's
  dashboard has its own separate field for a signing or validation key.
</ParamField>

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=…
```

<Warning>
  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.
</Warning>

### How each vendor is verified

| Vendor        | How Senderz checks the delivery is real                                                            |
| ------------- | -------------------------------------------------------------------------------------------------- |
| Judge.me      | A signature header, `x-judgeme-hmac-sha256`, computed from the body using your private API token   |
| 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     |

<Note>
  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.
</Note>

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.

## Turn off the vendor's own emails

This is the step merchants skip, and the result is customers receiving two of everything.

<AccordionGroup>
  <Accordion title="Judge.me stops its own review request emails" icon="circle-check">
    Once this is on, Judge.me turns off its own review request emails
    automatically, so customers will not get two. Your review requests then come
    from Senderz.
  </Accordion>

  <Accordion title="Loox keeps sending some emails" icon="triangle-exclamation">
    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.
  </Accordion>

  <Accordion title="Yotpo Reviews does not stop anything by itself" icon="triangle-exclamation">
    In Yotpo go to **Emails → Email setup → Review request email** and
    deactivate it, or customers will get two requests.
  </Accordion>

  <Accordion title="Rivo and Yotpo Loyalty" icon="triangle-exclamation">
    Turn off the matching loyalty notification emails in the vendor before you
    publish the equivalent automation in Senderz, or customers can receive both
    messages.
  </Accordion>
</AccordionGroup>

## The shared event vocabulary

Whatever vendor sent it, activity is stored under one of these names. This is what makes an automation survive a vendor switch.

### Reviews

| Event on the contact | What it means                                                   |
| -------------------- | --------------------------------------------------------------- |
| Review request ready | The reviews app says it is time to ask this person for a review |
| Review submitted     | A review was submitted                                          |
| Question or answer   | A product question was asked or answered                        |

### Loyalty

| Event on the contact | What it means                               |
| -------------------- | ------------------------------------------- |
| Points earned        | The contact earned points                   |
| Points expiring      | The contact's points are about to expire    |
| Loyalty tier changed | The contact moved to a different tier       |
| Reward redeemed      | The contact redeemed points for a reward    |
| Referral activity    | A referral was shared, claimed or completed |

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.

## What lands on the contact

Open a contact and you will see the activity in the timeline, plus a set of properties that Senderz keeps up to date.

<AccordionGroup>
  <Accordion title="After a review is submitted" icon="star">
    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.
  </Accordion>

  <Accordion title="After loyalty activity" icon="gift">
    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.
  </Accordion>

  <Accordion title="Product details on a review event" icon="box">
    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.
  </Accordion>
</AccordionGroup>

<Info>
  **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](/en/audience/consent).
</Info>

## Automations these unlock

Each event is a trigger you can pick in the automation builder, under the **Reviews** and **Loyalty & referrals** categories.

| Trigger                      | Fires when                                        |
| ---------------------------- | ------------------------------------------------- |
| Review request ready         | A reviews app says it is time to ask for a review |
| Submitted a review           | A contact submits a product review                |
| Asked or answered a question | A contact asks or answers a product question      |
| Earned loyalty points        | A contact earns loyalty points                    |
| Points expiring soon         | A contact's points are about to expire            |
| Loyalty tier changed         | A contact moves to a different loyalty tier       |
| Redeemed a reward            | A contact redeems points for a reward             |
| Referral activity            | A referral is shared, claimed, or completed       |

### Filtering the trigger

Every trigger accepts filters on the details of the event itself, so one automation can branch on what happened.

<Tabs>
  <Tab title="Review 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
    * Only send "your review is live" once the review is published
    * Tell a question apart from an answer using **qa kind**
  </Tab>

  <Tab title="Loyalty triggers">
    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
  </Tab>
</Tabs>

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.

### Grant points back to the loyalty app

The automation builder has a **Grant points** step. It writes to the loyalty app rather than reading from it.

<ParamField path="Loyalty app" type="select">
  Rivo or Yotpo Loyalty & Referrals. Only apps you have connected are offered.
</ParamField>

<ParamField path="Points adjustment" type="number">
  A positive number grants points. A negative number removes them.
</ParamField>

<ParamField path="Customer history title" type="string">
  The line the customer sees in their points history in the loyalty app.
</ParamField>

<ParamField path="Send email from Senderz only" type="toggle" default="on">
  Stops Rivo sending a parallel points email. Yotpo does not accept this
  instruction, so disable the matching Yotpo notification inside Yotpo.
</ParamField>

<Note>
  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.
</Note>

## Segments these unlock

Two event conditions are available in the segment builder.

<AccordionGroup>
  <Accordion title="Submitted a review" icon="star">
    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.
  </Accordion>

  <Accordion title="Earned loyalty points" icon="gift">
    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.
  </Accordion>
</AccordionGroup>

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

<Warning>
  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.
</Warning>

## Forwarding to your own systems

Every review and loyalty event can also be forwarded to a URL of yours, set up in **Settings → Webhooks**.

| Event you can subscribe to |
| -------------------------- |
| `review.request_ready`     |
| `review.submitted`         |
| `review.question`          |
| `review.answer`            |
| `loyalty.points_earned`    |
| `loyalty.points_expiring`  |
| `loyalty.tier_changed`     |
| `loyalty.redemption`       |
| `loyalty.referral`         |

See [Outbound webhooks](/en/integrations/webhooks-outbound) for the payload shape and how deliveries are signed and retried.

## Disconnecting

Choose **Disconnect** on the tile. Senderz stops accepting events from that vendor and deletes the stored signing key.

<Warning>
  Senderz does not remove the webhook from the vendor's dashboard, including the
  webhooks it registered in Judge.me for you. 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.
</Warning>

Reconnecting later creates a new signing key. Update the webhook in the vendor's dashboard to match, or deliveries will start failing verification.

## When events stop arriving

<AccordionGroup>
  <Accordion title="Nothing has ever arrived" icon="circle-question">
    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.
  </Accordion>

  <Accordion title="It worked and then stopped" icon="circle-question">
    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.
  </Accordion>

  <Accordion title="Rivo deliveries are rejected" icon="circle-question">
    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.
  </Accordion>

  <Accordion title="Reviews arrive but the automation never runs" icon="circle-question">
    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.
  </Accordion>

  <Accordion title="A review arrived but no contact was created" icon="circle-question">
    Senderz needs an email address or a phone number to identify the reviewer. A
    payload carrying neither is discarded.
  </Accordion>
</AccordionGroup>

## Not available yet

Stated plainly so you can plan around it.

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

## Related

<CardGroup cols={2}>
  <Card title="Automation triggers" icon="bolt" href="/en/messaging/flows/triggers">
    Every trigger, including trigger filters and re-entry rules.
  </Card>

  <Card title="Segments" icon="filter" href="/en/audience/segments">
    Building segments from events and contact fields.
  </Card>

  <Card title="Inbound webhooks" icon="arrow-right-to-bracket" href="/en/integrations/webhooks-inbound">
    Every inbound address, who provisions it, and how deliveries are verified.
  </Card>

  <Card title="Outbound webhooks" icon="arrow-right-from-bracket" href="/en/integrations/webhooks-outbound">
    Forwarding review and loyalty events to your own systems.
  </Card>
</CardGroup>
