Datastores are fairly easy to use, but are prone to errors and subsequent data loss. Instead of using datastores directly, you should take a look at DataStore2 and ProfileService. ProfileService offers an enormours array of features, but might be difficult to setup for beginners. DataStore2 is much more limited, but easier to use.
In case you want to use Roblox’s datastore service, first call service:GetDatastore(storename) (in your case, the name would be “shells” or something). This will get the previously created datastore or create a new one.
There are 2 methods for saving data: SetAsync(keyname,value) and UpdateAsync(keyname,function). UpdateAync accepts 2 arguments, one being the key’s name (usually the ID of the player you want to save the data for) and the other being a function that should return the value you want to save. That function’s argument is the existing value so you can handle any issues properly. I would recommend never using SetAsync as it essentially brute forces the data into the store, ignoring whether some other server is trying to edit it., while UpdateAsync runs in a queue.
There is only one method for getting data: GetAsync(keyname). Don’t really need to explain much here.
When saving data, make sure your table doesn’t have mixed indices (numbers only or strings only) and that the values don’t contain and instances as you might end up with weird bugs.
Finally, make sure you wrap all method calls in pcall as any internal error will stop your script. By catching that exception, you can handle the errors properly and quickly debug in case it was a mistake on your end.
I’m not going to write anything about DataStore2 and ProfileService here as they have more than enough good tutorials.