Skip to content

feat(source-applovin-ads): Add AppLovin Ads source connector - #83270

Draft
devin-ai-integration[bot] wants to merge 2 commits into
masterfrom
devin/1785434263-source-applovin-ads
Draft

feat(source-applovin-ads): Add AppLovin Ads source connector#83270
devin-ai-integration[bot] wants to merge 2 commits into
masterfrom
devin/1785434263-source-applovin-ads

Conversation

@devin-ai-integration

Copy link
Copy Markdown
Contributor

What

Adds source-applovin-ads, a manifest-only source for AppLovin's advertiser-side reporting APIs.

AppLovin has no connector in the catalog today. There is an open community PR — #81418 by Idan Sheinberg (@sheinbergon) — which this PR builds on and would supersede; its manifest is the starting point for the requester, pagination, and per-day slicing design, and the credit belongs there. It has been idle since 2026-07-20 and its CI cannot complete because fork PRs get no secrets. A maintainer should decide between the two rather than merging this by default, and ideally loop in the original author.

Three differences from #81418, all of which come from the published AppLovin docs:

  1. Adds web_report_daily (/webReport). /report and /webReport are different endpoints with different column sets: only /webReport exposes checkout/new-customer metrics (nc_d0_checkouts, chka_usd_7d, new_visitor_rate), and only /report exposes install metrics (conversions, conversion_rate, ret_*). A D2C advertiser running web campaigns cannot get its spend or ROAS out of /report at all. feat: 🎉 AppLovin Ads Reporting API Source Connector #81418 requests the web-only columns from /report, where they are not valid columns.
  2. Declares primary keys. feat: 🎉 AppLovin Ads Reporting API Source Connector #81418 declares none, so deduplication is impossible — which matters here because AppLovin restates metrics as attribution arrives, so incremental syncs re-emit rows for days already synced. Each stream requests a fixed dimension set and the PK is that set, making restated rows overwrite cleanly in dedup mode.
  3. Clamps the start date to the API's request window. AppLovin serves 45 days for /report and /assetAnalyticsReport and 90 days for /webReport, and out-of-window dates return an error rather than empty results. Without a clamp, any start_date older than the window fails the sync outright.

Resolves an open question about the asset endpoint while we're here: /assetReport and /assetAnalyticsReport are both real. They are the same report with different time parameters — /assetReport takes range (yesterday, last_7d, last_month), /assetAnalyticsReport takes start/end. The date-based variant is the one usable with a cursor, so that is what this connector calls.

How

Streams, all incremental, all requesting one day per HTTP call so each record belongs to exactly one date:

Stream Endpoint Cursor Window
advertiser_report_daily /report (report_type=advertiser) day (native) 45d
web_report_daily /webReport (report_type=advertiser) day (native) 90d
asset_report_daily /assetAnalyticsReport date (injected) 45d
  • Auth is ApiKeyAuthenticator injecting the Report Key as the api_key query parameter, which is what all three endpoints expect.
  • The request-window clamp is min_datetime on the cursor's MinMaxDatetime, e.g. {{ day_delta(-89, format='%Y-%m-%d') }} for /webReport.
  • The asset report has no day dimension, so a single-day range aggregates to that day and an AddFields transformation stamps stream_slice.start_time as date to cursor on.
  • lookback_window defaults to 3 rather than 0 so restated attribution data is picked up without the user having to discover the problem first.
  • 401/403 short-circuits to a config_error naming the Report Key, since AppLovin returns 403 for a bad key and retrying it five times is pointless. AppLovin also uses 403 for every path, valid or not, so a wrong-key error is the most likely first failure a user hits.
  • attribution_mode (click / click_and_view) is exposed for /webReport, which is the one endpoint that accepts it. It changes reported conversion counts, so it belongs in config rather than being silently defaulted.
  • check uses asset_report_daily because the asset report is identical for app and web advertisers, so it succeeds for either kind of account. Checking /report would fail for a web-only advertiser and vice versa.

Review guide

  1. airbyte-integrations/connectors/source-applovin-ads/manifest.yaml — streams, cursors, window clamps, primary keys
  2. airbyte-integrations/connectors/source-applovin-ads/metadata.yaml
  3. docs/integrations/sources/applovin-ads.md — including which stream to use for which campaign type
  4. Sources: Reporting API, Web Reporting API, Asset Reporting API

User Impact

New connector, so no impact on existing connections. Users can sync AppLovin app campaign, web campaign, and creative-level reporting into any destination.

Scope boundary, stated in the docs: this is advertiser-side reporting only. MAX publisher/monetization reporting (/maxReport, /maxCohort) is not included, and neither are the management or Conversions APIs — those use different hosts and different credentials (Management Key, Campaign Management Key, CAPI Key), and the CAPI is a write path that does not belong in a source.

Testing status

Not yet validated against the live API — this needs a real AppLovin Report Key.

Done:

  • validate_manifest passes with no errors or warnings; the manifest fully resolves.
  • Every endpoint path, request parameter, column name, and request window in the manifest is taken from the AppLovin docs linked above rather than inferred.
  • Prettier/pre-commit clean.

