*UPDATE: a few readers have run into an issue with the goats milk curdling partway through cooking. The cause seems to be using raw or unpasteurized goats milk, so I recommend using only pasteurized milk in this recipe. When I'm able to get my hands on some raw goats milk, I promise I'll play around with the recipe and see if there's a way to fix this issue, but in the meantime, using pasteurized milk should prevent any issues.
Some of the goats milk can be replaced with cows milk for a slightly less tangy flavor, or all of it can be replaced to make a decadent cows milk dulce de leche.
Piloncillo is a form of unrefined brown sugar, and adds a little extra depth of flavor. It can be purchased in some specialty stores or online, or it can be substituted one-for-one with regular dark brown sugar, or other types of brown sugar like turbinado, muscovado, or even coconut sugar.
This recipe makes about 1½ cups of cajeta, which is great for someone like me with no willpower. If you want a bigger batch, the recipe can easily be doubled or trippled -- just keep in mind that the bigger the batch, the longer it will take to reduce.