Your numbers being higher than actual leads is a dead giveaway - it's almost always over-counting, not a missing pixel. i've seen this exact pattern in mobile app campaigns too. The usual suspects?
Attribution windows. Google and Meta credit a conversion against the click date with a 30-90 day lookback, while your client's CRM only registers leads that came in this month. those never reconcile, same as how Apple's SKAdNetwork and Google's App Campaigns count installs on different schedules.
spam and duplicates. Bot form fills and double-submits artificially inflate conversions but never turn into real leads - identical to click fraud in mobile installs.
Where the tag fires is the big one for Next.js. client-side routing means there's no hard page load on route changes, so firing conversion on a "thank you page view" is unreliable - misses real submits and double-fires on others. Fire the conversion on the form's success callback after the server confirms submission. Push a dataLayer event there and trigger off that, not the URL.
For the by-the-book setup on React/Next: push a custom dataLayer event on validated submit, then let GTM fan it out to GA4, Google Ads, and Meta. For accuracy that survives ad blockers and iOS, move to server-side tagging with Enhanced Conversions on the Google side and the Conversions API on the Meta side, using a shared event ID for dedup. Send hashed email and phone with it.
The real fix for lead gen specifically: stop optimising to raw form fills. Capture the gclid (and wbraid) and fbclid at submit, store them with the lead, and import qualified leads back as offline conversions once they're real in the CRM. Then platform numbers start matching booked jobs, and the algorithms optimise toward actual customers instead of junk. Same principle works for app install campaigns - feed back post-install purchase events.
on running Meta and Google together: use GA4 as the neutral source of truth with consistent UTMs across both, because neither platform will ever agree with the other. Practically, Meta drives demand and awareness in the service area, Google Search captures the intent when those people go looking. feeding the same offline conversion data into both is what actually makes them work together instead of just running in parallel.