This is so much simpler than you would believe if you just have the right tips!
It can be done with just a Flat Rate for the zones and a Free rate. If you have classes like weight to consider there is a great plugin for that too.
What you need:
The Table Rate Shipping plugin if you need to assign classes like weight or type etc.
Say for example you have a low rate for some products and a higher rate for others.
The most important thing to remember is that the Zone at the top of the list over rides that at the bottom.
If you don’t stack them in the correct order it won’t work! So if you are using Rural code that needs to be at the top otherwise the whole of New Zealand will override it!