Sign in
Welcome back. Sign in to manage your dynamic ad and live stats campaigns.
{{ apErrText }}
Prototype: any email and password signs in.
© 2026 · Privacy · Terms · Support
Reset your password
Enter the email linked to your account and we'll send you a link to reset your password.
{{ apErrText }}
© 2026 · Privacy · Terms · Support
✉
Check your email
If an account exists for {{ apMasked }}, you will receive a password reset link. The link expires in 30 minutes.
Didn't get it?
© 2026 · Privacy · Terms · Support
Set a new password
Choose a strong password you haven’t used before.
Password requirements
{{ r.mark }}{{ r.label }}
Passwords don’t match
© 2026 · Privacy · Terms · Support
Workspace ▾
{{ apEmail }}
Welcome back, {{ apName }}
Start a new project or continue where you left off.
Your projects ({{ apCount }})
PROJECT NAMEDESCRIPTIONTYPEVERSIONSTATUSLAST MODIFIEDACTIONS
No projects match your search.
{{ p.name }}{{ p.desc }}{{ p.type }}{{ p.version }}{{ p.status }}{{ p.date }}by {{ p.by }}
{{ apShowing }}
MOCK · DATA ACCESS Live odds Statistics Theme
Workspace ▾
{{ apEmail }}
/ New project
What would you like to create?
Choose a project type to open the project board.
Preview / illustration
{{ t.title }}
{{ t.desc }}
{{ f }}
{{ apTplTitle }}
Filters
TEMPLATES
{{ x.label }}
SEGMENTS
✓{{ g.label }}
{{ apGridTitle }}
+
Create a blank ad
Start from scratch
Template preview
{{ tp.name }}
{{ tp.meta }}
No templates match — start from a blank ad.
Selected: {{ apSelName }}
{{ sizeLabel }}
{{ zoomPct }}
Previewing mapping · {{ pvWhere }}
CANVAS LIBRARY
{{ m.content }}{{ m.video }}
{{ c.name }}
{{ c.meta }}
{{ p.icon }}
{{ p.label }}
Static content. Click to add or drag onto the canvas; drop image files straight onto the board. For values that change live, use the Dynamic tab.
Dynamic slots are placeholders. Style and position them here. Which data fills them — and its accepted values — is chosen per placement in Step 2 · Pipeline.
This is the Default canvas.
It must stay static so it can always be shown when every placement is skipped — dynamic slots can’t be added.
{{ p.icon }}
{{ p.label }}
{{ p.desc }}
{{ p.icon }}
{{ p.label }}
{{ p.desc }}
{{ p.icon }}
{{ p.label }}
{{ p.desc }}
SLOTS IN THIS CANVAS
No dynamic slots — this canvas is static and can be used as the Default.
{{ k.icon }}
{{ k.name }}{{ k.expect }}
{{ k.mapped }}
No layers yet in this canvas.
{{ l.icon }}
{{ l.name }}
{{ e.content }}{{ e.video }}
Blank canvas · add elements and dynamic slots
{{ selDims }}
{{ statusText }}
⇄ {{ usedBannerText }}
Design
{{ selType }}
SET LAYOUT
Rows
Columns
Row gap (px)
Click a field once to select the whole set · click it again to select just that field · Alt + drag moves one row
SET{{ selSetText }}
Opacity{{ opacityText }}
Rotation
Double-click the slot on the canvas to edit the sample. In the Pipeline each placement maps it to a data field or a static text, and sets its wording — value only, a preset or custom text with tokens and data fields.
The wording is set per placement in the Pipeline — from a project preset or as custom text with tokens like {line} or {home}.
Horizontal
Vertical
Line height (multiplier) · tracking between letters
{{ tx.tfitHint }}
Box
Text outline
No filters yet — add one below.
{{ f.label }}
{{ f.v }}{{ f.unit }}
Angle{{ f.ang }}°
Fill
Stroke
Radius
Angle{{ ix.mgAng }}°
START EDGE
Position{{ ix.mgP1 }}%
Opacity{{ ix.mgA1 }}%
END EDGE
Position{{ ix.mgP2 }}%
Opacity{{ ix.mgA2 }}%
Opacity sets how visible the image is at each edge; between them it blends smoothly.
Fade{{ ix.maskF }}%
No filters yet — add one below.
{{ f.label }}
{{ f.v }}{{ f.unit }}
Angle{{ f.ang }}°
CROP POSITION
X{{ cropX }}%
Y{{ cropY }}%
Choose which part of the image stays visible when it’s cropped to fill the box. Alt-drag the image on the canvas to pan.
{{ vidInfo }}
Angle{{ ix.mgAng }}°
START EDGE
Position{{ ix.mgP1 }}%
Opacity{{ ix.mgA1 }}%
END EDGE
Position{{ ix.mgP2 }}%
Opacity{{ ix.mgA2 }}%
Opacity sets how visible the image is at each edge; between them it blends smoothly.
Fade{{ ix.maskF }}%
No filters yet — add one below.
{{ f.label }}
{{ f.v }}{{ f.unit }}
Angle{{ f.ang }}°
CROP POSITION
X{{ cropX }}%
Y{{ cropY }}%
Choose which part of the image stays visible when it’s cropped to fill the box. Alt-drag the image on the canvas to pan.
{{ s.opacity }}%
Opacity{{ ix.shA }}%
Follows transparent areas of PNG/SVG images.
Angle{{ ix.mgAng }}°
START EDGE
Position{{ ix.mgP1 }}%
Opacity{{ ix.mgA1 }}%
END EDGE
Position{{ ix.mgP2 }}%
Opacity{{ ix.mgA2 }}%
Opacity sets how visible the image is at each edge; between them it blends smoothly.
Fade{{ ix.maskF }}%
No filters yet — add one below.
{{ f.label }}
{{ f.v }}{{ f.unit }}
Angle{{ f.ang }}°
!
Performance tip
Animating a video makes the ad heavier to render. On some players this can cause dropped frames or choppy playback — keep video animations short and simple.
In Out Loop
{{ cv.label }}
{{ cv.graph }}
{{ cv.bzText }} · X values 0–1, Y can overshoot
AT TIMECOMPLETE
0%→0%
→
100%→100%
Set how much of the animation is complete at each moment. Values above 100% overshoot.
{{ sizeLabel }} · {{ canvasKind }}
Imported from {{ canvasSource }}
Not placed yet. Place it in any match state in Step 2 — as often as you need, each time with different data.
{{ u.label }}{{ u.note }}
Color
Opacity
Image
Fit
Default is transparent (0% opacity).
SHORTCUTS
⌘Z / ⇧⌘Z undo · redo
⌘D duplicate · ⌫ delete
Arrows nudge (⇧ ×10) · Space play
Hold ⌥ while dragging to skip snapping
TIMELINE · {{ tlTitle }}
{{ timeText }}
{{ modeText }}
✓Loop
LAYERS
Add elements to animate them.
{{ r.icon }}{{ r.name }}
{{ k.label }}
{{ r.barLabel }}
▶ {{ r.playLabel }}
{{ playheadText }}
{{ smoKicker }}
{{ smoTitle }}
{{ smoSub }}
{{ smoRowsLabel }}
Direction
Columns
Row gap (px)
{{ b.t }}
i{{ smoDisclaimer }}
{{ smoCount }}
{{ geTitle }}
{{ geSub }} · the rest of the banner is dimmed
{{ m.content }}{{ m.video }}
FIT GUIDE{{ geTipText }}
Teams orientation
{{ dr.t }}{{ dr.a }}
GRAPH LAYOUT
{{ sec.title }}
{{ ct.label }}
{{ ct.txt }}
Hidden
{{ ct.thumb }}
{{ spTitle }}
{{ spSub }}
No statistics match your search.
{{ x.chk }}
{{ x.name }}{{ x.cat }}
{{ spPoolTag }}
{{ x.desc }}
e.g.{{ x.ex }}
{{ spCount }}
BANNERS · {{ smCount }}
Pick a canvas and create a banner. One canvas can power many banners, each with its own mapping.
{{ m.content }}{{ m.video }}
{{ b.name }}{{ b.canvas }}⚠ {{ b.warnText }}✓ Mapped
No banners yet — pick a canvas on the left and click + New banner.
Canvas
PREVIEW
{{ w.title }}
{{ m.content }}{{ m.video }}
{{ h.n }}
STEPS TO MAP{{ smStepsDone }}
This canvas has no dynamic values — add a statistic set or dynamic value in the canvas editor.
{{ g.n }}{{ g.icon }}
{{ g.title }}{{ g.members }}
DATA
Source:
{{ g.note }}
Players from
{{ g.rkTeamHint }}
Order
STATISTICS POOL · LABELS
Add at least one statistic
STATISTICLABEL SHOWNVIEW
{{ x.name }}e.g.{{ x.ex }}
{{ g.shortText }}
ROWS · DEFAULT STATISTIC
Row {{ r.n }}
PREVIEW VALUES · EXAMPLES
{{ er.row }}{{ er.stat }}
{{ v.lab }}
Type any value to test the layout — live data replaces these at runtime.
{{ l.n }}{{ l.icon }}
{{ l.name }}{{ l.kind }}
GRAPHIC TYPE
OPTIONS
Pick a graphic type on the left.
Source:
{{ op.label }}
{{ op.info }}
{{ op.help }}
THIS GRAPHIC WILL SHOW{{ l.gSummary }}
Preview uses example data — live match data replaces it at runtime.
DATA FIELD
No fields match.
{{ gr.title }}
{{ it.label }}{{ it.desc }}
e.g.{{ it.ex }}
STATISTICS · BY SOURCE
No statistics source granted.
{{ l.cfgTitle }}
Pick Static text, Dynamic text or a statistic field on the left.
Shown exactly as written — never changes at runtime.
RENDERS AS{{ l.tplOut }}
PREVIEW VALUES · EXAMPLES
{{ tr.name }}
{{ l.fName }}{{ l.fMeta }}
Wrap the value with your own words
The wording doesn’t include {value} — the statistic won’t be shown.
RENDERS AS{{ l.wOut }}
PREVIEW VALUE
SPORT
Choose the sport first — match states, live-odds markets and statistics follow it.
{{ spLabel }}
MATCH STATES
{{ noStText }}
{{ st.label }}
{{ st.count }}
⚠
How a state resolves at runtime
1. Placements are tried top to bottom.
2. A placement shows only if every mapped value passes its logics — accepted values and conditions (player on the pitch, match stats, minute…).
3. Otherwise the next one is tried — the same canvas can appear again with a different market.
4. If none pass, the Default canvas is shown.
{{ pipeKicker }}
{{ stateLabel }}
{{ stateCond }}
Default is shown whenever every placement in the live state is skipped. It must be a static canvas — one with no dynamic slots — so it can always be shown.
No placements yet — this state will fall straight through to Default.
Use + Add placement to pick a canvas and map its dynamic slots to live data.
{{ r.prio }} ⇄ {{ r.reusedText }}
{{ m.content }}{{ m.video }}
{{ r.staticText }}
Choose a canvas from the library.
DYNAMIC SLOTMAPPED DATA & LOGICS
{{ k.icon }}
{{ k.name }}{{ k.expect }}
PLACEMENT CONDITIONS
{{ l.tag }}{{ l.text }}
{{ r.pcNoneText }}
⚠ {{ r.unmappedText }}
⚠ {{ r.warn }}
⚠ {{ r.defInvalidText }}
★Default{{ defCanvasName }} · shown when every placement above is skippedEdit ↗
⚠ {{ defWarn }}
PREVIEW & ORDER
PREVIEW · {{ prevTitle }}
{{ m.content }}{{ m.video }}
Mapped slots show sample feed values; real values resolve live. Toggle “Tokens” above to see field names.
{{ o.prio }}
{{ o.name }}{{ o.rules }}
⚠
★Default · {{ defCanvasName }}
{{ u.name }}{{ u.count }}
{{ u.where }}
One design, many placements: each placement maps its own markets and accepted values.
Create a dynamic ad
Step 1 designs the canvases. Step 2 places them in a priority pipeline per match state and maps live data.
Ad name
Format
{{ p.name }}
{{ p.dims }}
×px
Data sources you can use
Granted by your admin in Data connectors
LIVE ODDS
✓
{{ o.label }}{{ o.desc }}
No live-odds source granted
STATISTICS
✓
{{ o.label }}{{ o.desc }}
No statistics source granted
{{ setupSrcHint }}
Start with
{{ o.label }}{{ o.desc }}
Import canvases from another project
Canvases are copied into this ad’s library and fitted to {{ sizeLabel }}. Dynamic slots come across unmapped — map them in the Pipeline.
Search projects…
{{ p.name }}{{ p.desc }}{{ p.count }}
{{ m.content }}{{ m.video }}
✓
{{ c.name }}{{ c.meta }}
{{ impCountText }}
Preview & publishSimulate a live moment — set the match state, data values and conditions to see exactly what renders.
1 · MATCH STATE
Evaluated in order: this state’s priorities → Any state → Default.
2 · DATA VALUES
No dynamic data used in this state.
{{ f.label }}Used in {{ f.where }}
{{ f.label }}
Used in {{ f.where }}
3 · MARKETS & CONDITIONS
{{ p.prio }}{{ p.canvas }}{{ p.state }}
Market · {{ m.name }}{{ m.field }}
{{ c.tag }}{{ c.text }}
No markets or conditions — only accepted values apply.
{{ m.content }}{{ m.video }}
Nothing renders — no placement passed and no Default canvas is set.
{{ simTime }}
RESOLUTION
RENDERING NOW{{ simWinName }}{{ simWinWhere }}
{{ t.icon }}
{{ t.canvas }}{{ t.label }}
{{ t.status }}
• {{ x }}
{{ m.content }}{{ m.video }}
{{ fsTime }}
{{ hoverLabel }}{{ hoverToken }}{{ hoverHint }}
PLACEMENT CONDITIONS
{{ pc.title }}
They apply to the whole placement. If they aren’t met at runtime, it’s skipped and the next priority is tried.
DESCRIBE THE CONDITIONS
{{ pc.nlMsg }}
CONDITIONS
✓
MARKET OPEN · ALWAYS REQUIRED{{ lk.text }}DATA FIELD{{ lk.field }}
AND
{{ pc.noneText }}
{{ c.joiner }}
{{ c.title }}
{{ p.text }}
Suggested for this placement
More conditions
Map dynamic data
{{ mapTitle }}
EDIT LAYOUT
{{ mapSlotName }}
Changes apply to the canvas, so every placement using it updates. Drag the value in the preview to move it.
POSITION & SIZE
EXAMPLE VALUE
{{ exField }}
Preview only — try long or extreme values to check the fit. Applies to every preview of this data field; never saved to the ad.
{{ exMsg }}
TYPOGRAPHY
SHAPE
EXAMPLE DATA · live values replace these
{{ m.content }}{{ m.video }}
{{ o.n }}● MAPPING · {{ o.title }}
{{ mapTimeText }}
{{ mapSlotKicker }}
{{ mapSlotName }}
Expects {{ mapSlotExpect }} · showing compatible fields
STATIC TEXT
Shown exactly as written · always passes
SEGMENT
iValues on the right are examples for previewing only. Live match data replaces them at runtime. Change an example in Edit layout.
{{ g.group }}
{{ g.note }}
{{ f.label }}
{{ f.token }}
e.g.{{ f.sample }}
No compatible fields in {{ mapSegName }}. Pick another segment above, or set this slot to expect “Any value” in Step 1.
ACCEPTED VALUES{{ mapRuleShort }}
CUSTOM IMAGE
{{ ciImg }}
{{ ciName }}
CROP POSITION
X{{ cim.cropX }}%
Y{{ cim.cropY }}%
Choose which part of the image stays visible when it’s cropped to fill the box.
{{ cim.opacity }}%
Opacity{{ cim.shA }}%
Follows transparent areas of PNG/SVG images.
Angle{{ cim.mgAng }}°
START EDGE
Position{{ cim.mgP1 }}%
Opacity{{ cim.mgA1 }}%
END EDGE
Position{{ cim.mgP2 }}%
Opacity{{ cim.mgA2 }}%
Opacity sets how visible the image is at each edge; between them it blends smoothly.
Fade{{ cim.maskF }}%
No filters yet — add one below.
{{ f.label }}
{{ f.v }}{{ f.unit }}
Angle{{ f.ang }}°
Used only in this placement. The image keeps the slot’s shape from the canvas and always shows — it never makes the placement fail.
{{ mapSentenceA }} {{ mapSlotName }} {{ mapSentenceB }} {{ mapFieldLabel }} {{ mapSentenceC }}
OVER / UNDER LINE
{{ ouHint }}
PLAYER
ADMANAGERThe player is chosen per campaign in AdManager. This ad exposes a player input; previews use an example player.
{{ mapPlayerHint }}
Preview only — the live player replaces these.
ACCEPTED VALUES
{{ mapOHint }} · Current sample: {{ mapOddsNow }}
This field has no value range — use conditions below to control when it shows.
PLACEMENT CONDITIONSConditions like “player on the pitch” or match stats apply to the whole placement. {{ mapPcSummary }}
{{ mapRuleSummary }}
Statistics set — mapped as one block, the same way as in Statistic graphics. Live odds conditions don’t apply to these fields.
{{ g.n }}{{ g.icon }}
{{ g.title }}{{ g.members }}
DATA
Source:
{{ g.note }}
Players from
{{ g.rkTeamHint }}
Order
STATISTICS POOL · LABELS
Add at least one statistic
STATISTICLABEL SHOWNVIEW
{{ x.name }}e.g.{{ x.ex }}
{{ g.shortText }}
ROWS · DEFAULT STATISTIC
Row {{ r.n }}
PREVIEW VALUES · EXAMPLES
{{ er.row }}{{ er.stat }}
{{ v.lab }}
Type any value to test the layout — live data replaces these at runtime.
{{ l.n }}{{ l.icon }}
{{ l.name }}{{ l.kind }}
GRAPHIC TYPE
OPTIONS
Pick a graphic type on the left.
Source:
{{ op.label }}
{{ op.info }}
{{ op.help }}
THIS GRAPHIC WILL SHOW{{ l.gSummary }}
Preview uses example data — live match data replaces it at runtime.
DATA FIELD
No fields match.
{{ gr.title }}
{{ it.label }}{{ it.desc }}
e.g.{{ it.ex }}
STATISTICS · BY SOURCE
No statistics source granted.
{{ l.cfgTitle }}
Pick Static text, Dynamic text or a statistic field on the left.
Shown exactly as written — never changes at runtime.
RENDERS AS{{ l.tplOut }}
PREVIEW VALUES · EXAMPLES
{{ tr.name }}
{{ l.fName }}{{ l.fMeta }}
Wrap the value with your own words
The wording doesn’t include {value} — the statistic won’t be shown.
RENDERS AS{{ l.wOut }}
PREVIEW VALUE
{{ osKicker }}
{{ osName }}
{{ osSub }}
SOURCE
MARKET
GOAL LINE
WHICH {{ osPickN }} ODDS
Select {{ osPickN }} odds — they fill the set’s odds in this order.
SET LABEL
Suggestions
Renders as “{{ osSlRender }}”
ODDS LABELS
Odd {{ l.n }} · {{ l.sel }}{{ l.sample }}
→ “{{ l.render }}”
{{ osOlHint }}
TEAM LOGOS
✓ {{ osLogoText }}
{{ osLogoText }}
{{ osStatus }}
{{ mapSlotKicker }}
{{ mapSlotName }}
Wording that changes with the market mapped in this placement
CALCULATION
✦ DESCRIBE IT— we’ll build the calculation for you
{{ cxChatMsg }}
Start from a template
Pick a template above, or add data fields, numbers and operations below.
{{ k.ex }}
{{ k.value }}
{{ cxWhere }} · click an item to select it · × removes it
RESULT{{ cxResult }}
e.g. {{ cxSubst }} = {{ cxRaw }}
{{ cxErrText }}
RESULT FORMAT
Decimals
TEST WITH EXAMPLE VALUES
{{ u.label }}
Preview only — live data is used at runtime. Use “Custom text” below to add words around the result, e.g. “Diferença: {value}”.
RENDERS AS
{{ lblPreview }}
{{ lblTpl }}{{ lblVia }}
PLAYER
{{ lblPlayerHint }}
Preview only — the live player replaces these.
PREVIEW VALUES
{{ x.t }}{{ x.label }}
Preview only — try long team or player names to check the fit. Live data replaces these at runtime.
TAKES ITS DATA FROM
Tokens like {line}, {player} and {team} are read from this value’s mapping · market: {{ lblFam }}
Map a dynamic value value (e.g. an odd) in this placement first — the label reads its market from it.
STATIC TEXT
Shown exactly as written — no data fields, always passes.
WORDING
Shows the mapped value as-is. To wrap it in words — e.g. “Over 2.5 goals @ 1.95” — pick a Preset or Custom and place {value} where the value goes.
Uses the standard wording for {{ lblFam }}. Change the market on this placement and the label follows — nothing else to set.
{{ p.name }}“{{ p.preview }}”
{{ p.fitText }}
Changes apply to every placement using this preset
Presets are shared across all canvases and placements in this project. Ones that fit the mapped market are listed first.
Click a token or pick any data field to insert it
Wording never makes a placement fail — it only changes the text shown with the mapped values.
{{ mapProgress }}
Add placements · {{ placeStateLabel }}
Click canvases to queue them. Each click adds a placement at the lowest priority — click the same canvas again to place it twice with different data. Reorder on the right.
{{ m.content }}{{ m.video }}
{{ c.pickedText }}
{{ c.name }}{{ c.meta }}
NEW PLACEMENTS · PRIORITY ORDER
{{ placeExistingText }}
Nothing selected yet.
Click a canvas to add it.
{{ p.prio }}
{{ m.content }}{{ m.video }}
{{ p.name }}
{{ placeCountText }}
BEFORE YOUR FIRST MATCH STATE
Which sport is this ad for?
Match states, live-odds markets, odds sets and statistics in the mapping follow the sport you pick. You can change it while the ad has no match states.
Add match state
Each state has its own priority pipeline of placements.
{{ p.label }}
{{ p.note }}
Start from
Empty pipeline
Copy placements & mappings from
{{ toast }}