My add-on allows being used in multiple documents for each user.
So I store payment information in user properties. If the user opens a
second document, and they are paid, they can still use the add-on
without paying again, because the payment status is store in user
properties. Using Properties Service avoids the need to make an
external request every time that the add-on needs to test the payment
status. But if something ever did go wrong with the data in properties
service, and the add-on didn't find a setting, it would make an external
request to check the payment data in my account. If you wanted the
user to pay for every document that the add-on was installed in, then
you'd need to put some setting in document properties.
Depending
upon whether you use PayPal or stripe, or whatever you use, and how you
implement it, the flow of events may be different depending upon how
the payment information can get back to your add-on. The stripe system I
have can communicate directly back to the add-on, through the server
code, but my PayPal implementation can't. It needs to go from PayPal,
back to a WebApp, and then store payment data in my spreadsheet, and
then the add-on searches the spreadsheet if there is a setting that a
payment was made.
So, I use User Properties to store local information about the payment status. You could put something into script properties temporarily, transfer it to user properties, and then delete it from script properties. For example, let's say that someone contacts you, and wants an extension to their trial. Or somehow your payment system had a problem, and you need to fix their payment date. You decide that it's okay, but you need a way to make a setting manually. You could manually update your database, or your spreadsheet, or you could add the user's email and new trial data end or paid until date to the script properties, and your code could check script properties for that special situation.