Google Ads Scheduled Feeds

This guide shows how to connect Konektor to Google Ads Scheduled Uploads so Google Ads automatically pulls your lead data as:

  1. Offline Conversions — to optimize bidding based on real-world conversions (chat → deal).
  2. Customer Match — to target/exclude audiences, build lookalikes, or run remarketing.

How it works: Konektor exposes two CSV URLs per workspace. Google Ads fetches them on a schedule (Daily / Weekly / Monthly) using HTTP Basic Auth. All PII (email, phone, name) is SHA-256 hashed before transit, per Google's official spec.

Architecture

[Konektor DB]  ──▶  /v1/google/feeds/{code}/offline-conversions.csv  ──▶  Google Ads (Scheduled)
              ──▶  /v1/google/feeds/{code}/customer-match.csv        ──▶  Google Ads (Scheduled)
                   ▲
                   │
              HTTP Basic Auth
              (Username + Password you generate)
  • Protocol: HTTPS (required).
  • Auth: HTTP Basic Auth (Google Ads standard).
  • Format: CSV per Google's official spec (see below).
  • Content: Generated on-demand when Google fetches — always fresh.

Prerequisites

  1. Workspace already has a Tracking Code (auto-created at signup).
  2. An active Google Ads account with Admin / Standard access.
  3. (For offline conversions) Conversion Actions already created in Google Ads with matching names.

Step 1 — Generate Credentials in Konektor

  1. Sign in to Konektor → select the workspace to connect.
  2. Go to Google Ads Feeds (in the Owner sidebar).
  3. Click "Generate Credentials".
  4. Copy the password displayed right now — it's shown only once. Save to your password manager.
  5. Also copy the Username and both feed URLs (offline & customer match).
The password is stored as PBKDF2-SHA-256 (100,000 iterations, random salt per workspace). Konektor NEVER stores plaintext passwords. If you forget it, click "Rotate Password" to create a new one — any active Google Ads schedule will be broken.

Step 2 — Set Up Offline Conversions

2a. Create Conversion Actions in Google Ads

  1. Google Ads → Tools & SettingsConversionsNew conversion action.
  2. Pick ImportOther data sources or CRMsTrack conversions from clicks.
  3. Set Name to match your Konektor lead statuses (default: new, qualified, won, etc.) — or use name-map in feed settings.
  4. Repeat for every status you want to import.

2b. Create the Schedule

  1. Google Ads → Tools & SettingsConversionsUploadsSchedules.
  2. Click +HTTPS.
  3. Paste the offline conversions URL from Konektor:
    https://konektor.id/v1/google/feeds/WS-XXXXXX/offline-conversions.csv
    
  4. Enter the Username and Password from Konektor.
  5. Pick a frequency:
    • Daily (recommended) — enough for most cases.
    • Weekly / Monthly — for low-volume workspaces.
  6. Click Save.
  7. Click "Upload preview" — Google Ads will immediately test-fetch your file.

2c. CSV Output Example

Parameters:TimeZone=+0700
Email,Phone Number,Conversion Name,Conversion Time,Conversion Value,Conversion Currency
a3f1b2c...,e5d8f7a...,qualified,2026-04-21 10:30:00,100000,IDR
d92fe8b...,c7b3a14...,won,2026-04-20 15:22:11,2500000,IDR
  • Parameters:TimeZone — Required. Default +0700 (Jakarta). Change in settings if elsewhere.
  • Email / Phone Number — SHA-256 hashed. Email lowercased & trimmed, phone normalized to E.164 (+62…).
  • Conversion Name — lead status (or custom mapping).
  • Conversion Timeyyyy-MM-dd HH:mm:ss in the declared time zone.
  • Conversion ValueactualValue ?? estimatedValue ?? 0.
  • Conversion Currency — ISO-4217 (default IDR).

Step 3 — Set Up Customer Match

