I set up an achievement system using GameSparks for a Ziosk contract a few years ago. What you have sounds like a good start. I would add a versioning check as well, upon connection, verify local version vs back end version. If version of back end is greater, re-pull the data and store it locally.
I like the back end driven approach for achievements, the only caveat is to create tracking ‘events’ client side for all potential back end achievements, since you can’t change those without a new client build.
For an example, let’s say there is an achievement for killing 10 rats. Client side would have some kind of an event that is raised when an enemy is killed, and the type. Perhaps there is no achievement for this, or perhaps they need to acquire a ‘quest’ before tracking becomes active… all of this depends on your goals.
When your achievement json is loaded at the start/connection, your client will probably also wants an ‘active achievements’ per-client. If there is no active achievement for killing a rat, then there is no handler for it. If there is an active quest or achievement, a handler will respond to the kill, and increment the associated achievements for that type.
For example, you may have 2-3 achievements for killing a rat. One could be a ‘kill 10 rats’ quest. Another could be just global ‘kill rat’ counts, another could be a ‘kill rodent family’ count, etc. In any case, if something is listening for this ‘killevent’ of type ‘rat’. All of their handlers will update the client data for the achievements (local or database). If the achievement is complete, you’ll remove the handler for that achievement, and reward the prize. The prize could just be the badge, or an item, etc. It is all up to you.
Hopefully I didn’t go overboard trying to explain… so now let’s say you never created an event for ‘kill’ and of type ‘rat’. Or handlers to do something with that event. None of the back end achievements or handlers would work, and you would need to redistribute a new client with that event, for the achievement system to use.
You may want three different structures: achievement definitions, active achievements, and completed achievements.