Skip to content

Review Data Model

🏗️ Primary Entities

Reviews: Customer reviews collected from external platforms (Google, Facebook, Yelp, etc.)

Responses: Business replies to customer reviews with source attribution

Ratings: Numeric star ratings (1–5) with review text

🔗 Key Relationships

Many-to-One: Review → Shop (each review belongs to one shop location)

Many-to-One: Review → Tenant (each review belongs to one tenant)

Many-to-One: Review → Customer (optional — linked when reviewer is a known customer)

Core identification fields linking reviews to tenants, shops, and customers.

Field NameData TypeDescriptionRequired
STEER_TENANT_IDString (UUID)Unique tenant identifier (parent organization)Yes
STEER_SHOP_IDString (UUID)Shop location identifier where the review was leftYes
STEER_CUSTOMER_IDString (UUID)Customer identifier (populated only when reviewer is a known customer)No
STEER_REVIEW_IDStringUnique review identifier within SteerYes

Platform source and external identifiers for the review.

Field NameData TypeDescriptionRequired
REVIEW_SOURCEStringThe review directory platform, stored as the string name of the internal ReviewDirectory enum (e.g., Google, Yelp, Facebook). See enum values below for the full listYes
REVIEW_SOURCE_DETAILStringFor integration-sourced reviews (Google, Yelp, etc.), this mirrors REVIEW_SOURCE. For manually uploaded reviews (REVIEW_SOURCE = ManualUploaded), this is an arbitrary free-text value taken directly from the Source column in the uploaded CSV — it is not validated against the ReviewDirectory enum and can contain any string the user enteredYes
EXTERNAL_REVIEW_IDStringPlatform-specific review identifierYes

The review itself — author, text, rating, and link to the original.

Field NameData TypeDescriptionRequired
AUTHORStringReviewer’s display name as shown on the platformYes
REVIEW_TEXTStringFull review text content (null for rating-only reviews)No
RATINGNumberStar rating (1–5 scale)Yes
REVIEW_URLStringDirect URL to the original review on the source platformYes

Review and response timing in both UTC and local timezone.

Field NameData TypeDescriptionRequired
POSTED_ATTimestampReview posted timestamp (UTC)Yes
POSTED_AT_LOCALTimestampReview posted timestamp (shop’s local timezone)Yes
RESPONSE_POSTED_ATTimestampBusiness response posted timestamp (UTC)No
RESPONSE_POSTED_AT_LOCALTimestampBusiness response posted timestamp (shop’s local timezone)No

The shop’s reply to the review, if any.

Field NameData TypeDescriptionRequired
RESPONSE_TEXTStringFull text of the business responseNo
RESPONSE_SOURCENumberHow the response was created (see enum values)No

Record lifecycle tracking.

Field NameData TypeDescriptionRequired
STEER_CREATED_ATTimestampRecord creation timestamp in SteerYes
STEER_UPDATED_ATTimestampRecord last update timestamp in SteerYes

REVIEW_SOURCE stores the string name of the ReviewDirectory enum. For integration-sourced reviews (via BrightLocal, Birdeye, etc.), REVIEW_SOURCE_DETAIL mirrors this value. For manually uploaded reviews, REVIEW_SOURCE_DETAIL is an unvalidated free-text string from the user’s CSV file and may contain any arbitrary value. The enum has approximately 25 members; the most common values are:

  • Google: Google Business Profile
  • Facebook: Facebook page
  • Yelp: Yelp listing
  • MechanicAdvisor: MechanicAdvisor platform
  • ManualUploaded: Manually uploaded into the system
  • BbbOrg: Better Business Bureau
  • TripAdvisor: TripAdvisor listing
  • Other values may appear as additional review directories are integrated

Complete API response example with a review record:

{
"data": [
[
"ce96b905-5647-4901-8a83-8e7dbca90418",
"2dc598c3-1e9e-408e-82df-b8d7acff380b",
"64e017ab-ead3-4149-8d4a-ec4598e33cd4",
"69b1676eac6cdc0570bc0419",
"Google",
"Google",
"5385923795441904374",
"Ron Weum",
"Easy to schedule, work performed on time, courteous staff",
5,
"https://www.google.com/maps/reviews/...",
"2025-11-06T01:50:41Z",
"2025-11-05T19:50:41Z",
"2025-01-15T00:00:00Z",
"2025-01-14T18:00:00Z",
"Thank you for your feedback, Ron! We're glad to hear that scheduling was easy and our team met your expectations with courteous service.",
1,
"2026-03-11T13:00:30Z",
"2026-03-11T13:00:35Z"
]
],
"metadata": {
"rowType": [
{"name": "STEER_TENANT_ID", "type": "text"},
{"name": "STEER_SHOP_ID", "type": "text"},
{"name": "STEER_CUSTOMER_ID", "type": "text"},
{"name": "STEER_REVIEW_ID", "type": "text"},
{"name": "REVIEW_SOURCE", "type": "text"},
{"name": "REVIEW_SOURCE_DETAIL", "type": "text"},
{"name": "EXTERNAL_REVIEW_ID", "type": "text"},
{"name": "AUTHOR", "type": "text"},
{"name": "REVIEW_TEXT", "type": "text"},
{"name": "RATING", "type": "fixed"},
{"name": "REVIEW_URL", "type": "text"},
{"name": "POSTED_AT", "type": "timestamp_ntz"},
{"name": "POSTED_AT_LOCAL", "type": "timestamp_ntz"},
{"name": "RESPONSE_POSTED_AT", "type": "timestamp_ntz"},
{"name": "RESPONSE_POSTED_AT_LOCAL", "type": "timestamp_ntz"},
{"name": "RESPONSE_TEXT", "type": "text"},
{"name": "RESPONSE_SOURCE", "type": "fixed"},
{"name": "STEER_CREATED_AT", "type": "timestamp_ntz"},
{"name": "STEER_UPDATED_AT", "type": "timestamp_ntz"}
]
}
}