Hice un cambio en un endpoint que actualizaba el precio de un producto y llamé revalidatePath('/productos'). Funcionó. El precio se actualizó. Lo que no vi hasta dos días después es que esa misma ruta servía filtros, categorías y una vista de comparación que dependían del mismo layout — y todo eso se volvió a generar de cero en la siguiente request, aunque nada de eso había cambiado. Cache tirado a la basura por invalidar de más.

Ahí entendí que no era un tema de "cuál función usar" sino de que estaba pensando en rutas cuando tenía que pensar en datos. revalidatePath invalida por dónde vive el contenido. revalidateTag invalida por qué es el contenido. Son dos granularidades distintas y elegir mal una no rompe nada visualmente — rompe el cache silenciosamente, de una forma que solo se nota mirando métricas de build o tiempos de respuesta.

Mi tesis, después de pisar ese charco: revalidatePath es la herramienta de fuerza bruta y revalidateTag es la de precisión, y la mayoría usa la primera por default porque es la que aparece primero en los ejemplos de la documentación, no porque sea la correcta para su caso. Y lo digo con la cicatriz fresca: elegí mal una vez y me enteré tarde.

nextjs revalidate cache: qué dice la documentación oficial