Sorry for the long post, hopefully it’s enough to steer you in the right direction though.
The easiest way to mask the Dynamic Population is to use the Gravity Form Unique ID addon by Gravity Perks and create a long alphanumeric string as the ID in Form A. Then use Gravity Forms Populate Anything by (you guessed it) Gravity Perks to dynamically pull in the data based on the uniqueID.
With this approach the user will receive an email with a url that looks more like this:
It’s pretty much impossible for them to change the values with this method.
*btw, I have no affiliation to Gravity Perks and receive no compensation. I’m just a long time user/supporter of a large percentage of their products and it’s definitely the easiest way to do what you’re looking to do. *
On the flipside of that coin.
If you’d rather program it on your own, you could try something like sending the user:
Then you can program a plugin to grab the ID and use get_entry to pull back the data and then use the Dynamic Population Hook to set the data for each of the fields.
I’ve done something similar to this in the past with the addition of adding a lastName variable to the url. This is mainly used as a crude verification tool. You check the lastName against the invoice ID so that it makes it slightly more difficult for a user to see other invoices that don’t belong to them.
I should note… I did have our SEO team leader (rightfully) complain about that method though. Apparently if you have any information about the user in the URL when it hits Google Analytics it can cause some issues with privacy concerns (duh Nick… lol …). However, you could use other fields to verify, or none at all. In the end we wound up using a Unique ID and then left the all the dynamic population hooks because that work was already complete.