The short answer is:
The reason your contacts are not showing up in the HubSpot Marketing > Ads report, despite having the UTMs correctly captured, is likely a disconnect between HubSpot’s ad tracking cookie and the contact creation method.
HubSpot’s Ads tool relies on its own tracking cookie to link a contact to an ad click ID (gclid) and the correct ad campaign in the ad reporting dashboard, but your process of using Gravity Forms’ HubSpot add-on to push form fields, including UTMs, as contact properties bypasses this specific ad-tracking mechanism.
The ad platform report needs to see the click ID, which is typically stored in the HubSpot cookie, not just the UTM parameters you are passing manually.
The solution is to transition to a server-side tracking approach using the Google Ads API and the HubSpot API to send the conversion data and gclid directly, ensuring the ad platform gets the confirmation it needs to populate the HubSpot Ads dashboard 
The long answer is:
Your setup is common, and you have correctly identified that manually passing UTM parameters via hidden fields or a tool like UTMGrabber HandL gets the marketing source information onto the contact record.
However, the HubSpot Ads tool relies on two critical pieces of data to link a conversion to a specific ad campaign in its dashboard: the gclid (Google Click Identifier) and the HubSpot tracking cookie.
When a user clicks a Google Ad, the gclid is appended to the URL.
The HubSpot tracking code on your website captures this gclid and stores it in the user’s browser cookie.
When the user fills out a form, HubSpot’s native forms or its direct integration mechanism checks this cookie and uses the stored gclid to tell the HubSpot Ads tool which specific ad the conversion belongs to.
By using the Gravity Forms HubSpot add-on to push contact properties, you are only sending the UTMs that were present in the URL or stored by your UTMGrabber tool; you are not necessarily sending the gclid or triggering the specific server-side event that HubSpot’s Ads tool needs to create the link.
The HubSpot ad platform is likely not seeing the event that links the conversion to the stored cookie data.
A far more reliable and robust solution that overcomes cookie dependency and integration ambiguity is to create a server-side pipeline.
This would involve configuring Gravity Forms to send its submission data via a Gravity Forms REST API v2 call or webhook to a server-side environment like Stape or Google Cloud Platform, managed by Google Tag Manager.
When the form submits, your server-side script intercepts the data, including the gclid (which should be captured by a hidden field in your form and passed along).
This script would then use the Google Ads API to send the conversion back to Google, giving Google the direct confirmation it needs for its internal reporting.
Simultaneously, the script would use the HubSpot API to create or update the contact, making sure to explicitly pass the gclid and any other necessary tracking identifiers directly to the contact record via the API payload.
This method guarantees that the critical gclid is present in both your conversion confirmation (for Google) and the contact record (for HubSpot), ensuring that HubSpot’s reporting correctly attributes the contact to the campaign within the HubSpot Ads dashboard, regardless of any browser-side cookie issues 
This comment was generated with the assistance of an AI tool, incorporating my expertise in conversion tracking 