Feedback SDKs
Track user interactions and feedback signals to improve recommendation accuracy and business outcomes.
Overview
Feedback tracking is essential for:
- Improving Recommendations - Learn from user behavior to enhance future suggestions
- Measuring Performance - Track conversion rates and engagement metrics
- Business Intelligence - Understand user preferences and patterns
- A/B Testing - Compare different recommendation strategies
Installation
Python SDK
pip install dodo-decisions
JavaScript/Node.js SDK
npm install @dodo/sdk
Python SDK
Initialization
import dodo
# Initialize SDK with your access token
client = dodo.Client(api_key="your_access_token")
Tracking User Interactions
Product Views
# Track when user views a recommended product
client.track({
"user_id": "user123",
"decision_id": "dec_123456",
"context": {
"item_id": "warm-sweater-123",
"page": "product_detail",
"event": "product_view",
"timestamp": "2025-10-24T10:30:00Z"
}
})
Click Events
# Track clicks on recommendations
client.track({
"user_id": "user123",
"decision_id": "dec_123456",
"context": {
"item_id": "running-shoes-456",
"page": "homepage",
"event": "recommendation_click",
"position": 1, # Position in recommendation list
"timestamp": "2025-10-24T10:35:00Z"
}
})
Purchases/Conversions
# Track successful conversions
client.track({
"user_id": "user123",
"decision_id": "dec_123456",
"context": {
"item_id": "warm-sweater-123",
"page": "checkout",
"event": "purchase",
"value": 89.99,
"currency": "USD",
"timestamp": "2025-10-24T11:00:00Z"
}
})
Negative Feedback
# Track when user dismisses or ignores recommendations
client.track({
"user_id": "user123",
"decision_id": "dec_123456",
"context": {
"item_id": "unwanted-item-789",
"page": "search_results",
"event": "recommendation_dismiss",
"reason": "not_interested",
"timestamp": "2025-10-24T10:40:00Z"
}
})
Batch Tracking
# Track multiple events at once
events = [
{
"user_id": "user123",
"decision_id": "dec_123456",
"context": {"event": "view", "item_id": "item1"}
},
{
"user_id": "user123",
"decision_id": "dec_123456",
"context": {"event": "click", "item_id": "item2"}
}
]
client.track_batch(events)
JavaScript SDK
Browser Implementation
import { DodoClient } from '@dodo/sdk';
// Initialize SDK
const dodo = new DodoClient('your-api-key');
// Track product views
dodo.track('view', {
user_id: 'user123',
decision_id: 'dec_123456',
context: {
item_id: 'warm-sweater-123',
page: 'product_detail',
event: 'product_view',
position: 1
}
});
// Track clicks
dodo.track('click', {
user_id: 'user123',
context: {
item_id: 'running-shoes-456',
page: 'homepage',
event: 'recommendation_click',
position: 2
}
});
// Track purchases
dodo.track('purchase', {
user_id: 'user123',
decision_id: 'dec_123456',
context: {
item_id: 'warm-sweater-123',
page: 'checkout',
event: 'purchase',
value: 89.99,
currency: 'USD'
}
});
Node.js Backend Implementation
const { DodoClient } = require('@dodo/sdk');
const dodo = new DodoClient('your-api-key');
// Track server-side events
async function trackConversion(userId, decisionId, itemId, value) {
try {
await dodo.track('purchase', {
user_id: userId,
decision_id: decisionId,
context: {
item_id: itemId,
event: 'purchase',
value: value,
currency: 'USD',
timestamp: new Date().toISOString()
}
});
console.log('Conversion tracked successfully');
} catch (error) {
console.error('Error tracking conversion:', error);
}
}
Event Types
Standard Events
view- User views a recommended itemclick- User clicks on a recommendationpurchase- User completes a purchase/conversionadd_to_cart- Item added to shopping cartwishlist- Item added to wishlistshare- Recommendation shared with othersdismiss- User ignores/dismisses recommendation
Custom Events
You can define custom events specific to your business:
# Media website example
client.track({
"user_id": "user123",
"decision_id": "dec_123456",
"context": {
"article_id": "ai-breakthrough-2025",
"page": "article_page",
"event": "article_read_complete",
"read_time": 245, # seconds
"scroll_depth": 0.95
}
})
# Travel website example
client.track({
"user_id": "user123",
"decision_id": "dec_123456",
"context": {
"hotel_id": "luxury-resort-789",
"page": "booking_page",
"event": "booking_initiated",
"stay_duration": 7,
"room_type": "suite"
}
})
Best Practices
1. Always Include Decision ID
# ✅ Good - Includes decision_id
client.track({
"user_id": "user123",
"decision_id": "dec_123456", # Links feedback to specific recommendation
"context": {"event": "click", "item_id": "item123"}
})
# ❌ Bad - Missing decision_id
client.track({
"user_id": "user123",
"context": {"event": "click", "item_id": "item123"}
})
2. Use Consistent User IDs
Ensure the same user_id is used across all tracking for a given user.
3. Include Timestamps
import datetime
client.track({
"user_id": "user123",
"decision_id": "dec_123456",
"context": {
"event": "purchase",
"timestamp": datetime.datetime.utcnow().isoformat() + "Z"
}
})
4. Handle Errors Gracefully
try:
client.track(event_data)
except Exception as e:
# Log error but don't break user experience
logger.error(f"Failed to track event: {e}")
Direct API Integration
If you prefer not to use SDKs, you can track feedback directly via API:
curl -X POST "https://api.trydodo.xyz/api/feedback/track?project_id=${PROJECT_ID}" \
-H "Authorization: Bearer ${ACCESS_TOKEN}" \
-H "Content-Type: application/json" \
-d '{
"project_id": "your_project_id",
"decision_id": "dec_123456",
"feedback": "positive",
"created_at": "2025-10-24T00:00:00Z"
}'
Data Privacy
- No PII - Avoid sending personally identifiable information
- Data Minimization - Send only necessary data for feedback tracking
- User Consent - Ensure proper consent mechanisms are in place
- GDPR Compliance - Follow applicable data protection regulations
Troubleshooting
Common Issues
-
Missing Decision ID
- Ensure you're capturing and passing the
decision_idfrom recommendation responses
- Ensure you're capturing and passing the
-
Invalid API Key
- Verify your access token is valid and not expired
- Use the refresh token mechanism if needed
-
Network Issues
- Implement retry logic for failed requests
- Consider batching events to reduce API calls
Debug Mode
Enable debug logging to troubleshoot issues:
import logging
logging.basicConfig(level=logging.DEBUG)
client = dodo.Client(api_key="your_token", debug=True)
Next Steps
- Analytics Overview - Track recommendation effectiveness
- Quick Start Guide - Get started with recommendations
- API Reference - Complete API documentation