Você precisa truncar no
GROUP BY
também: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;
Sua versão está agregando por cada valor de data/hora, mas mostrando apenas o componente de data.
Além disso, recomendo que você use
current_date
em vez de now()
para que a primeira data não seja truncada.