Not done, and required before this leaves draft:

  • check, discover, and a real read against a live account.
  • Confirming the default column sets are all valid for a given account. Columns vary by campaign type, so an account that never ran CPE campaigns may reject or ignore some.
  • Confirming results is the response envelope for /webReport specifically (it is for /report, per feat: 🎉 AppLovin Ads Reporting API Source Connector #81418's live testing).

Any reviewer with an AppLovin account can unblock this; adding the Report Key to GSM would also let CI actually exercise the connector, which is the thing that has stalled #81418.

Can this PR be safely reverted and rolled back?

  • YES 💚

Link to Devin session: https://app.devin.ai/sessions/a06b28c3b7ca496ea9a0af3e4d3c9eb1

…rtiser reporting

Co-Authored-By: Gary Yang <gary.yang@airbyte.com>
@devin-ai-integration

Copy link
Copy Markdown
Contributor Author

🤖 Devin AI Engineer

I'll be helping with this pull request! Here's what you should know:

✅ I will automatically:

  • Address comments on this PR. Add '(aside)' to your comment to have me ignore it.
  • Look at CI failures and help fix them

Note: I can only respond to comments from users who have write access to this repository.

⚙️ Control Options:

  • Disable automatic comment, CI, and merge conflict monitoring

@github-actions

Copy link
Copy Markdown
Contributor

👋 Greetings, Airbyte Team Member!

Here are some helpful tips and reminders for your convenience.

💡 Show Tips and Tricks

PR Slash Commands

Airbyte Maintainers (that's you!) can execute the following slash commands on your PR:

  • 🛠️ Quick Fixes
    • /format-fix - Fixes most formatting issues.
    • /bump-version - Bumps connector versions, scraping changelog description from the PR title.
      • Bump types: patch (default), minor, major, major_rc, rc, promote.
      • The rc type is a smart default: applies minor_rc if stable, or bumps the RC number if already RC.
      • The promote type strips the RC suffix to finalize a release.
      • Example: /bump-version type=rc or /bump-version type=minor
    • /bump-progressive-rollout-version - Alias for /bump-version type=rc. Bumps with an RC suffix and enables progressive rollout.
  • ❇️ AI Testing and Review (internal link: AI-SDLC Docs):
    • /ai-prove-fix - Runs prerelease readiness checks, including testing against customer connections.
    • /ai-canary-prerelease - Rolls out prerelease to 5-10 connections for canary testing.
    • /ai-review - AI-powered PR review for connector safety and quality gates.
  • 📝 AI Documentation:
    • /ai-docs-review - AI-powered documentation review for PRs with connector changes.
    • /ai-create-docs-pr - Creates a documentation PR for connector changes, stacked on the current PR.
  • 🚀 Connector Releases:
    • /publish-connectors-prerelease - Publishes pre-release connector builds (tagged as {version}-preview.{git-sha}) for all modified connectors in the PR.
    • /enable-autopilot-rollouts - Enables autopilot progressive rollouts for the modified connector(s) in the PR, remediating "autopilot rollouts not enabled for {connector-name}" auto-merge blockers. Sets defaultRolloutMode: autopilot and enableProgressiveRollout: true, preserving any existing autopilotConfig.
      • Optional args: connector=<CONNECTOR_NAME> (defaults to the modified connectors in the PR), strategy=fast|slow|default (defaults to fast).
      • Example: /enable-autopilot-rollouts or /enable-autopilot-rollouts connector=source-faker strategy=slow
  • ☕️ JVM connectors:
    • /update-connector-cdk-version connector=<CONNECTOR_NAME> - Updates the specified connector to the latest CDK version.
      Example: /update-connector-cdk-version connector=destination-bigquery
  • 🐍 Python connectors:
    • /poe connector source-example lock - Run the Poe lock task on the source-example connector, committing the results back to the branch.
    • /poe source example lock - Alias for /poe connector source-example lock.
    • /poe source example use-cdk-branch my/branch - Pin the source-example CDK reference to the branch name specified.
    • /poe source example use-cdk-latest - Update the source-example CDK dependency to the latest available version.
  • ⚙️ Admin commands:
    • /force-merge reason="<REASON>" - Force merges the PR using admin privileges, bypassing CI checks. Requires a reason.
      Example: /force-merge reason="CI is flaky, tests pass locally"
📚 Show Repo Guidance

Helpful Resources

📝 Edit this welcome message.

@github-actions

Copy link
Copy Markdown
Contributor

Note

Autopilot progressive rollouts are not enabled for the following modified connector(s):

  • source-applovin-ads

This is a courtesy heads-up only — it does not block merge or fail any check.
To enable automatic progressive rollouts for the connector(s) above, comment
/enable-autopilot-rollouts on this PR. This sets defaultRolloutMode: autopilot
and enableProgressiveRollout: true in each connector's metadata.yaml,
preserving any existing autopilotConfig.

@github-actions

github-actions Bot commented Jul 30, 2026

Copy link
Copy Markdown
Contributor

source-applovin-ads Connector Test Results

3 tests   1 ✅  3s ⏱️
1 suites  2 💤
1 files    0 ❌

Results for commit 1c0480f.

♻️ This comment has been updated with latest results.

@github-actions

github-actions Bot commented Jul 30, 2026

Copy link
Copy Markdown
Contributor

Deploy preview for airbyte-docs ready!

Project:airbyte-docs
Status: ✅  Deploy successful!
Preview URL:https://airbyte-docs-oefojwk2r-airbyte-growth.vercel.app
Latest Commit:1c0480f

Deployed with vercel-action

@sheinbergon

Idan Sheinberg (sheinbergon) commented Jul 30, 2026

Copy link
Copy Markdown
Contributor

10x. I'll gladly close mine and go for yours. I've already tested my connector and it's working. Which airbyte human can follow up on this work and move into a mergable state?

Co-Authored-By: Gary Yang <gary.yang@airbyte.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants