I created one recently. Some tips:
1. Create variable for start, player joined the race, checkpoints XYZ that you will store, player position, max player joined and for the timers.
2. Start the start race timer and let players to know that the race started and how to join.
3. When the player will join the race, freeze him, change vitualworld (optional), and message them to wait.
4. When the start race timer will execute, check if the player are 2 or more, show the checkpoints and set the start race variable to true.
5. Check when a player join the checkpoint, destroy it and if is the last one, exit him from the race and tell him hi position and if is the latest player in the race, end the race else edit the position textdraw (if you use).
6. When he exit the checkpoint if the next one will be the last, show the end checkpoint or the normal one.
This is an idea on how to make it, I probably forgot some things but you can figure it out