Comparison 8 min read

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

TUOCAGoogle Ads Scripts
Form factorManaged SaaSJavaScript in Google Ads UI
CostTiered subscriptionFree (Google Ads native feature)
Skill requiredNoneIntermediate JavaScript
Data sources5+ native connectors + webhooksAnything fetchable via HTTPS
DestinationsGoogle Ads, Meta, Microsoft, TikTokGoogle Ads only (other platforms via direct API calls)
Execution timeUnlimited30 minutes per run
Error handlingAuto-classified, retry queue, dedupDIY (try/catch + scheduled re-runs)
Multi-account scopeNativeMCC scripts (with caveats)
Maintenance ownerTUOCAYou

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

FeatureTUOCAGoogle Ads Scripts
Click conversionsNativeAdsApp.OfflineConversions() API
Call conversionsNativeSame API
Enhanced Conversions for LeadsNativeDirect API (UrlFetchApp + OAuth)
Meta CAPINativeDIY via UrlFetchApp
Microsoft Ads OCTNativeDIY via UrlFetchApp
TikTok Events APINativeDIY via UrlFetchApp
CallRail / CTM ingestNativeDIY via API
ServiceTitan / Jobber ingestNativeDIY via OAuth (hard in scripts)
Multi-source matching (Fusion)NativeDIY
Multiple conversion actions per clientNative (Relay portfolio)One script per action (or heavy parameterization)
Cross-channel composition (calls + CRM + forms)NativeDIY
SHA-256 hashingAutoDIY (Utilities.computeDigest)
Hash-based dedupAutoDIY (script properties / spreadsheet state)
Per-record activity logNativeLogger output (limited size)
Retry queueBuilt-inDIY (script triggers)
Multi-account / MCCNativeMCC 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 outcomeTUOCA RelayGoogle Ads conversion action
Call > 60 secondsCallRail → Google Ads“Qualified Call”
Appointment bookedForm / CRM webhook → Google Ads“Appointment Booked”
Quote sentHubSpot stage → Google Ads“Quote Sent”
Job completed (revenue)CallRail + ServiceTitan (Fusion) → Google Ads“Revenue Conversion”
Recurring plan signupServiceTitan 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:

  1. Map your script’s data sources to TUOCA connectors. Most are native; webhooks cover the rest.
  2. Recreate each upload path as an Automated Relay. Same source, same destination, same conversion action — just configured instead of coded.
  3. Run both for one billing cycle. Compare daily upload counts and conversion totals.
  4. 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 skillsScripts (with caveats)
…managing 5+ Google Ads accounts, mostly OCT workTUOCA
…uploading to Meta, Microsoft, or TikTok in addition to GoogleTUOCA
…combining call tracking and CRM dataTUOCA (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.

Frequently Asked Questions

Yes, for a simple click conversion, with AdsApp.OfflineConversions() inside Google Ads. If the script also needs to send a hashed email, or it runs outside Google Ads and calls the API itself, send the job through the Data Manager API. After June 15, 2026, a developer token that was not already uploading is rejected on the old upload call. Scripts also stop at 30 minutes, throttle outbound requests, and give you a thin log when a row fails.

Three big ones. (1) Execution time: 30 minutes per script run, which is tight for large datasets. (2) Data access: scripts can fetch from external URLs but managing API keys and OAuth for sources like CallRail, ServiceTitan, or HubSpot inside a script is fragile. (3) MCC scope: a script attached to a single Google Ads account doesn't see data for other accounts; running a single script across an MCC requires the MCC-level Scripts feature with its own caveats.

Three reasons keep showing up. First, every Google Ads API change requires script updates across every client account. Second, debugging happens in the Scripts log viewer, which is less informative than a per-record activity log. Third, scripts only handle Google Ads — Meta CAPI, Microsoft Ads, and TikTok Events API are out of scope, so agencies end up with one solution per platform anyway.

Yes, scripts themselves are free. The hidden cost is engineering time: writing, testing, maintaining, and debugging scripts across multiple client accounts. For a single in-house team running one Google Ads account, scripts can be very cost-effective. For agencies with 10+ accounts, the maintenance burden typically exceeds the cost of a managed platform within months.

For offline conversion upload workflows, yes. TUOCA's [Automated Relays](/product/automated-relays/) handle the same data flows scripts implement (fetch from a source, transform, upload to Google Ads) with no code, no execution-time limits, and a per-record audit trail. For non-OCT scripting (bid management, budget pacing, ad text rotation), Google Ads Scripts remain the right tool — TUOCA doesn't replace those use cases.

Stop Guessing. Start Proving ROI.

TUOCA connects your CRM and call tracking data directly to your ad platforms. Set up in minutes.