Minting and dropping tokens for customers?

Hey guys,

need some advice.

Let’s say I am a company that has a list of 100000 customers and let’s assume also that I have all their public addresses (if needed).

Now, what would be the best way to mint and drop an ERC20 token (or tokens) to each of these 100000 users?

I assume a ‘push’ is not the way as not only would it cost too much gas, it would also be a huge transaction with a high chance of rollback if one piece failed half way through that 100000 iteration loop - right ?

Is the correct way to instead, mint the tokens into a contract, contact the users to tell them to claim… and then when they do claim to record the successful customer claim in a mapping in the contract e.g. mapping(address => boolean) addressesClaimed ?

While I think this would work… the problem is that logically it would be possible for any random/non-customer to also claim those tokens (if they somehow found out about the drop).

But maybe this could be solved by having customers initially ‘register’ with my contract so that I know anyone claiming is a real customer or not.