TUOCA vs. Google Ads Scripts — When to Use a Script and When to Use a Platform
Comparing The Upload Offline Conversions App (TUOCA) with Google Ads Scripts for offline conversion uploads. Where scripts are powerful, where they break, and why most agencies eventually move to a managed platform.
Google Ads Scripts are JavaScript snippets that run inside the Google Ads UI with privileged access to your account’s data and APIs. They are extraordinarily powerful for in-platform automation: bid adjustments, budget management, custom reports. They can also upload offline conversions — and many sophisticated PPC teams have built scripts to do exactly that.
The Upload Offline Conversions App (TUOCA) is a managed platform purpose-built for offline conversion uploads. Where scripts are flexible building blocks, TUOCA is a finished system. The choice between them is the classic build-vs-buy question for one specific workload.
Overview
| TUOCA | Google Ads Scripts | |
|---|---|---|
| Form factor | Managed SaaS | JavaScript in Google Ads UI |
| Cost | Tiered subscription | Free (Google Ads native feature) |
| Skill required | None | Intermediate JavaScript |
| Data sources | 5+ native connectors + webhooks | Anything fetchable via HTTPS |
| Destinations | Google Ads, Meta, Microsoft, TikTok | Google Ads only (other platforms via direct API calls) |
| Execution time | Unlimited | 30 minutes per run |
| Error handling | Auto-classified, retry queue, dedup | DIY (try/catch + scheduled re-runs) |
| Multi-account scope | Native | MCC scripts (with caveats) |
| Maintenance owner | TUOCA | You |
If you have one Google Ads account, comfortable JavaScript skills, and a small data integration footprint, scripts can do the job for $0/month plus your engineering time. As accounts and integrations grow, the maintenance line crosses the platform line — and that’s when teams migrate.
Feature comparison
| Feature | TUOCA | Google Ads Scripts |
|---|---|---|
| Click conversions | Native | AdsApp.OfflineConversions() API |
| Call conversions | Native | Same API |
| Enhanced Conversions for Leads | Native | Direct API (UrlFetchApp + OAuth) |
| Meta CAPI | Native | DIY via UrlFetchApp |
| Microsoft Ads OCT | Native | DIY via UrlFetchApp |
| TikTok Events API | Native | DIY via UrlFetchApp |
| CallRail / CTM ingest | Native | DIY via API |
| ServiceTitan / Jobber ingest | Native | DIY via OAuth (hard in scripts) |
| Multi-source matching (Fusion) | Native | DIY |
| Multiple conversion actions per client | Native (Relay portfolio) | One script per action (or heavy parameterization) |
| Cross-channel composition (calls + CRM + forms) | Native | DIY |
| SHA-256 hashing | Auto | DIY (Utilities.computeDigest) |
| Hash-based dedup | Auto | DIY (script properties / spreadsheet state) |
| Per-record activity log | Native | Logger output (limited size) |
| Retry queue | Built-in | DIY (script triggers) |
| Multi-account / MCC | Native | MCC scripts, with restrictions |
Five key differentiators
1. Execution model
Google Ads Scripts run inside Google’s sandbox: 30 minutes maximum, capped UrlFetchApp calls, limited memory. For a small Google Ads account uploading a few hundred conversions, this is fine. For a large agency uploading tens of thousands across many accounts, the execution window becomes a hard ceiling — you start chunking work across multiple scheduled runs, juggling state in script properties or spreadsheets, and writing your own job-resumption logic.
TUOCA runs as a continuous service. Relays don’t time out. You don’t write resumption logic. The platform tracks state across runs automatically.
2. Data ingest at production quality
Pulling data from CallRail or CallTrackingMetrics in a script means:
- Storing API keys in script properties (no secret rotation primitives).
- Managing pagination manually with cursor tokens.
- Re-implementing rate-limit handling.
- Handling schema changes when the source adds or removes fields.
TUOCA’s Integrations are managed connectors with versioned schemas. CallRail’s recent schema additions don’t break your relays — TUOCA absorbs them.
For OAuth sources (ServiceTitan, Jobber, HubSpot, Google Sheets), this is even sharper: implementing OAuth refresh inside a Google Ads Script is technically possible but brittle. Token expirations cause silent failures that surface only when conversions stop appearing.
3. Multi-platform support
Scripts upload to Google Ads. Anything else — Meta CAPI, Microsoft Ads, TikTok — has to be done with raw API calls inside UrlFetchApp, including:
- OAuth flows for each platform.
- Per-platform schema (Meta is JSON; Microsoft is XML or JSON depending on the call; TikTok uses its own access tokens).
- Per-platform error handling.
- Per-platform retry logic.
You quickly end up with not one script but four, each with its own maintenance footprint. TUOCA covers all four destinations from a single configuration.
4. Error handling that knows the platform
Google Ads’ offline conversion API has a documented set of error codes:
CLICK_NOT_FOUND(try later)EXPIRED_CLICK(give up)UNPARSEABLE_GCLID(fix the data)INVALID_USER_IDENTIFIER(PII normalization issue)EVENT_TIME_TOO_OLD(out of lookback window)DUPLICATE_CLICK_CONVERSION_FOR_GBRAID_OR_WBRAID(dedup violation)
Each requires different handling. In a script, you’d read the response, parse partial_failure_error.details, and route accordingly. Most scripts implement this for CLICK_NOT_FOUND and treat everything else as a generic failure.
TUOCA’s Errors database catalogs every common error across all four platforms, and the platform routes each to the correct retry/reject behavior automatically. The same error knowledge is exposed publicly — your team can use it as a reference even if you’re still on scripts.
5. Visibility at the record level
Scripts log via Logger.log(). The execution log is capped (in size and history) and retains messages for a limited time. If a client asks “did the conversion from Tuesday upload?”, finding the answer in the script log is harder than it should be.
TUOCA’s Activity Logs keep per-record state indefinitely. Search by phone, email, GCLID, or order ID; see when the record was fetched, normalized, deduplicated (or not), uploaded, and what the platform said in response.
Why Relays Matter (Beyond One Conversion Action)
Most Google Ads Scripts that handle offline conversions look like this: one script, one source, one upload path, one conversion action. Adding a second conversion action means cloning the script, refactoring shared logic, or building a parameterized harness that quickly becomes its own engineering project.
TUOCA’s Relay model treats this as a configuration concern, not an engineering one. Each conversion action is its own Relay; sources can drive multiple Relays simultaneously; Fusion Relays cross-reference sources before upload.
| Business outcome | TUOCA Relay | Google Ads conversion action |
|---|---|---|
| Call > 60 seconds | CallRail → Google Ads | “Qualified Call” |
| Appointment booked | Form / CRM webhook → Google Ads | “Appointment Booked” |
| Quote sent | HubSpot stage → Google Ads | “Quote Sent” |
| Job completed (revenue) | CallRail + ServiceTitan (Fusion) → Google Ads | “Revenue Conversion” |
| Recurring plan signup | ServiceTitan plan → Google Ads | “Recurring Signup” |
Five conversion actions, five Relays, configured in a UI, replicable across clients via team templates. The equivalent in Google Ads Scripts is five scripts (or one heavy parameterized script), each with its own deployment, schedule, and maintenance window — multiplied by the number of accounts.
The closest non-script analog is Invoca Signals in the enterprise tier — custom rules producing discrete conversion events. TUOCA Relays cover the same conceptual ground at SMB/agency price points, and across any source — not just calls. See TUOCA vs. Invoca.
When Google Ads Scripts win
Scripts are the right call when:
- You manage one Google Ads account with a comfortable in-house engineering team.
- The script does more than offline conversions — it also runs reports, manages bids, generates ad text. Conversions are 10% of the script’s job.
- Your data is already in Google Sheets or Google Ads’ own reporting layer, where scripts have native access.
- You need a tightly customized rule — for example, “only upload conversions on weekdays for accounts with fewer than 100 clicks/day” — that doesn’t fit any platform’s UI.
- You’re allergic to recurring vendor costs and your team has the engineering capacity to absorb maintenance.
When TUOCA wins
- You upload conversions across multiple ad platforms. Scripts are Google-only.
- You have multiple Google Ads accounts. Even with MCC scripts, per-account maintenance compounds.
- Your data lives in CallRail, ServiceTitan, Jobber, HubSpot, or any non-Google source. Implementing managed connectors inside scripts is a project.
- You need Fusion — combining call tracking and CRM in a single conversion record.
- You want auditability — per-record state for support questions and compliance reviews.
- You don’t want to be the person who keeps the script running when you’re on vacation.
Migration: scripts to TUOCA
If you have a working script today, the migration plan is straightforward:
- Map your script’s data sources to TUOCA connectors. Most are native; webhooks cover the rest.
- Recreate each upload path as an Automated Relay. Same source, same destination, same conversion action — just configured instead of coded.
- Run both for one billing cycle. Compare daily upload counts and conversion totals.
- Disable the script. Keep the code archived in case you ever need to compare logic.
Many agencies migrate one Google Ads account at a time, taking 1-2 weeks total. The biggest unlock isn’t usually performance — it’s operational. The team stops being on call for the script.
A note on hybrid approaches
Some teams keep Google Ads Scripts for in-platform tasks (bid management, custom reports, audit scripts) and use TUOCA for offline conversion uploads. This is often the right answer. The two tools don’t conflict — they cover different layers of Google Ads operations.
Bottom line
| You’re… | Choice |
|---|---|
| …a single in-house team with one Google Ads account and JS skills | Scripts (with caveats) |
| …managing 5+ Google Ads accounts, mostly OCT work | TUOCA |
| …uploading to Meta, Microsoft, or TikTok in addition to Google | TUOCA |
| …combining call tracking and CRM data | TUOCA (Fusion Relays) |
| …running a script today that “mostly works” | Migrate when the next breakage hits |
Google Ads Scripts will keep being a great answer for in-platform automation. For offline conversion uploads specifically, the gap between what a script can do and what a managed platform like TUOCA does has widened to the point where most teams choose the platform.