3a. Create Customer List in Google Ads

  1. Google Ads → Tools & SettingsAudience managerCustomer lists.
  2. +Upload data source: Scheduled (via HTTPS).
  3. Paste the customer match URL from Konektor:
    https://konektor.id/v1/google/feeds/WS-XXXXXX/customer-match.csv
    
  4. Enter Username and Password.
  5. Pick a frequency (Daily / Weekly / Monthly).
  6. Check the consent confirmation checkbox for customer-data use per Google's policy.

3b. CSV Output Example

Email,Phone,First Name,Last Name,Country,Zip
a3f1b2c...,e5d8f7a...,f4a2b1e...,8c3d7b2...,ID,
d92fe8b...,c7b3a14...,a1b2c3d...,,ID,
  • All PII SHA-256 hashed (lowercase hex).
  • Country — ISO-2 code (default ID), not hashed.
  • Zip — optional, not hashed.
  • Requires Email OR Phone at minimum. Leads without either are skipped.

Advanced Settings

Status Filter

By default the offline feed sends all statuses. Pick specific ones if you want Google Ads to import only key milestones (e.g. qualified, won).

Custom Name Map

If you want conversion names in Google Ads to differ from Konektor statuses:

Konektor StatusName in Google Ads
qualifiedQualified Lead
wonPaid Conversion

Configure via the UI or PATCH the API directly:

{
  "offlineNameMap": {
    "qualified": "Qualified Lead",
    "won": "Paid Conversion"
  }
}

Rolling Window

Default offline feed window = last 90 days (by updatedAt). This keeps the payload light and follows Google's guidance (don't re-send ancient conversions). Configurable via the windowDays slider (1–540).

The click has its own 90-day limit. Google rejects an imported event when the ad click that created the lead is older than 90 days. The rolling window looks at updatedAt, so a slow deal can move a very old click back into range. Konektor skips those rows for you, so the CSV never carries a row that Google will reject.A lead with a sales cycle longer than 90 days cannot be imported as an offline conversion. Use Customer Match for that audience instead.

Timezone

Default +0700 (Jakarta). Change if your workspace is in a different zone. Format: +HHMM or -HHMM.

Security Practices

  • ✅ Passwords hashed with PBKDF2-SHA-256, 100k iterations.
  • ✅ Verification uses timing-safe compare.
  • ✅ Rate limited at 60 req/min per IP (plenty for Google's daily polling).
  • ✅ HTTPS-only (Cloudflare TLS).
  • ✅ 404 (not 401) for unknown workspace codes → no enumeration.
  • Cache-Control: private, no-store → feed is never cached by public CDNs.
  • ✅ Audit trail: last fetch timestamp + row count stored per feed.

Troubleshooting

"401 Unauthorized" in the Google Ads preview

  • Check Username & Password. Forgot? Click "Rotate Password" in Konektor.
  • No leading/trailing whitespace when pasting.

"404 Not Found"

  • Verify the workspace code in the URL (format WS-XXXXXX).
  • Ensure the relevant feed (offlineEnabled / customerMatchEnabled) is on.

"Low match rate" on Customer Match

  • Make sure email & phone on leads are real (not dummy values).
  • Phone must normalize to E.164 — Indonesian 08xx is auto-converted to +628xx.

"Conversion name not found" in Google Ads

  • The Conversion Name field must exactly match the Conversion Action name in Google Ads (case-sensitive).
  • Review your offlineNameMap in Konektor.

"Identifiers or iOS URL parameters are too old" / status "Needs attention"

This message is not about iOS. It tells you that the ad click behind the imported event is older than the click-through conversion window of that conversion action.

  • Open Tools → Conversions, select the conversion action, then set the click-through conversion window to 90 days (the maximum).
  • Rows whose click already passed 90 days stay out of the CSV. Google cannot accept them at all.
  • Keep the schedule Daily, so each deal reaches Google before its click ages out.
  • The status flags the rejected rows only. Conversions that Google already recorded stay valid.

Delay

Google Ads recommends waiting 6 hours after a scheduled upload before data appears in conversion reports.

Next steps

Official Google References

Need More Help?

Our team is ready to help you maximize ad tracking and business attribution.

© 2026 Konektor. All rights reserved.