Devi troncare in GROUP BY
anche:
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;
La tua versione viene aggregata in base a ciascun valore di data/ora ma mostra solo il componente data.
Inoltre, ti consiglio di utilizzare current_date
invece di now()
quindi la prima data non viene troncata.