Back to Blog
4 min read

Sentiment Analysis in Power Platform: Understanding Customer Emotions

Sentiment analysis helps businesses understand how customers feel about their products, services, and interactions. AI Builder makes this capability accessible without data science expertise.

Understanding Sentiment Analysis

output:
  sentiment:
    - Positive
    - Negative
    - Neutral
    - Mixed

confidence_score:
  range: 0 to 1
  meaning: Model's confidence in classification

use_cases:
  - Customer feedback analysis
  - Social media monitoring
  - Support ticket prioritization
  - Product review analysis
  - Employee feedback processing

Basic Implementation

In Power Apps

// Analyze feedback text
AnalyzeFeedbackBtn.OnSelect =
    Set(
        SentimentResult,
        AIBuilder.AnalyzeSentiment(FeedbackTextInput.Text)
    );

// Display result
SentimentLabel.Text = SentimentResult.sentiment
ConfidenceLabel.Text = "Confidence: " & Text(SentimentResult.confidenceScore * 100, "0") & "%"

// Visual indicator
SentimentIcon.Icon = Switch(
    SentimentResult.sentiment,
    "positive", Icon.Emoji2,  // Happy
    "negative", Icon.Emoji,   // Sad
    Icon.EmojiNeutral         // Neutral
)

SentimentIcon.Color = Switch(
    SentimentResult.sentiment,
    "positive", Color.Green,
    "negative", Color.Red,
    Color.Gray
)

In Power Automate

{
    "trigger": {
        "type": "When_item_created",
        "inputs": {
            "table": "customer_feedback"
        }
    },
    "actions": {
        "Analyze_Sentiment": {
            "type": "AIBuilder",
            "inputs": {
                "model": "prebuilt-sentimentAnalysis",
                "text": "@{triggerBody()?['feedback_text']}"
            }
        },
        "Update_Record": {
            "type": "UpdateRecord",
            "inputs": {
                "table": "customer_feedback",
                "id": "@{triggerBody()?['id']}",
                "item": {
                    "sentiment": "@{body('Analyze_Sentiment')?['sentiment']}",
                    "sentiment_score": "@{body('Analyze_Sentiment')?['confidenceScore']}"
                }
            }
        },
        "Route_Negative_Feedback": {
            "type": "Condition",
            "expression": {
                "equals": ["@body('Analyze_Sentiment')?['sentiment']", "negative"]
            },
            "actions": {
                "Create_Urgent_Case": {
                    "type": "CreateRecord",
                    "inputs": {
                        "table": "cases",
                        "item": {
                            "title": "Urgent: Negative Customer Feedback",
                            "description": "@{triggerBody()?['feedback_text']}",
                            "priority": "High",
                            "customer_id": "@{triggerBody()?['customer_id']}"
                        }
                    }
                },
                "Notify_Team": {
                    "type": "SendEmail",
                    "inputs": {
                        "to": "customer-success@company.com",
                        "subject": "Negative Feedback Alert",
                        "body": "Customer @{triggerBody()?['customer_name']} submitted negative feedback.\n\n@{triggerBody()?['feedback_text']}"
                    }
                }
            }
        }
    }
}

Batch Processing Reviews

{
    "definition": {
        "trigger": {
            "type": "Recurrence",
            "recurrence": {
                "frequency": "Day",
                "interval": 1
            }
        },
        "actions": {
            "Get_Unprocessed_Reviews": {
                "type": "ListRecords",
                "inputs": {
                    "table": "product_reviews",
                    "filter": "sentiment eq null"
                }
            },
            "Process_Each_Review": {
                "type": "ForEach",
                "foreach": "@body('Get_Unprocessed_Reviews')?['value']",
                "runtimeConfiguration": {
                    "concurrency": {
                        "repetitions": 10
                    }
                },
                "actions": {
                    "Analyze": {
                        "type": "AIBuilder",
                        "inputs": {
                            "model": "prebuilt-sentimentAnalysis",
                            "text": "@{items('Process_Each_Review')?['review_text']}"
                        }
                    },
                    "Update_Review": {
                        "type": "UpdateRecord",
                        "inputs": {
                            "table": "product_reviews",
                            "id": "@{items('Process_Each_Review')?['id']}",
                            "item": {
                                "sentiment": "@{body('Analyze')?['sentiment']}",
                                "sentiment_score": "@{body('Analyze')?['confidenceScore']}",
                                "processed_date": "@{utcNow()}"
                            }
                        }
                    }
                }
            },
            "Generate_Summary_Report": {
                "type": "Compose",
                "inputs": {
                    "total_processed": "@{length(body('Get_Unprocessed_Reviews')?['value'])}",
                    "report_date": "@{utcNow()}"
                }
            }
        }
    }
}

