A financial app recommends reviewing a recurring expense. The user opens the recommendation and sees a reassuring sentence: “AI analyzed your spending.”
That sentence leaves the important questions unanswered. Which transactions were analyzed? What changed? Is an account missing? Can the user correct the information?
An explainable AI recommendation interface should help users inspect the basis of a recommendation, understand its limits, and choose what happens next.
For React Native developers, this requires coordination between the recommendation service, the explanation payload, and the mobile interface. Adding a “Why this recommendation?” button is only the visible part.
What makes an AI recommendation explainable?
NIST’s Four Principles of Explainable Artificial Intelligence identifies explanation, meaningfulness, explanation accuracy, and knowledge limits as fundamental properties of explainable systems.
Applied to a financial interface, those principles suggest four practical requirements:
| Requirement | What the interface should communicate |
|---|---|
| Explanation | The factors supporting this particular recommendation |
| Meaningfulness | An explanation the intended user can understand |
| Explanation accuracy | Reasons that reflect the system’s actual decision process |
| Knowledge limits | Missing information and conditions under which the system should withhold a recommendation |
Consider an illustrative spending insight:
“Recurring subscription charges increased from $45 to $60 between the two reporting periods. Review the three subscriptions included in this comparison.”
The user can inspect the amounts, periods, and underlying records. A separate message can explain that an unlinked account is excluded.
An explanation should make a recommendation easier to evaluate, including when the user should question it.
Separate financial evidence from generated language
A useful architecture separates four responsibilities.
The data layer normalizes transactions and records their provenance. The recommendation service produces an outcome. An explanation service assembles the relevant evidence and reasons. React Native presents that structured result.
For an initial implementation, deterministic templates can provide clear explanations without introducing a language model.
If an LLM rewrites an explanation, constrain it to approved evidence. Validate monetary figures, dates, and references before displaying the result. Record which recommendation and explanation versions produced the visible content.
The explanation method must also match the system:
| Recommendation mechanism | Appropriate explanation basis |
|---|---|
| Business rule | The rule and input values that triggered it |
| Predictive model | A validated local explanation of the specific prediction |
| Ranked recommendations | Factors affecting selection and ranking |
| LLM-generated coaching | Supporting records, calculations, and applicable rules |
These methods answer different questions. Grounding a generated sentence in transaction records does not, by itself, explain why a ranking model selected one recommendation over another.
Similarly, SHAP values describe contributions to a model output. They do not establish that changing a feature will cause a real-world financial outcome. The SHAP documentation explicitly warns about confusing predictive relationships with causal effects.
Design the explanation contract before the component
The frontend needs more than a recommendation title and an arbitrary confidence percentage.
A useful response contract includes an identifier, display status, supporting reasons, evidence references, data coverage, and timestamps. The backend should retain the model, rules, and explanation versions needed to reconstruct the result.
The following simplified TypeScript contract distinguishes a displayable recommendation from a withheld one:
type Evidence = {
id: string;
label: string;
};
type Recommendation =
| {
id: string;
status: "ready";
title: string;
summary: string;
reasons: string[];
evidence: Evidence[];
coverageLabel: string;
dataAsOfLabel: string;
limitations: string[];
}
| {
id: string;
status: "withheld";
message: string;
};This is a presentation contract. Validate API responses at runtime before treating them as this type.
A production service should also verify that every evidence reference belongs to the authenticated user. Knowing a transaction identifier must never be enough to access another customer’s records.
Build an accessible React Native recommendation card
The component below provides a visible summary, expandable reasons, evidence navigation, and a way to report incorrect data.
It deliberately keeps recommendation review separate from transaction execution.
import React, { useState } from "react";
import {
Pressable,
StyleSheet,
Text,
View,
} from "react-native";
type Props = {
recommendation: Recommendation;
onOpenEvidence: (evidenceId: string) => void;
onReportIssue: (recommendationId: string) => void;
};
export function RecommendationCard({
recommendation,
onOpenEvidence,
onReportIssue,
}: Props) {
const [expanded, setExpanded] = useState(false);
if (recommendation.status === "withheld") {
return (
<View style={styles.card}>
<Text accessibilityRole="header">
Recommendation unavailable
</Text>
<Text>{recommendation.message}</Text>
</View>
);
}
return (
<View style={styles.card}>
<Text accessibilityRole="header" style={styles.title}>
{recommendation.title}
</Text>
<Text>{recommendation.summary}</Text>
<Text>{recommendation.coverageLabel}</Text>
<Text>{recommendation.dataAsOfLabel}</Text>
<Pressable
accessibilityRole="button"
accessibilityState={{ expanded }}
onPress={() => setExpanded(value => !value)}
style={styles.button}
>
<Text>
{expanded ? "Hide explanation" : "Why this recommendation?"}
</Text>
</Pressable>
{expanded && (
<View style={styles.details}>
<Text accessibilityRole="header">Supporting reasons</Text>
{recommendation.reasons.map((reason, index) => (
<Text key={`${recommendation.id}-reason-${index}`}>
{reason}
</Text>
))}
{recommendation.limitations.map((limitation, index) => (
<Text key={`${recommendation.id}-limit-${index}`}>
Limitation: {limitation}
</Text>
))}
{recommendation.evidence.map(item => (
<Pressable
key={item.id}
accessibilityRole="button"
accessibilityLabel={`View supporting records: ${item.label}`}
onPress={() => onOpenEvidence(item.id)}
style={styles.button}
>
<Text>View records: {item.label}</Text>
</Pressable>
))}
</View>
)}
<Pressable
accessibilityRole="button"
onPress={() => onReportIssue(recommendation.id)}
style={styles.button}
>
<Text>Report incorrect data</Text>
</Pressable>
</View>
);
}
const styles = StyleSheet.create({
card: {
padding: 16,
gap: 12,
backgroundColor: "#FFFFFF",
borderRadius: 12,
},
title: {
fontSize: 20,
fontWeight: "600",
},
details: {
gap: 12,
},
button: {
minHeight: 48,
paddingVertical: 12,
paddingHorizontal: 8,
justifyContent: "center",
},
});React Native’s accessibility documentation supports labels, roles, and expanded states, while noting platform differences between Android and iOS. Test the interaction with both TalkBack and VoiceOver.
Keep financial content readable at larger text sizes. Avoid fixed-height explanation containers and color-only indicators. When displaying a different recommendation, mount the card with key={recommendation.id} so its disclosure state resets.
This component assumes validated data is already available. Fetching, authorization, loading states, and error recovery belong in the surrounding application.
Communicate uncertainty without inventing precision
A badge reading “94% confident” can create ambiguity. Does it describe transaction classification, forecast accuracy, or the probability that a proposed action benefits the user?
Google’s People + AI Guidebook discusses explaining data sources, calibrating trust, and testing how confidence information affects understanding.
For a financial recommendation interface, separate three concepts:
- Data coverage: Which accounts and periods are included?
- Prediction uncertainty: How reliable is the relevant estimate?
- Action suitability: Does the suggestion fit the user’s circumstances?
One number cannot represent all three.
Use precise limitations such as “This comparison excludes your disconnected savings account.” If the available evidence cannot support a recommendation, return a withheld state with a useful next step.
How are five companies approaching explainability?
The following examples cover delivered product features, explanation tooling, research, and UX guidance. Their public sources do not establish a shared React Native implementation.
GeekyAnts: grounding financial coaching in user records
The PsyFi case study describes GeekyAnts’ work on an AI financial wellness platform across iOS, Android, and web.
Its coach, Fy, uses Amazon Bedrock and Claude. The implementation includes checks comparing AI-generated monetary figures with financial records to flag unsupported claims.
Implementation lesson: Validate the financial evidence behind an explanation before optimizing its presentation. Grounding checks support factual reliability, although they are distinct from model attribution.
IBM: separating local and global explanations
IBM’s watsonx documentation describes local explanations for individual predictions and global explanations for broader model behavior, including SHAP and LIME configuration.
Implementation lesson: A customer asking why a particular recommendation appeared needs an explanation tied to that result. An overall feature-importance chart answers a different question.
Capital One: evaluating explanation quality
Capital One’s GALE research explores comparing sets of model explanations. Its discussion highlights sensitivity to explanation methods and configuration choices.
Implementation lesson: An explanation deserves its own evaluation process. A plausible reason displayed in a card is insufficient evidence that it faithfully represents the model.
JPMorganChase: researching counterfactual explanations
JPMorganChase’s Trustworthy AI research publications include work on counterfactual explanations and algorithmic recourse.
Implementation lesson: “What would change this result?” is a valuable interface question. Answers should describe tested model scenarios and their assumptions, without presenting them as guaranteed financial outcomes.
Google: designing for appropriate reliance
Google’s PAIR guidance addresses when explanations are useful, how to communicate data use, and whether confidence displays help users make decisions.
Implementation lesson: Evaluate whether users understand a recommendation’s limits. Increasing acceptance is not enough to demonstrate an effective explanation interface.
Test explanation quality alongside interface behavior
A React Native financial app needs tests beyond whether the disclosure button opens.
| Test area | Example verification |
|---|---|
| Evidence integrity | Displayed amounts and periods match supporting records |
| Result consistency | Recommendation and explanation share the same decision identifier |
| Missing data | Insufficient coverage produces the intended limitation or withheld state |
| Accessibility | Reasons and controls remain usable with screen readers and enlarged text |
| Async updates | A late response cannot attach an old explanation to a new recommendation |
| User understanding | Users can identify the basis, limitations, and available next steps |
| Data correction | Reporting an issue enters a defined review or recalculation workflow |
Track unsupported financial claims and explanation failures alongside engagement. A higher acceptance rate can reflect better understanding, but it can also reflect excessive reliance.
The engineering goal is a recommendation users can inspect: supported by identifiable evidence, honest about uncertainty, accessible on mobile, and connected to meaningful user control.





















Add Comment