Client Feedback & Reviews

Client Feedback & Reviews

NexusRMS collects structured feedback after projects to measure client satisfaction, calculate Net Promoter Scores, and gather testimonials for marketing. Every feedback submission is stored as a ClientFeedback record linked to both the client and the project.

Feedback structure

Each feedback record contains the following core fields:

  • client_id — The client who provided the feedback
  • client_contact_id — The specific contact person who submitted the feedback (optional)
  • project_id — The project this feedback relates to (required). Only one feedback record is permitted per project per client.
  • submitted_at — Timestamp of when the feedback was submitted
  • feedback_source — How the feedback was collected: email, phone, survey, or portal

Overall rating

The overall_rating field is a 1 to 5 scale representing general satisfaction. This is the primary rating used for sorting, filtering, and health score calculations.

Dimension ratings

In addition to the overall rating, five specific dimensions can each be rated on a 1 to 5 scale:

  • service_quality_rating — Quality of the overall service provided
  • equipment_quality_rating — Condition and reliability of the equipment supplied
  • crew_professionalism_rating — Professionalism and competence of the crew
  • communication_rating — Quality and timeliness of communication
  • value_for_money_rating — Perceived value relative to the price paid

The getAverageRating() method calculates the mean across all provided dimension ratings and the overall rating, ignoring any dimensions left blank.

Written feedback

Two free-text fields capture qualitative feedback:

  • positive_feedback — What the client liked about the service
  • negative_feedback — Areas for improvement or complaints

Net Promoter Score (NPS)

The nps_score field captures the classic NPS question ("How likely are you to recommend us?") on a 0 to 10 scale. The getNpsCategory() method classifies each response:

  • promoter — Score of 9 or 10. Enthusiastic, loyal clients who actively recommend you.
  • passive — Score of 7 or 8. Satisfied but not enthusiastic; vulnerable to competitors.
  • detractor — Score of 0 to 6. Unhappy clients who may damage your brand through negative word-of-mouth.

Sentiment score

The getSentimentScore() method combines the overall rating and NPS into a single 0 to 100 sentiment score. The overall rating contributes up to 50 points (rating divided by 5, multiplied by 50) and the NPS score contributes up to 50 points (NPS divided by 10, multiplied by 50).

Rating analysis methods

The ClientFeedback model provides several helper methods for quick analysis:

  • isPositive() — Returns true if the overall rating is 4 or higher
  • isNegative() — Returns true if the overall rating is 2 or lower
  • needsAttention() — Returns true if the feedback has not been responded to and either the overall rating is 3 or lower or negative feedback text is present

Feedback scopes

Use these query scopes to filter feedback records:

  • highRated() — Feedback with an overall rating of 4 or 5
  • lowRated() — Feedback with an overall rating of 1 or 2
  • approvedTestimonials() — Feedback with an approved testimonial
  • pendingApproval() — Feedback with a testimonial awaiting review
  • needsResponse() — Feedback that has not been responded to where the rating is 3 or lower or negative feedback is present

Response tracking

When you respond to client feedback, the following fields are updated:

  • has_been_responded_to — Set to true when a response is sent
  • responded_at — Timestamp of the response
  • responded_by — The user who sent the response
  • response_text — The content of your response

Responding to feedback clears the needsAttention() flag, removing the item from the attention queue.

Testimonial workflow

Feedback records can include a client testimonial intended for marketing use. The approval workflow is as follows:

  1. Client submits feedback — The testimonial text field is filled in alongside ratings. The testimonial_approved flag defaults to false.
  2. Testimonial appears as pending — Use the pendingApproval() scope to find testimonials awaiting review.
  3. Staff reviews and approves — When approved, testimonial_approved is set to true, testimonial_approved_at records the timestamp, and testimonial_approved_by records the approving user.
  4. Approved testimonials are available — Use the approvedTestimonials() scope to retrieve all approved testimonials for use on your website, proposals, or marketing materials.

If a testimonial is not suitable for public use, simply leave testimonial_approved as false. The testimonial text is preserved for internal reference but will not appear in approved testimonial queries.

How feedback feeds into client health

Client feedback influences the client record in several ways:

  • The satisfaction_score field on the Client model (1 to 5 scale) is updated based on feedback submissions.
  • Low satisfaction correlates with reduced project activity over time, which indirectly lowers the health_score through the Project Activity factor.
  • Persistent negative feedback increases the risk_level assessment.
  • NPS detractor scores contribute to higher churn_probability predictions.

Tips

  • Respond to all feedback promptly, especially negative feedback. The needsResponse() scope makes it easy to find unaddressed submissions.
  • Approve strong testimonials quickly whilst the client's positive experience is fresh — they are valuable social proof for proposals and your website.
  • Monitor NPS trends monthly. A declining proportion of promoters is an early warning sign even if individual ratings remain acceptable.
  • Use the dimension ratings to identify specific areas for improvement. For example, consistently low communication_rating scores suggest a process issue worth addressing.
  • Send feedback requests through the client portal (feedback_source: portal) for the highest response rates, as clients can complete the form at their convenience.
  • Review the needsAttention() queue weekly to ensure no negative feedback goes unacknowledged.

Was this article helpful?