Sie müssen in GROUP BY
abschneiden auch:
SELECT created_at::date, COUNT(*)
FROM table_name
WHERE product_uuid = '586d8e21b9529d14801b91bd' AND
created_at > now() - interval '30 days'
GROUP BY created_at::date
ORDER BY created_at::date ASC;
Ihre Version aggregiert nach jedem Datums-/Uhrzeitwert, zeigt aber nur die Datumskomponente.
Außerdem würde ich empfehlen, dass Sie current_date
verwenden statt now()
das erste Datum wird also nicht abgeschnitten.