Debe truncar en GROUP BY
también:
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;
Su versión se agrega por cada valor de fecha/hora, pero solo muestra el componente de fecha.
Además, le recomendaría que use current_date
en lugar de now()
por lo que la primera fecha no se trunca.