Sentiment Dashboard

Power BI Integration

// DAX measures for sentiment dashboard

// Sentiment distribution
PositiveCount = CALCULATE(COUNT(Feedback[ID]), Feedback[Sentiment] = "positive")
NegativeCount = CALCULATE(COUNT(Feedback[ID]), Feedback[Sentiment] = "negative")
NeutralCount = CALCULATE(COUNT(Feedback[ID]), Feedback[Sentiment] = "neutral")

// Sentiment score over time
AvgSentimentScore =
AVERAGEX(
    Feedback,
    SWITCH(
        Feedback[Sentiment],
        "positive", 1,
        "negative", -1,
        0
    )
)

// Net Promoter Score approximation
NPSScore =
VAR Promoters = CALCULATE(COUNT(Feedback[ID]), Feedback[Sentiment] = "positive")
VAR Detractors = CALCULATE(COUNT(Feedback[ID]), Feedback[Sentiment] = "negative")
VAR Total = COUNT(Feedback[ID])
RETURN DIVIDE(Promoters - Detractors, Total) * 100

Power Apps Dashboard

// Load sentiment statistics
OnVisible =
    ClearCollect(
        SentimentStats,
        {
            Positive: CountIf(Feedback, Sentiment = "positive"),
            Negative: CountIf(Feedback, Sentiment = "negative"),
            Neutral: CountIf(Feedback, Sentiment = "neutral"),
            Total: CountRows(Feedback)
        }
    );

// Calculate percentages
Set(
    PositivePct,
    First(SentimentStats).Positive / First(SentimentStats).Total * 100
);

// Trend over last 7 days
ClearCollect(
    SentimentTrend,
    GroupBy(
        AddColumns(
            Filter(Feedback, CreatedDate >= Today() - 7),
            "DayNum", DateDiff(Today() - 7, CreatedDate, TimeUnit.Days)
        ),
        "DayNum",
        "DayFeedback"
    )
);

Combining with Other Analysis

// Comprehensive text analysis
FullAnalysisBtn.OnSelect =
    // Sentiment
    Set(
        Sentiment,
        AIBuilder.AnalyzeSentiment(InputText.Text)
    );

    // Key phrases
    Set(
        KeyPhrases,
        AIBuilder.ExtractKeyPhrases(InputText.Text)
    );

    // Entity extraction
    Set(
        Entities,
        AIBuilder.ExtractEntities(InputText.Text)
    );

    // Language detection
    Set(
        Language,
        AIBuilder.DetectLanguage(InputText.Text)
    );

    Navigate(AnalysisResultsScreen);

// Display comprehensive results
SentimentResult.Text = Sentiment.sentiment
KeyPhrasesGallery.Items = KeyPhrases.phrases
EntitiesGallery.Items = Entities.entities
LanguageResult.Text = Language.language

Best Practices

accuracy_considerations:
  text_length:
    - Very short text may be less accurate
    - Combine related texts if needed

  context:
    - Sarcasm may be misclassified
    - Industry-specific language may need custom models

  mixed_sentiment:
    - Long texts may have mixed sentiment
    - Consider sentence-level analysis for detailed feedback

implementation_tips:
  - Set confidence thresholds for automation
  - Human review for edge cases
  - Track accuracy over time
  - Collect feedback for improvement

Conclusion

Sentiment analysis enables automated understanding of customer emotions:

  • Prioritize negative feedback for immediate response
  • Track sentiment trends over time
  • Identify product/service issues early
  • Measure customer satisfaction at scale

When combined with other AI Builder capabilities, it forms a powerful customer intelligence toolkit.

Resources

Michael John Peña

Michael John Peña

Senior Data Engineer based in Sydney. Writing about data, cloud, and technology.