# company-review.submitted

> Sent when a customer submits a company review, with the review, the reviewer's profile and their loyalty standing.

Breadcrumb: Webhooks › company-review.submitted · Updated: 2026-10-18
Docs index: https://docs.cevoid.com/developers/llms.txt

A company review rates your company rather than a product. Use it to route feedback about service and delivery to the team that owns it.

## When it fires

- Once per review, when a customer submits it through a Cevoid review form or widget.
- Reviews imported through the API start no Flows, and past reviews cannot be enrolled later.
- The review can still be waiting for moderation: check `data.company_review.status` before you show it anywhere.
- `profile`, `points` and `tier` describe the reviewer.

## Receive it

In Settings → Flows, choose Create flow → Forward event → Webhook and pick the _Company review submitted_ trigger. See [Set up a webhook](https://docs.cevoid.com/developers/webhooks/set-up.md).

## Payload

```json title="Example payload"
{
  "created_at": "2026-08-12T18:44:12.000Z",
  "data": {
    "company_review": {
      "answers": [
        {
          "format": "SINGLE_SELECT",
          "options": [
            {
              "label": "Faster than expected",
              "value": "fast"
            },
            {
              "label": "On time",
              "value": "on_time"
            },
            {
              "label": "Late",
              "value": "late"
            }
          ],
          "prompt": "How was the delivery?",
          "type": "COMPANY_ATTRIBUTE",
          "value": "fast"
        }
      ],
      "approved_at": "2026-08-12T18:44:11.000Z",
      "body": "The parcel arrived two days after I ordered.",
      "channel": "REQUEST",
      "created_at": "2026-08-12T18:43:30.000Z",
      "helpful_down_count": 0,
      "helpful_up_count": 0,
      "id": "crv_5h2n8q4w1k7mza",
      "identity_verification": "CONFIRMED",
      "is_incentivized": false,
      "is_insider": false,
      "language": "en",
      "market_id": "mar_s3k8w1n5q2x7ye",
      "media": [],
      "order_id": "ord_7k2m4n8p5x9qwe",
      "profile_id": "prf_c4n8x2q1m5v7rt",
      "published_at": "2026-08-12T18:44:11.000Z",
      "purchase_verification": "VERIFIED",
      "rating": 4,
      "rejection_reasons": [],
      "responses": [],
      "status": "PUBLISHED",
      "submitted_at": "2026-08-12T18:44:10.000Z",
      "title": "Fast delivery",
      "updated_at": "2026-08-12T18:44:11.000Z"
    },
    "points": {
      "expiring_30d": 0,
      "expiring_60d": 200,
      "expiring_90d": 200,
      "lifetime_earned": 3870,
      "lifetime_spent": 2450,
      "next_expiration_at": "2026-09-30T23:59:59.999Z",
      "pending": 130,
      "spendable": 1290,
      "total": 1420
    },
    "profile": {
      "country": "SE",
      "created_at": "2026-03-14T08:12:44.000Z",
      "email": "astrid.lindqvist@example.com",
      "external_id": "7391056823401",
      "first_name": "Astrid",
      "id": "prf_c4n8x2q1m5v7rt",
      "language": "sv",
      "last_name": "Lindqvist",
      "name": "Astrid Lindqvist",
      "name_display_format": "FIRST_LAST_INITIAL",
      "updated_at": "2026-08-03T11:58:02.000Z"
    },
    "tier": {
      "current_tier": {
        "expires_at": "2026-12-31T23:59:59.999Z",
        "id": "tier_0m3v8k2q9x1sdf",
        "name": "Silver"
      },
      "next_tier": {
        "entry_rewards": [
          {
            "title": "15% off your next order",
            "type": "DISCOUNT_CODE"
          }
        ],
        "id": "tier_5p7w2n4k8c1zyh",
        "milestones": [
          {
            "current": 1420,
            "percent_complete": 71,
            "remaining": 580,
            "required": 2000,
            "type": "POINTS"
          }
        ],
        "name": "Gold",
        "perks": [
          {
            "value": "Free shipping on every order"
          }
        ]
      }
    }
  },
  "id": "2b4d6f8a-0c1e-83a5-97b9-c1d3e5f7a9b0",
  "origin": {
    "flow": {
      "id": "wfl_4k7w1q9m3x5ndz",
      "name": "Sync company reviews to CRM"
    }
  },
  "type": "company-review.submitted",
  "version": 1
}
```

- `type` (`string`, required): The event type, always `company-review.submitted`.
- `id` (`string<uuid>`, required): Unique event ID, the same value as the `webhook-id` header. Retries keep it; a replay gets a new one.
- `created_at` (`string<date-time>`, required): When the delivery was scheduled to send, in ISO 8601 UTC: for a Flow, when its webhook action ran, after any Wait step. Retries and replays keep it.
- `version` (`integer`, required): Payload version, currently `1`.
- `origin` (`object`): Why this destination received the event. Absent when no Flow sent it.
  - `origin.flow` (`object`, required): The Flow that sent the event.
    - `origin.flow.id` (`string`, required): Flow ID.
    - `origin.flow.name` (`string`, required): Flow name at the time of the delivery.
- `data` (`object`, required): The company review and its reviewer.
  - `data.company_review` (`object`): The company review.
    - `data.company_review.id` (`string`, required): Cevoid company review ID.
    - `data.company_review.rating` (`integer`, required): Score from 1 to 5.
    - `data.company_review.title` (`string`): Reviewer-supplied headline. In localized responses, title and body both use source text unless a complete translation is available.
    - `data.company_review.body` (`string`): Reviewer-supplied text. Absent for star-only reviews. In localized responses, title and body both use source text unless a complete translation is available.
    - `data.company_review.language` (`string`, required): BCP-47 language of the original submission, even when the returned text is translated.
    - `data.company_review.status` (`string`, required): Moderation and conversion state. One of `PENDING`, `PUBLISHED`, `REJECTED`, `CONVERTED`.
    - `data.company_review.rejection_reasons` (`string[]`, required): Policy reasons recorded when moderation rejected the review. Empty unless status is REJECTED; a single take-down can carry several. Each item is one of `SPAM`, `FAKE`, `DUPLICATE`, `OFF_TOPIC`, `PROFANE`, `ILLEGAL`, `PII`.
    - `data.company_review.identity_verification` (`string`, required): Author verification state. Public display requires CONFIRMED. One of `PENDING`, `CONFIRMED`, `EXPIRED`.
    - `data.company_review.purchase_verification` (`string`, required): Purchase evidence state behind verified-buyer display. One of `VERIFIED`, `UNVERIFIED`.
    - `data.company_review.is_incentivized` (`boolean`, required): Whether a reward influenced submission.
    - `data.company_review.is_insider` (`boolean`, required): Whether the reviewer is brand-connected.
    - `data.company_review.channel` (`string`, required): How the review entered Cevoid. One of `REQUEST`, `WIDGET`, `LINK`, `IMPORT`, `SYNDICATED_IN`.
    - `data.company_review.source` (`object`): External provenance. Present for imported or syndicated reviews.
      - `data.company_review.source.platform` (`string`, required): Source-system slug, such as okendo or yotpo.
      - `data.company_review.source.external_id` (`string`): Review identifier in the source system.
      - `data.company_review.source.url` (`string`): Link to the review in its source system.
    - `data.company_review.profile_id` (`string`, required): Cevoid public identifier of the reviewer.
    - `data.company_review.market_id` (`string`): Cevoid public market identifier.
    - `data.company_review.order_id` (`string`): Cevoid public identifier of the matched order.
    - `data.company_review.reward_id` (`string`): Granted reward, when the review was incentivized.
    - `data.company_review.converted_from_id` (`string`): Review this one was converted from.
    - `data.company_review.converted_to_id` (`string`): Replacement review created by conversion.
    - `data.company_review.media` (`object[]`, required)
      - `data.company_review.media[].type` (`string`, required): Whether the item is an image or a video. One of `IMAGE`, `VIDEO`.
      - `data.company_review.media[].url` (`string`, required): Delivery URL for the full asset.
      - `data.company_review.media[].thumbnail_url` (`string`, required): Delivery URL for the thumbnail.
      - `data.company_review.media[].aspect_ratio` (`number`, required): Width divided by height.
      - `data.company_review.media[].aspect_ratio_type` (`string`, required): Coarse orientation bucket. One of `LANDSCAPE`, `PORTRAIT`, `SQUARE`.
      - `data.company_review.media[].video_length` (`number`): Video duration in seconds.
      - `data.company_review.media[].moderation_status` (`string`): Moderation state for this asset, independent from the review itself. One of `PENDING`, `APPROVED`, `DECLINED`.
    - `data.company_review.responses` (`object[]`, required): Public workspace replies. Private replies are never exposed.
      - `data.company_review.responses[].body` (`string`, required): Reply text as published.
      - `data.company_review.responses[].author_type` (`string`, required): Whether the workspace or a named team member authored the reply. One of `WORKSPACE`, `TEAM_MEMBER`.
      - `data.company_review.responses[].created_at` (`string<date-time>`, required): ISO 8601 timestamp when the reply was created.
      - `data.company_review.responses[].updated_at` (`string<date-time>`): ISO 8601 timestamp when the reply was last edited.
    - `data.company_review.helpful_up_count` (`number`, required): Positive helpful votes from shoppers.
    - `data.company_review.helpful_down_count` (`number`, required): Negative helpful votes, when down-voting is enabled.
    - `data.company_review.submitted_at` (`string<date-time>`): ISO 8601 timestamp when submission completed.
    - `data.company_review.approved_at` (`string<date-time>`): ISO 8601 timestamp when moderation approved it.
    - `data.company_review.published_at` (`string<date-time>`): ISO 8601 timestamp when it first became public.
    - `data.company_review.created_at` (`string<date-time>`, required): ISO 8601 timestamp when Cevoid created the review.
    - `data.company_review.updated_at` (`string<date-time>`, required): ISO 8601 timestamp when Cevoid last updated the review.
    - `data.company_review.answers` (`object[]`, required)
      - `data.company_review.answers[].type` (`string`, required): What the question was about. One of `COMPANY_ATTRIBUTE`, `PROFILE_PROPERTY`.
      - `data.company_review.answers[].prompt` (`string`, required): Question wording as shown at submission time.
      - `data.company_review.answers[].format` (`string`, required): Input shape used to interpret `value`. One of `SCALE`, `CENTERED_RANGE`, `SINGLE_SELECT`, `MULTI_SELECT`, `WOULD_RECOMMEND`, `NUMERIC`.
      - `data.company_review.answers[].options` (`object[]`): Options as shown at submission time.
        - `data.company_review.answers[].options[].value` (`string`, required)
        - `data.company_review.answers[].options[].label` (`string`, required)
      - `data.company_review.answers[].scale` (`object`): Scale definition as shown at submission time.
        - `data.company_review.answers[].scale.steps` (`number`, required)
        - `data.company_review.answers[].scale.start_label` (`string`, required)
        - `data.company_review.answers[].scale.end_label` (`string`, required)
        - `data.company_review.answers[].scale.center_label` (`string`)
        - `data.company_review.answers[].scale.step_labels` (`string[]`)
      - `data.company_review.answers[].value` (`number | string | boolean | string[]`, required): Submitted scalar or selection, interpreted per `format`.
  - `data.profile` (`object`): The profile of the reviewer. Absent when no profile is linked.
    - `data.profile.id` (`string`, required): Cevoid profile ID.
    - `data.profile.external_id` (`string`): Identifier this profile carries in the workspace source system, when known.
    - `data.profile.name` (`string`): Display name of the profile.
    - `data.profile.first_name` (`string`): First name of the profile.
    - `data.profile.last_name` (`string`): Last name of the profile.
    - `data.profile.email` (`string`): Email address for the profile.
    - `data.profile.avatar_url` (`string`): Profile image URL.
    - `data.profile.country` (`string`): Country code associated with the profile.
    - `data.profile.language` (`string`): Preferred language code associated with the profile.
    - `data.profile.location` (`string`): Free-form location associated with the profile.
    - `data.profile.social_instagram_handle` (`string`): Instagram handle associated with the profile.
    - `data.profile.social_tiktok_handle` (`string`): TikTok handle associated with the profile.
    - `data.profile.social_x_handle` (`string`): X handle associated with the profile.
    - `data.profile.birthday` (`string<date>`): Birthday in YYYY-MM-DD format.
    - `data.profile.name_display_format` (`string`): Preferred format for displaying the profile name. One of `FULL`, `FIRST_LAST_INITIAL`, `FIRST`, `ANONYMOUS`.
    - `data.profile.bio` (`string`): Profile biography text.
    - `data.profile.notes` (`string`): Internal notes about the profile.
    - `data.profile.created_at` (`string<date-time>`, required): ISO 8601 timestamp when the profile was created.
    - `data.profile.updated_at` (`string<date-time>`, required): ISO 8601 timestamp when the profile was last updated.
  - `data.points` (`object`): The profile's loyalty points. Only for workspaces with Loyalty, and only when the profile is a member.
    - `data.points.total` (`number`, required): Total active and pending points.
    - `data.points.spendable` (`number`, required): Active points available to spend.
    - `data.points.pending` (`number`, required): Earned points not active yet.
    - `data.points.expiring_30d` (`number`, required): Points expiring within 30 days.
    - `data.points.expiring_60d` (`number`, required): Points expiring within 60 days.
    - `data.points.expiring_90d` (`number`, required): Points expiring within 90 days.
    - `data.points.lifetime_earned` (`number`, required): Points earned over the membership lifetime.
    - `data.points.lifetime_spent` (`number`, required): Points spent over the membership lifetime.
    - `data.points.next_expiration_at` (`string<date-time>`): Earliest upcoming active-points expiration.
  - `data.tier` (`object`): The profile's tier standing. Only for workspaces with Loyalty, and only when the profile is a member.
    - `data.tier.current_tier` (`object | null`, required): The member's current tier; null without one.
      - `data.tier.current_tier.id` (`string`, required): Cevoid tier ID.
      - `data.tier.current_tier.name` (`string`, required): Display name of the tier.
      - `data.tier.current_tier.icon_url` (`string`): Optional icon representing the tier.
      - `data.tier.current_tier.expires_at` (`string<date-time>`): When the current tier expires, if tier evaluations expire.
    - `data.tier.next_tier` (`object | null`, required): The next tier the member can reach; null when there is none.
      - `data.tier.next_tier.id` (`string`, required): Cevoid tier ID.
      - `data.tier.next_tier.name` (`string`, required): Display name of the tier.
      - `data.tier.next_tier.icon_url` (`string`): Optional icon representing the tier.
      - `data.tier.next_tier.milestones` (`object[]`, required): Progress required for the next tier.
        - `data.tier.next_tier.milestones[].type` (`string`, required): Metric used to qualify for the next tier. One of `POINTS`, `AMOUNT_SPENT`, `NUMBER_OF_PURCHASES`.
        - `data.tier.next_tier.milestones[].required` (`number`, required): Required amount for the next tier. AMOUNT_SPENT values use major currency units.
        - `data.tier.next_tier.milestones[].current` (`number`, required): Current progress. AMOUNT_SPENT values use major currency units.
        - `data.tier.next_tier.milestones[].remaining` (`number`, required): Remaining amount. AMOUNT_SPENT values use major currency units.
        - `data.tier.next_tier.milestones[].percent_complete` (`number`, required): Progress percentage, capped at 100.
      - `data.tier.next_tier.entry_rewards` (`object[]`, required): Rewards granted at the next tier.
        - `data.tier.next_tier.entry_rewards[].type` (`string`, required): Reward type granted when the tier is reached.
        - `data.tier.next_tier.entry_rewards[].title` (`string`, required): Human-readable reward title.
        - `data.tier.next_tier.entry_rewards[].icon_url` (`string`): Optional icon representing the reward.
      - `data.tier.next_tier.perks` (`object[]`, required): Perks associated with the next tier.
        - `data.tier.next_tier.perks[].value` (`string`, required): Human-readable perk text.

## Related articles

- [product-review.submitted](https://docs.cevoid.com/developers/webhooks/product-review-submitted.md)
- [Event types](https://docs.cevoid.com/developers/webhooks/event-types.md)
- [Webhooks via Flows](https://docs.cevoid.com/flows/webhooks.md)

---

Canonical: https://docs.cevoid.com/developers/webhooks/company-review-submitted
