diff --git a/dashboard-server/klaviyo-server/services/events.service.js b/dashboard-server/klaviyo-server/services/events.service.js
index 3a26fab..ec25d58 100644
--- a/dashboard-server/klaviyo-server/services/events.service.js
+++ b/dashboard-server/klaviyo-server/services/events.service.js
@@ -1527,7 +1527,82 @@ export class EventsService {
prevPeriodEnd = prevRange.end;
}
- // Load both current and previous period data
+ // For refunds and cancellations, we need to fetch those specific events
+ if (metric === 'refunds' || metric === 'cancellations') {
+ const [currentEvents] = await Promise.all([
+ this.getEvents({
+ ...params,
+ startDate: periodStart.toISO(),
+ endDate: periodEnd.toISO(),
+ metricId: metric === 'refunds' ? METRIC_IDS.PAYMENT_REFUNDED : METRIC_IDS.CANCELED_ORDER
+ })
+ ]);
+
+ // Transform events
+ const transformedEvents = this._transformEvents(currentEvents.data || []);
+
+ // Initialize daily stats map with all dates in range using TimeManager's day start
+ const dailyStats = new Map();
+ let currentDate = periodStart;
+ while (currentDate <= periodEnd) {
+ const dateKey = currentDate.toFormat('yyyy-MM-dd');
+ dailyStats.set(dateKey, {
+ date: currentDate.toISO(),
+ timestamp: dateKey,
+ total: 0,
+ count: 0,
+ reasons: {},
+ items: []
+ });
+ currentDate = this.timeManager.getDayStart(currentDate.plus({ days: 1 }));
+ }
+
+ // Process events
+ for (const event of transformedEvents) {
+ const datetime = this.timeManager.toDateTime(event.attributes?.datetime);
+ if (!datetime) continue;
+
+ // Get the day start for this event's time
+ const dayStart = this.timeManager.getDayStart(datetime);
+ const dateKey = dayStart.toFormat('yyyy-MM-dd');
+ if (!dailyStats.has(dateKey)) continue;
+
+ const dayStats = dailyStats.get(dateKey);
+ const props = event.event_properties || {};
+ const amount = Number(metric === 'refunds' ? props.PaymentAmount : props.TotalAmount || 0);
+ const reason = props.CancelReason || props.OrderMessage || 'No reason provided';
+ const orderId = props.OrderId || props.FromOrder;
+
+ dayStats.total += amount;
+ dayStats.count++;
+ dayStats.reasons[reason] = (dayStats.reasons[reason] || 0) + 1;
+ dayStats.items.push({
+ orderId,
+ amount,
+ reason,
+ datetime: datetime.toISO()
+ });
+
+ dailyStats.set(dateKey, dayStats);
+ }
+
+ // Convert to array and sort by date
+ const stats = Array.from(dailyStats.values())
+ .sort((a, b) => a.date.localeCompare(b.date))
+ .map(day => ({
+ ...day,
+ [metric === 'refunds' ? 'refunds' : 'canceledOrders']: {
+ total: day.total,
+ count: day.count,
+ reasons: day.reasons,
+ items: day.items
+ }
+ }));
+
+ return stats;
+ }
+
+ // For other metrics, continue with existing logic
const [currentResponse, prevResponse] = await Promise.all([
this.getEvents({
...params,
diff --git a/dashboard/src/components/dashboard/StatCards.jsx b/dashboard/src/components/dashboard/StatCards.jsx
index f1e70c4..4c91dc9 100644
--- a/dashboard/src/components/dashboard/StatCards.jsx
+++ b/dashboard/src/components/dashboard/StatCards.jsx
@@ -1097,10 +1097,27 @@ const StatCards = ({
}
});
const data = response.data.stats;
- setCacheData(detailTimeRange, metric, data);
- setDetailData(prev => ({ ...prev, [metric]: data }));
+
+ // Transform the data to match the expected format
+ const transformedData = data.map(day => ({
+ ...day,
+ timestamp: day.timestamp,
+ refunds: metric === 'refunds' ? {
+ total: day.refunds?.total || 0,
+ count: day.refunds?.count || 0,
+ reasons: day.refunds?.reasons || {}
+ } : undefined,
+ canceledOrders: metric === 'cancellations' ? {
+ total: day.canceledOrders?.total || 0,
+ count: day.canceledOrders?.count || 0,
+ reasons: day.canceledOrders?.reasons || {}
+ } : undefined
+ }));
+
+ setCacheData(detailTimeRange, metric, transformedData);
+ setDetailData(prev => ({ ...prev, [metric]: transformedData }));
setError(null);
- return data;
+ return transformedData;
}
// For order range
@@ -1293,6 +1310,7 @@ const StatCards = ({
case 'average_order':
return ;
case 'refunds':
+ case 'cancellations':
case 'order_range':
case 'pre_orders':
case 'local_pickup':
@@ -1331,6 +1349,8 @@ const StatCards = ({
return ;
case 'refunds':
return ;
+ case 'cancellations':
+ return ;
case 'order_range':
return ;
case 'pre_orders':