I pass through 2 parameters to the workflow that contains the SendGrid action. 99.9% of the time it works ok and it passes through all substitution tags to Sendgrid and the email looks great.
The data was missing because the workflow had privacy permissions turned on. Once I set the workflow to ignore privacy, the parameters are passed through to the workflow and the email populates ok.