This is just a guess without seeing your code - but make sure you follow this pattern:
On the screen - users performs an actions (let's say they select to go to a certain place on the board and as a result they get 3 coins). When they click the space of the action they want to go - stop there and send the request to the server. The server records the actions and then notifies all players of the action. Upon the notification, you then perform the physical steps you want the user to see happen. (Both for them and other players as appropriate).
If you instead triggered all of the animations based on a click on the screen, and then sent the response to the server but did very little with the notification, then on the replay all you will get is the very little you did. The replay doesn't "click" the screen like the user did. Does that make sense?
So it goes like this:
You: I click on the screen to do X.
Server responds: you did X, now display it.
On the replay, you just get:
Server responds: you did X, now display it.
How you declare it is gone - so do as little (or non-important to a replay) as you can and let the notification be the thing that kicks off the screen updating.
On a side-note, I will say I've noticed that as the on-screen log of game events becomes really long, load times become a nightmare in turned based games. I know some developers have hacked it by deleting rows from the gamelog table but that simply kills replays altogether. The only thing I have found is that while you want to record everything with the server and then play the result from the notification, you can return an empty string "" and then nothing fills into the log on the screen, but the notification still fires and replays still work well. Let's say you had an undo option and you did this:
Player 1 moves to space A and gets 3 coins
Player 1 changes their mind
Player 1 moves to space B and gets 1 carrot
Player 1 changes their mind
Player 1 moves to space A and gets 3 coins
etc - that's going to kill your log. So for "intermediate" steps, perhaps don't return any text (just the empty string) - but then in the end only record in the log the final result. Granted, when you replay - you'll see all 5 of those moves above, but at least it's not eating up log space and load times don't seem to be hit by it.