This is very implementation specific and there is not one rule that one should be done before the other, and joint estimation another option where there isn't a clear order of events.
A consideration is how well your carrier tracking approach works under timing offsets, and similarly how well your code tracking approach works under carrier offsets. I recommend analyzing/simulating this specifically for your implementation since it is very application specific and you didn't provide any info about your waveform or algorithms for timing and carrier recovery. For example, the Gardner Timing Error Detector works very well with relatively large carrier offsets but has higher noise than the Mueller and Mueller detector (M&M), but the M&M being decision based does not perform well with relatively much smaller carrier offsets.
One suggested approach to quantifying this for your specific implementation/application: determine your pre-decision signal SNR with fixed SNR received signal input as you vary both carrier offset and timing offset. Also you can look at the noise of your symbol timing and carrier error estimators as another metric: determine what the noise is on the symbol timing error as your carrier offset is varied (When you are close to your track point for tracking considerations, and when you are further away for acquisition considerations). Similarly, determine what the noise is on the carrier error as your timing offset is varied. If you do this work, please do share it with us here.