Skip to main content

Overview

In this guide, you’ll create a campaign banner system that:
  • Shows promotional banners
  • Tracks impressions and dismissals
  • Respects impression limits and cooldowns
  • Handles user interactions
Time estimate: 5 minutesPrerequisites: Flutter project with Presentum installed (Installation guide)

Step 1: Define surfaces and variants

Create lib/campaigns/presentum/surfaces.dart:
lib/campaigns/presentum/surfaces.dart
Surfaces are locations (homeTopBanner, popup). Variants are display styles (banner, dialog).

Step 2: Create payload and option classes

Create lib/campaigns/presentum/payload.dart:
lib/campaigns/presentum/payload.dart
See production payload with JSON serialization ->

Step 3: Implement storage

Create lib/campaigns/presentum/storage.dart:
lib/campaigns/presentum/storage.dart
This storage implementation is generic and reusable across any Presentum instance. The type parameters <S, V> make it work with any surface and variant enums you define.

Step 4: Create a guard

Create lib/campaigns/presentum/eligibility_scheduling_guard.dart:
lib/campaigns/presentum/eligibility_scheduling_guard.dart
See production guards ->

Step 5: Initialize Presentum

Create a mixin for Presentum initialization:
lib/campaigns/presentum/presentum_state_mixin.dart
Create a wrapper widget:
lib/campaigns/presentum/campaign_presentum_widget.dart
Update lib/main.dart:
lib/main.dart
See production initialization ->

Step 6: Create an outlet

Create lib/campaigns/presentum/campaign_outlet.dart:
lib/campaigns/presentum/campaign_outlet.dart

Step 7: Use the outlet

Add the outlet to your home screen:
lib/home/view/home_view.dart

Next steps

Core concepts

Deep dive into architecture

Production storage

Implement persistent storage

Advanced guards

Build complex eligibility rules

Real example

See production implementation

Common questions

Fetch campaigns from Firebase and feed them using setCandidates or setCandidatesWithDiff. See Remote Config recipe for a complete example.
Yes! Create separate instances for different presentation types (campaigns, tips, app updates). Each has independent state.