QA & compliance Independent solution

Contact Lens QA & Compliance Analytics

Every call scored for sentiment, script adherence and compliance risk — coaching signal for agents and supervisors, defensible evidence for auditors.

The problem

Manual QA sees 1-2% of calls — the rest is a blind spot

Supervisors can only manually review a tiny fraction of calls, so most coaching opportunities go unseen and most compliance risk stays invisible until it becomes a complaint, a regulator finding, or a churned customer.

This solution scores every call for sentiment, disclosure and script adherence, and compliance risk — surfacing what needs a human's attention instead of asking humans to find it.

Primary objective
Give every call the scrutiny only 1-2% used to get — without adding QA headcount.
How it works

Capture call → score → flag risk → route to coaching/audit

Capture call
Contact Lens transcribes & analyses
Score
Sentiment & script adherence
Flag risk
Compliance & disclosure gaps
Route
Coaching queue or audit trail
What it does
  • ✓ 100% call coverage scoring
  • ✓ Sentiment & tone tracking
  • ✓ Script & disclosure adherence
  • ✓ Compliance risk flagging
  • ✓ Auto-built coaching queues
  • ✓ Trend dashboards by team
Built with
  • ✓ Amazon Connect Contact Lens
  • ✓ AWS Lambda + EventBridge
  • ✓ Amazon CloudWatch
  • ✓ Amazon DynamoDB
  • ✓ QuickSight-based reporting
Guardrails
  • ✓ Human review of every flag
  • ✓ No automated penalties
  • ✓ PII masking in transcripts
  • ✓ Configurable rule sets
Under the hood

Risk flags land with a supervisor, not a scoreboard

Contact Lens analytics fire an event the moment a call ends. Flagged calls go straight to a supervisor's review queue — the model surfaces risk, a person decides what it means.

connect/contact_lens_flag.py PYTHON
import boto3

connect = boto3.client("connect")
dynamodb = boto3.resource("dynamodb").Table("qa-review-queue")

RISK_TERMS = ["cancel policy", "refund guarantee", "not disclosed"]

def handle_contact_lens_event(event: dict) -> None:
    analytics = connect.get_contact_attributes(
        InstanceId=event["instanceId"], InitialContactId=event["contactId"])
    sentiment = analytics["Attributes"].get("OverallSentiment")
    transcript = analytics["Attributes"].get("Transcript", "")

    # Flag for a human — never auto-score an agent's record
    risk_hits = [t for t in RISK_TERMS if t in transcript.lower()]
    if sentiment == "NEGATIVE" or risk_hits:
        dynamodb.put_item(Item={
            "contact_id": event["contactId"], "sentiment": sentiment,
            "risk_terms": risk_hits, "status": "pending_review"})
Outcomes
100%
Of calls reviewed
Minutes
Not weeks, to surface risk
Fewer
Compliance findings
Faster
Coaching cycles

See every call, not just the sample

Deploy standalone, or pair it with Conversational Voice AI to score bot and human interactions the same way.

Start a conversation →
More Contact Center solutions
Contact Lens QA & Compliance Analytics | Smort