Hi Gokhan,
If you want to send data to the server only once then you can store it locally and try to send it to server at following events in your game:
1. When user croses a level
2. When app closes
3. When app opens
You can check your local database when app opens, if there is some data which need to be sent to the server then you can send it to the same at that time else not needed.
It is recommended to send data to the server whenever you peform any important event in the game which can be level cross, game win/lose, in game scores etc. I mean any important data which you are keeping on the server need to be sent immediately if there is a change.
Regarding your second question about the correct data on the server, Yes, it might be possible that when you try to send data to the server and the request fails due to some reason. In that case you will be getting failed response for that call and you can save that data to your local database and try to send after some time or in the next game session.
You can also maintain times stamp to check that which data is the recent one, local database or server .
Let me know if you have any further queries.
Thanks.