Para expandir o que @Logan Wayne apontou...
Então, em seu JavaScript, quando você pega referências aos seus elementos de dados de tabela, você sempre obterá a PRIMEIRA instância de um objeto Document com qualquer id que você fornecer.
// 2. Define what to do when XHR feed you the response from the server - Start
var product = document.getElementById("product").value; <-- will always return the same element
var pp1 = document.getElementById("pp1").value; <-- will always return the same element
var rp1 = document.getElementById("rp1").value; <-- will always return the same element
var stacking = document.getElementById("stacking").value; <-- will always return the same element
Você terá que atribuir ids exclusivos aos seus objetos td ou, novamente, como @Logan Wayne mencionou, utilizar a propriedade class dos objetos HTML DOM.
As classes podem ser usadas para agrupar elementos semelhantes. Após atribuir nomes de classe às diferentes colunas da sua tabela (Produto , Preço Promocional , Preço Normal , Empilhamento ) você pode usar getElementsByClassName() para obter uma matriz dos elementos td.
...
var products = document.getElementsByClassName("product"); <-- array of product td elements
...