IPA is a useful, but imperfect tool. As an example, here’s the IPA vowel chart:
You’ll notice on the bottom right, there’s [ʌ] as in “butt” [bʌt] and the next vowel down in the chart is [ɑ] as in “bought” [bɑt], which has a tongue position a couple of millimeters down from [ʌ]. But…how many tongue positions are located in *between* those two vowels? What if your tongue only went down 1mm instead of 2mm? What about 0.1mm? 0.001mm? Our options are either to have hundreds, or thousands, or infinite vowel symbols… or to land on a compromise and just pick a handful. This is exactly what IPA’s done.
In practice, that means that IPA is good for telling you a decent amount of information about what sounds you’re hearing, but it’s not accurate enough to tell you _everything_. That’s why we do minimal pair testing in our app; if we train your ears to know the differences between sounds in your native language and your target language, then your ears can get even more accurate than the IPA will be able to capture.