Mike & crew, I think I've got to the bottom of it. (Mike - adding the utm_campaign was useful - thank you, but wasn't the cause of the problem)
Short answer: 301 redirects were breaking the tracking.
On the site in question we have products, parent products & child products (basically distinct SKU products but held under the parent - different sizing, or colours for example).
The site was still sending the original URL of the child product to google shopping (Rather than adopting the parent URL), the child URLs have a 301 redirect to the parent URLs.
So here's what was happening:
1. Someone clicks on the google product listing ad which contains within it the URL of the product. Google appends it's tracking info on that url (the &gclid=), including the tracking we've set so, utm_campaign, source etc.
2. That URL was being 301 redirected to the parent URL (so the customer eds up where they should!), but this in turn stripped the tracking from the URL.
3. Since there was no tracking after the 301 redirect, google couldn't see where it originated from.
Obviously it makes more sense to fix the root cause, rather than try to redirect the tracking info too (although I'm sure that could be done). We're changing the setup so that child URLs adopt the parent URL.
Hope this is clear. Thanks for all the help everyone.
Kind Regards
Ewan