Products
SignupCops
Sign in with Google sends your visitor away and back, and the ad click ID is lost on the way. SignupCops holds the click ID in the visitor's session, joins it to the signup when your app calls identifyUser, and sends the signup to Meta, Google Ads and TikTok as a CompleteRegistration conversion. No CRM, no offline sync, no mapping step.
The problem
A visitor clicks your ad and lands with a gclid, fbclid or ttclid in the URL. They press Sign in with Google, leave your site for the login, and come back as a registered user. The click ID does not come back with them, and there is no form submit for a pixel to catch.Most teams already sync signups to their ad platforms through a CRM. The registration arrives, but with no click ID, so the platform files it as an unknown conversion and credits no ad. You paid for the click and got the customer, and the platform thinks the ad did nothing. The same happens with Sign in with Apple and any other login that redirects.
How it works
- Ad click. The DataCops script runs on your own domain and saves the click ID as the session starts.
- Session waits. While Google handles the login, the session keeps holding the click ID.
- identifyUser. Back on your site, your signup success handler calls
identifyUser(email, { ... }). - Joined. DataCops attaches the email, name, phone and your user ID to the waiting session, next to the click ID.
- Checked. The signup gets a verified profile: email risk, IP type (VPN, proxy, datacenter) and other accounts seen on the same device.
- Sent. A new, clean signup fires CompleteRegistration, delivered server-side to your connected ad accounts (Meta, Google Ads, TikTok, LinkedIn, Microsoft Ads, Reddit, Pinterest and X).
The ad platforms also receive the hashed email, so the signup still matches when the visitor arrived with no click ID at all.
Before you start
identifyUser is added to window.dcutils by the DataCops script. Install the
script on every page and subdomain where a signup can finish. Installing it on the root domain does not
cover app.yourdomain.com. Use the same cop key everywhere, because the key, not the domain,
routes every signup to your DataCops account.
window.dcutils existing is not proof the script works. It is a small queue that loads first.
The real engine, window.dataCopsAnalytics, appears a few seconds later. If it never appears on
a page, calls wait in the queue with no error. Check both in the console before debugging your own code.
The one call
Call identifyUser the moment a signup completes, on whichever page that happens. For Sign in
with Google or any OAuth login you already have the email in your success handler, so call it there, the
same as after a password form. DataCops cannot see an OAuth redirect on its own. This call is what makes it visible.
window.dcutils.identifyUser(email, {
externalId: user.id,
firstName: user.firstName,
lastName: user.lastName,
phone: user.phone,
signupMethod: 'google',
accountCreatedAt: user.createdAt,
}); Delivery starts on its own. There is nothing to map in the dashboard.
Send the full person
Every field in the second argument is optional. Send what your code has and leave the rest out. Never send placeholders. The session id, click IDs, IP, browser and ad cookies are attached by the script, so you never send those.
- externalId. Your own user ID. The strongest match field.
- firstName, lastName, phone. As stored. Phone with the country code. DataCops formats them for each platform.
- city, state, zip, country. Only if you store them. Otherwise DataCops uses the session location.
- value, currency. What the signup is worth, such as a plan price or deposit. Platforms bid on this.
- signupMethod. email, google, apple or phone.
- accountCreatedAt. The real account creation time. Needed for correct counting, see below.
A later call with fewer fields never erases richer data sent earlier.
Signup or sign-in
Call identifyUser after sign-in as well as signup. The first call for an email is the signup,
and later calls merge onto the same person. Pass accountCreatedAt: an account created more than
an hour before the call is treated as a sign-in and no conversion is sent. Without it, every email DataCops
sees for the first time counts as a signup, including users who existed before you installed DataCops.
Risky signups
Signups whose email scores high or critical risk, or uses a disposable domain, are saved and shown to you but held back from your ad platforms. Signups from sessions already flagged as bots are not enriched, so their details never ride on a conversion. Each signup also lists other emails seen on the same device, which makes free-trial and referral abuse visible. Blocking a signup outright is a separate, optional server-side step.
Consent
Opening an account and sending the email to ad platforms are two different things. Requiring your terms to create an account is fine. Sending the email to Meta, Google or TikTok needs its own basis.
- Outside the EU and UK. A clear line next to the signup button linking your terms and privacy policy is usually enough. Never use a pre-ticked box.
- EU and UK visitors. The ads use must be separate and freely given. Use an unticked optional checkbox, or gate the call on your existing consent banner. Only call
identifyUserwhen it is given. The account is created either way.
Check it worked
Do a real signup through your ad-style URL, for example with ?gclid=test123, then open Signup
conversions in the DataCops dashboard. The signup should appear within seconds with its click ID, and the
delivery log shows what was sent to each platform and why anything was skipped. If you also use DataCops
automatic form capture, both paths write to the same record by email, so one signup never sends twice.