Skip to main content

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 item
  • click - User clicks on a recommendation
  • purchase - User completes a purchase/conversion
  • add_to_cart - Item added to shopping cart
  • wishlist - Item added to wishlist
  • share - Recommendation shared with others
  • dismiss - 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

  1. Missing Decision ID

    • Ensure you're capturing and passing the decision_id from recommendation responses
  2. Invalid API Key

    • Verify your access token is valid and not expired
    • Use the refresh token mechanism if needed
  3. 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