Prerequisites & Setup Checklist
Before you begin: this checklist covers everything needed for a successful Teads Flutter SDK integration, and everything to verify before you ship.
Development Environment Requirements
Flutter
- Flutter 3.44+ — the version whose build-dependency validation sets the Android floors below
- Dart 3.12+
- Verified clean on Flutter 3.47.2 / Dart 3.13.2
iOS
- macOS (required for iOS builds)
- Xcode with an iOS 15+ SDK
- iOS 15.0+ deployment target — Flutter's floor, not the native SDK's
- CocoaPods 1.11+
Android
minSdkVersion24+ — Flutter 3.44's own floorcompileSdk36- NDK 27.1.12297006 or newer, pinned explicitly
- JDK 17 or 21 — normally Android Studio's bundled JBR, which needs no setup
- Kotlin 2.2.20+, AGP 8.11.1+, Gradle 8.14.3+
If your app predates these versions, expect to bump Kotlin, AGP and Gradle in lockstep. The native SDK's compiled Kotlin metadata forces the floor — you cannot raise one alone.
Mandatory Global Checklist
1. SDK version
- Use the latest version of the plugin available to you
- Review the release notes for breaking changes before upgrading
2. Ad display requirements
- Ads must be fully visible, clickable, and start properly
- No widget may cover the placement — not even a transparent one. An
Opacity,IgnorePointer,Stackoverlay or gradient scrim over a placement breaks viewability measurement and can suppress revenue entirely - Do not wrap a placement in a fixed-height
SizedBoxthat clips it — the placements size themselves - Verify placements work in
ListView,CustomScrollViewandPageView - Test in both orientations
3. Brand safety configuration
- Provide a valid article URL on every placement — this drives contextual targeting and brand safety
articleUrlonMediaPlacementConfig,FeedPlacementConfig,BannerPlacementConfigandInterstitialPlacementConfig- URLs must be reachable from all regions you serve
- Pass the URL of the actual content the user is reading, not a generic homepage
4. App-ads.txt setup
-
Publish an
app-ads.txtat the root of the developer website listed on your store pages -
Include the Teads entry:
teads.tv, YOUR_PUBLISHER_ID, DIRECT, 15a9c44f6d26cbe1 -
Verify it is publicly accessible at
https://yourdomain.com/app-ads.txt -
Contact your account manager for your publisher ID
Not listing Teads in your app-ads.txt directly reduces ad serving and revenue from
our demand partners.
5. Privacy compliance
- Enable GDPR/CCPA/GPP handling where applicable
- A standards-compliant CMP needs no SDK calls at all — the SDK reads the IAB keys your CMP already writes
- Only use
TeadsPrivacyif you have a custom CMP or a server-driven consent decision - See the Privacy & Consent Guide
6. App Tracking Transparency (iOS)
- Add
NSUserTrackingUsageDescriptiontoInfo.plist— without it iOS denies the request instead of prompting - Call
TeadsPrivacy.requestTrackingAuthorization()after your first frame renders, and before creating placements - Treat a
nullreturn as "not applicable" (Android), not "declined"
7. Native configuration
- Android: Teads Maven repository added, AdMob
APPLICATION_IDmeta-data present, NDK pinned - iOS:
platform :ios, '15.0'in thePodfile,pod installrun - iOS:
viewWillTransitionforwarded if you useBannerPlacement
8. Integration validation
TeadsSdk.configure()called exactly once, before any placement- Every placement type you use tested on both platforms
- Event callbacks firing
InterstitialPlacement.dispose()calledRecommendationsViewabilityReporter.dispose()called
Flutter-Specific Requirements
Widget lifecycle
InterstitialPlacementis not a widget — it holds a native WebView and an Open Measurement session. Calldispose()from yourState.dispose().RecommendationsViewabilityReporterowns timers — calluntrackwhen aGlobalKeyis reused anddispose()when the list is torn down.MediaPlacement,BannerPlacementandFeedPlacementclean up their own platform views on unmount.
Platform views
Media and Banner are platform views (AndroidView / UiKitView). Two consequences:
- They cannot render in
flutter test. Widget-test around them, or use the mocks frompackage:teads_flutter/teads_flutter_mocks.dart. - Avoid giving each row of a long list its own placement. A platform view per list item is a known-bad Flutter pattern regardless of which plugin creates it.
State management
- Rebuilding a placement with an unchanged config is safe
- Changing
FeedPlacementConfig.darkModeviacopyWithpushes into the loaded page; changing any other field only takes effect when the page is recreated - Do not recreate placements on every rebuild — hold the config, or use a
constconstructor where possible
Multiple Feed placements
- Use
widgetIndex: 0for the first, then 1, 2, … for the rest - A non-zero
widgetIndexnever loads unless awidgetIndex: 0placement loads on the same page. See the Integration Guide.
Pre-Release Testing Checklist
Test configuration
- Test each placement with the IDs in Test Configurations
- The widget ID selects the ad format — pointing Banner or Interstitial at Feed's
MB_1serves a feed, which looks exactly like a broken placement - Remove
enableValidationModeandtestDisplaybefore release
Devices and environments
- Multiple device types (phones and tablets, iPhone and Android)
- Minimum and latest supported OS versions
- Wi-Fi, cellular, and degraded connections
- Different consent scenarios, including a full reject
- Always test on real devices before release — see the note on emulator DNS in the Troubleshooting Guide
Cross-platform
- Consistent behavior on iOS and Android
- Rotation on both (remember the iOS
viewWillTransitionforwarding for Banner) - Dark mode on both
- Feed fullscreen video enter and exit
Performance
- Profile scrolling with placements present, in
--profilemode - Watch memory across many placement create/dispose cycles
- Confirm placements are disposed when screens are popped
User experience
- Ads do not interfere with app functionality or navigation
- Clicks and video playback behave correctly
- Errors degrade gracefully — an ad that fails should leave no broken layout
Common Issues to Avoid
Integration
- Don't ship test PIDs or validation mode
- Don't call
Recommendations.registerClickbefore an actual tap — it reports the click - Don't forget
InterstitialPlacement.dispose() - Don't cache the result of
interstitial.isReady - Don't await
requestTrackingAuthorization()beforerunApp
Configuration
- Don't omit
articleUrl - Don't skip
app-ads.txt - Don't forget the AdMob
APPLICATION_ID— the app crashes at process start without it - Don't use a non-zero
widgetIndexwithout awidgetIndex: 0placement on the page
Flutter-specific
- Don't remove widgets from the tree around a fullscreen Feed — collapse them instead
- Don't place a transparent overlay over a placement
- Don't give every list row its own platform view
- Don't run more than one
BannerPlacementat a time
App Submission for Review
Before going live, submit your app to Teads for review:
- Contact your publisher manager to learn how to submit
- The review verifies that viewability and brand safety work as expected in your integration
Required for review: debuggable iOS and Android builds, so network traffic can be inspected.
Next Steps
- Installation — the setup steps in detail
- Integration Guide — implement your placements
- Test Configurations — develop against the test IDs
- Privacy & Consent — get consent handling right
Support
- Technical support: Support
- Troubleshooting: Troubleshooting Guide
Pro tip: keep this checklist handy and re-run it before each release.