digia_engage 2.1.0 copy "digia_engage: ^2.1.0" to clipboard
digia_engage: ^2.1.0 copied to clipboard

Flutter SDK for rendering server-driven UIs using JSON from Digia Studio. Supports dynamic layouts, state, actions, and custom widgets.

Changelog #

2.1.0 - 2026-10-12 #

New Features #

  • Campaigns decided by Digia — a campaign can now carry its own trigger rule. The SDK checks the rule on the device and shows the campaign without a call from your messaging platform. A rule can fire on app open, on a screen view, or on an event, and can compare user attributes, device details and event properties.
  • Show after a delay — a rule can wait a set time before it shows its campaign. A later event or a screen change can cancel the wait. Only one campaign waits at a time.
  • Digia.trackEvent — records an event that your app performed, with optional properties and revenue (value and currency). Events are sent in batches and never block your app. Rules can trigger on these events.
  • Digia.setUserAttributes — sets attributes for the current user. It takes a Map<String, dynamic>. Values keep their type (String, num, bool or List<String>). The SDK drops other values and logs a warning. Each call merges with the attributes already set. Call Digia.setUserId first.
  • userHash in Digia.setUserId — pass an HMAC-SHA256 of the user ID, made on your backend, to get the user's imported attributes from the server.

Improvements #

  • When the user changes, the SDK clears the previous user's attributes and cached data.
  • The campaign timeline shows why a Digia-decided campaign did or did not show.
  • The SDK logs calls to setUserId, clearUserId, setUserAttributes and trackEvent. It never logs the user hash or event property values.

2.0.2 - 2026-10-09 #

Bug Fixes #

  • Completed guides and surveys now report a dismissal with time spent
  • Leftover analytics events are now flushed on their own

2.0.1 - 2026-10-08 #

Improvements #

  • Campaign schema versions — a Campaign Canvas, survey, inline timer, or anchorless guide target that omits its schema version is now read as the current version instead of being dropped. A config written for a newer schema than the SDK supports is dropped and reported once for its campaign (this now also covers anchorless guide targets); configs from older, unsupported schema versions are still dropped.
  • Guides with no usable steps — a guide whose steps cannot be rendered is now kept when campaigns are fetched and, when it is triggered, is reported to the CEP as dropped for invalid configuration (empty content) instead of being discarded earlier as malformed.

Bug Fixes #

  • Carousel Step Viewed only while the slot is visible — inline carousels (classic and Campaign Canvas) now send Step Viewed only while their slot is on screen: its route is current, no ancestor hides it (for example an inactive tab), the app is in the foreground, and at least half of the slot is visible inside its scroll views and the screen. A slide that changes while the slot is hidden is reported when the slot becomes visible, and a slide that was already reported is not sent again.

2.0.0 - 2026-10-08 #

New Features #

  • Campaign timeline in debug settings — the debug settings screen gains a "Campaign timeline" view listing, per campaign, when it was delivered, displayed, clicked, and how it ended, including the reason a campaign was dropped or dismissed.

Improvements #

  • Canvas-only campaigns — support for classic (non-canvas) surveys, nudges, and guides has been removed; Flutter renders Campaign Canvas campaigns only. A classic campaign with no canvas content is dropped as invalid_config instead of rendering.
  • Startup readiness — Digia.initialize() now completes when the campaign fetch completes or 2 seconds after the call, whichever comes first; a slower fetch keeps running in the background. A campaign trigger that arrives before the SDK is ready is dropped immediately (not_initialized, not_ready, or initialization_failed) instead of one being held and replayed later, so buffering is now the CEP adapter's job. A failed fetch still never throws.
  • One campaign at a time — a new nudge, survey, guide, or expanded floater no longer replaces one that is already on screen; it is dropped as surface_busy and reported to the CEP. A new inline campaign replaces a slot's occupant only if that occupant was never displayed, and re-delivery of the campaign already in the slot is ignored. Live tests always take over. Collapsed floaters hide while a blocking campaign is up, a superseded nudge's route is closed, and a campaign that is not displayed within its acceptance window (15 seconds plus any authored delay) is dropped as timeout and removed from the screen. A nudge with no navigator available now fails cleanly (host_not_mounted) instead of blocking later campaigns.
  • Guide lifecycle — a guide's last step now counts as completed only when its CTA completes it or its anchor leaves the screen; a scrim tap, back, close button, or screen change on the last step reports a step dismissal instead of a completion. Any screen change now dismisses an active guide (screen_exit); previously a guide could continue onto a screen in its target list.
  • Dismissal reasons and completion — "Digia Experience Dismissed" events for nudges, surveys, and guides now carry a dismiss_reason. A close caused by an authored dismiss CTA reports cta_action, an authored auto-dismiss reports auto_timeout, and navigating to a screen a nudge's campaign does not target closes the nudge automatically and reports screen_exit. A completed survey or guide reports completion without an additional dismissed event.
  • Floater and PiP behavior — a floater or Picture-in-Picture campaign is now dismissed on a screen change only if the campaign lists target screens and the new screen is not among them; campaigns without screen targeting survive navigation (previously they ended when the host left the screen they opened on). A PiP's impression, engagement time, and auto-dismiss clock now start at its first painted frame rather than when its media is ready.
  • Outside close-button margin — an outside-placed close button on nudges and surveys is now spaced by closeButton.outsidePlacement.margin (a number or {left, top, right, bottom}, default 0) instead of gap (default 12). The tap target is the button's real size rather than 48dp, the button is no longer clamped to the safe viewport, and sheets scroll rather than shrink when the margin is large. Campaigns that authored gap lose that spacing until they author margin.
  • Canvas survey refinements — the progress bar is now monotonic across branching answers; answer inputs scale with the available height and choice tiles stretch to fill it; the validation message is limited to one line inside the answer area; the back button closes or dismisses the survey according to its dismissibility; tapping outside a text field closes the keyboard; the close button, star ratings, and reactions carry accessibility labels; returning to an auto-advance question no longer advances again automatically; submitted question titles now come from the authored prompt text; and a survey completed with no answers submits nothing. The welcome CTA click is now reported before the survey start click.
  • Logging overhaul — DigiaLogLevel gains warn, info, and debug, and an unset DigiaConfig.logLevel now resolves to auto (errors only in release builds, full debug output in debug and profile builds; it used to be error). Console output has a new tagged format with campaign keys, all SDK output now respects logLevel (some lines previously printed in release builds regardless), and the API key is masked in the initialization banner. DigiaConfig.isLogLevelExplicit reports whether the level was set by the app.
  • Live-test reporting — every live-test invocation now ends in a terminal result on the dashboard, with retried acknowledgements, reason codes drawn from the shared vocabulary (malformed_campaign_skipped, campaign_unsupported, invalid_config, screen_not_targeted, anchor_not_registered, not_initialized, surface_busy, superseded, timeout, error), and tester-entered survey answers and dismissal reasons relayed to the dashboard. The live-test stream no longer reconnects every few seconds and stops retrying on authorization errors.
  • CleverTap custom-template campaigns — inline and floater campaigns delivered as a CleverTap custom in-app template (DigiaTemplate) are now dropped as invalid_config; previously only inline campaigns were.
  • Guide auto-scroll — guides scroll to reveal an anchor with the smallest movement, handling nested and mixed-axis scrollables, and skip scrolling when the anchor is already fully visible, instead of always centering it.

Bug Fixes #

  • Guides no longer end during page transitions — a guide now waits for its anchor's route (including nested navigators) to finish animating before it starts, instead of measuring an off-screen anchor and reporting a false user_close.
  • Inline impressions only while visible — a DigiaSlot and an inline timer now report their first impression only once the slot's route is current and no ancestor hides it (for example an inactive tab), so off-screen slots no longer record impressions or frequency counts.
  • Anchorless spotlight opacity — the scrim behind an anchorless guide step now uses the step's authored overlayOpacity instead of always rendering solid black.
  • Numeric variable fallbacks — campaigns whose variable fallback or sample value is a number are no longer skipped as malformed, and an inline timer whose deadline comes from a variable now falls back to the campaign's default value when the CEP does not supply one.
  • Analytics events lost under concurrency — concurrent queue operations are now serialized, so simultaneous appends and post-send removals no longer drop or resurrect events.
  • User ID set right after initialize — calling Digia.setUserId or clearUserId before initialize() finishes is now buffered and applied (last call wins, blank IDs ignored) instead of being logged and discarded.
  • Carousel indicator crash — a carousel whose indicator effect is dots or an unrecognised value now renders a default indicator instead of throwing while building.
  • Corrupt frequency state — negative stored frequency counters are read as zero instead of skewing frequency capping.
  • Page capture before the first screen — debug page capture now keeps anchors registered before a screen is set and attributes them to the first screen, instead of dropping them.

1.19.1 - 2026-09-11 #

Bug Fixes #

  • Picture-in-Picture CEP lifecycle event timing — PiP campaigns now report ExperienceImpressed to connected CEP platforms when the floating video window becomes visible on screen and ExperienceDismissed when the window is closed, rather than dispatching a synthetic impression and dismissal pair prematurely at route time.
  • Suppressed synthetic CEP dismissals for unrouted campaigns — campaigns buffered during SDK initialization that fail to route or encounter initialization errors no longer dispatch synthetic ExperienceDismissed events to connected CEP platforms.

1.19.0 - 2026-09-10 #

New Features #

  • Canvas survey campaigns — introduced multi-step surveys authored in Campaign Canvas (layoutMode: 'canvas'), featuring freeform canvas scene layouts, scene transition animations (slide and fade), styled managed host widgets (progress bar, step indicator, navigation buttons, auto-advance timers), and dynamic conditional branching based on answer values. Supports single- and multi-choice tiles (grid and column layouts), numeric NPS scales, 5-star rating bars with custom star geometries, emoji reaction scales with bundled reaction assets, single/multi-line text fields, and date picker inputs with configurable date formats, backed by per-field validation rules and styled error labels.
  • Stateful inline canvas timers — introduced stateful countdown timers rendered via Campaign Canvas inside DigiaSlot (stateful payload block), replacing legacy fixed-template countdowns. Supports four lifecycle states (teaser, running, urgent, and ended), each with independent Canvas designs, corner radii, and slot margins. Includes a dedicated digia/timer canvas widget supporting rich text formatting, independently styled unit containers (days, hours, minutes, seconds), auto-hiding units, overflow-safe unit decorations, and server time clock synchronization to prevent device clock skew.
  • SVG vector and animated GIF support — added direct rendering support for SVG vector graphics (detecting .svg URLs and ?format=svg query parameters) and animated GIF images across all SDK visual surfaces powered by flutter_svg. Supported across Campaign Canvas image widgets, inline banners, carousels, story cards/thumbnails/overlays, PiP media, nudges, surveys, and anchorless target layers.

Improvements #

  • Distance-based bottom sheet drag dismissal — implemented a distance-only sheet dismissal policy across survey and nudge bottom sheets, requiring an explicit downward drag of at least 120 logical pixels or 25% of sheet height to dismiss. Eliminates accidental dismissals caused by velocity/flick gestures and smoothly snaps the sheet back to its fully open position when released below the threshold.
  • Survey presentation chrome and dialog routing — canvas surveys can present as modal bottom sheets (with header drag handles and optional backdrop dismissal) or centered dialogs with customizable backdrop blur and dismissibility. Includes a custom-painted close overlay matching dashboard Lucide X stroke specifications and maintaining authored edge margins across differing scene dimensions.
  • Enriched timer event telemetry — inline timer impressions, clicks, and dismissals now attach structured timer context to Digia analytics and CEP forward events, capturing the active state rule ID, remaining time bucket (<5m, 15-5m, 60-15m, 6-1h, 24-6h, >24h, or expired), deadline source (fixed vs. fromVariable), CTA role (primary or secondary), and resolved destination URL.
  • Classic inline countdown runtime retirement — removed the legacy fixed-template inline countdown implementation and removed templateType: 'countdown' handling from inline campaign routing in favor of the new stateful Canvas timer architecture.

Bug Fixes #

  • Primary canvas tap region conversion reporting — transparent and styled canvas tap regions flagged as isPrimary now report qualifying primary CTA conversion clicks (ExperienceClicked) to connected CEP platforms and Digia analytics even when authored without navigation or hide actions.
  • Inline canvas slot lifecycle tracking — inline Canvas and timer slot campaigns now record their initial ExperienceImpressed event upon actual widget mount, dispatch ExperienceDismissed to CEP platforms when the slot is cleared or replaced, and re-arm impressions properly when a new campaign payload targets an occupied slot.
  • Canvas text underline and decoration colors — text underlines, strikethroughs, and nested span decorations without an explicitly authored decoration color now inherit the resolved text color rather than falling back to default or transparent styling.
  • Flexible timer timestamp parsing — inline timers now parse JavaScript Date.toString() strings, epoch seconds and milliseconds (including CleverTap $D_ prefixes), and ISO-8601 timestamps, defaulting to UTC when timezone offsets are omitted.
  • Survey completion analytics attribution — completing a canvas survey now suppresses the abandonedAtItem property in SurveyDismissed telemetry, and advancing past the survey welcome scene properly records the survey start event.
  • Rating star geometry and bounding box — corrected 5-star rating SVG path definitions and layout constraints to match dashboard canvas preview dimensions, preventing visual clipping and misalignment across custom rating symbols.

1.18.0 - 2026-09-10 #

New Features #

  • Floater story campaigns — a new campaign type featuring a small draggable, floating canvas window that opens a full-screen story viewer when tapped. The floater window supports authored corner placement, drag-and-snap physics, fly-in/fly-out animations, close controls, auto-dismissal, and backgrounding lifecycle tracking that preserves engaged dwell metrics.
  • Inline canvas campaigns — authored Canvas designs can now render directly inside inline slots via DigiaSlot. The surface scales uniformly to the slot's available width while maintaining authored proportions, background styling, and {{ token }} variable interpolation. Authored hide actions clear the slot for the remainder of the session and report dismissal.
  • Canvas carousel widget — Canvases can now include swipeable carousels of nested Canvas slides as a native canvas element, supporting configurable viewport peek fractions, slide spacing, auto-play intervals, infinite scrolling, corner radii, and customizable dot indicator animations.
  • Canvas stories and video rails — Canvas campaigns now support interactive stories with thumbnail rails, looping video previews, automatic thumbnail disk caching, full-screen story overlay playback with mute controls, and custom canvas element actions that jump directly to specific story pages.
  • Full-screen canvas nudges — canvas nudges can present in a full-screen display mode with configurable safe-area handling (none, insetSurface, insetContent), an optional auto-dismissal timer, and customizable close button placement anchored inside or outside the surface.
  • Automatic debug settings deep link — debug builds can open the Digia debug settings screen directly through deep links without requiring host routing code, supported in-process on Android and via a native plugin on iOS, with support for TestFlight build detection and single-instance presentation guards.

Improvements #

  • Process-aligned session lifecycle — session management now mirrors native Android and iOS SDK behavior, starting a fresh session on each application process launch and resetting on user identity changes, while rotating on inactivity within the process.
  • Render-timed campaign impressions — nudges, surveys, and inline slot campaigns now record their view impressions and notify CEP platforms when their widgets actually mount and render on screen rather than at route or delivery time, eliminating phantom impressions for off-screen slots.
  • Primary CTA conversion tracking — coarse CEP click events (ExperienceClicked) are now reserved for qualifying primary interactions (primary buttons, story opens, carousel taps, expired countdown CTAs, and survey starts), preventing secondary chrome and dismiss interactions from inflating external conversion metrics.
  • Platform-specific anchorless guide targets — anchorless guides can now define distinct placement configurations for Android and iOS within a single campaign payload, automatically resolving to the active runtime platform.
  • Material context for canvas dialogs — canvas dialog frames now provide a transparent Material widget context, ensuring text styles, ink effects, and inherited theme properties render correctly without requiring host-level theme fallbacks.

Bug Fixes #

  • Identity update race and event attribution — setUserId and clearUserId now await identity initialization, serialize concurrent updates, and skip no-op identity changes, preventing unauthenticated event drops during startup or rapid user switches.
  • Guide impression and step view deduplication — guide frequency capping and dwell tracking now record an impression strictly once per presentation, preventing duplicate impressions on re-renders, and guide step view events are deduplicated across layout passes.
  • Guide lifecycle and late anchor resolution — guides with canvas-based steps now poll for up to two seconds if their target anchor has not finished mounting on the first frame, dismiss automatically when the active screen changes away from the target screen, and dispatch a dismissal event to connected CEP platforms if an unrendered guide is discarded before presentation.
  • Circular spotlight alignment — circular spotlight cutouts now compute their center and radius accurately around non-square anchors and targets with asymmetric padding, eliminating visual offset against highlighted elements.
  • CleverTap inline template filtering — inline campaigns delivered under CleverTap custom templates are dropped in favor of Native Display, preventing invalid slot bindings.

1.17.1 - 2026-08-21 #

Bug Fixes #

  • Single-step guides (the common tooltip) now report a completion event to connected CEP platforms (WebEngage, CleverTap, MoEngage) when their CTA is tapped. Previously only multi-step guides reported this signal — a single-step guide's CTA tap produced only a view and a dismiss.

1.17.0 - 2026-08-18 #

New Features #

  • Campaign Canvas — nudges, tooltips and spotlights can be authored as a canvas: children positioned absolutely in an authored design space, scaled to the device. The canvas widget set covers containers, rich text, images, buttons, dividers, progress bars, Lottie and video, with solid/gradient/image fills, borders, corner radii, shadows, per-run text styling, individually tappable text runs, and invisible tap regions. Linear, radial and sweep gradients follow the same geometry as the dashboard preview. Campaigns authored in the classic layout keep rendering exactly as before.
  • Picture-in-picture campaigns — a new campaign type that floats a small draggable media window over one screen and expands to a full-screen canvas over the media on tap. Authors control media (aspect ratio, autoplay, loop, mute, volume), the collapsed window (width fraction, corner, margins, corner radius, border, shadow, entry/exit animation), the expanded state (media fit, background, scrim, close/back behavior, playback and mute controls, icon size, control margins), the chrome shown in each state, and lifecycle behavior (tap-to-expand, initial state, media-end handling, auto-dismiss, reshow on return). The window ends when the user leaves the screen it opened on. It reports its own analytics: impression, expand and collapse, chrome and CTA clicks, completion, and a terminal dismissal carrying dwell time, drag count, expand count, time spent expanded, and final position.
  • Design-system tokens in campaigns — a campaign bundle now carries the project's design tokens, and canvas colors and typography can reference them instead of hard-coded values. Color tokens keep both their light and dark values so the same campaign renders correctly in either theme. A token that cannot be resolved falls back to the property's authored value rather than dropping the campaign.
  • Theme selection — DigiaConfig.themeMode and Digia.setThemeMode(...) select auto, light or dark for Campaign Canvas colors. Already-mounted canvas content updates in place, with no refetch or reparse. auto (the default) follows device brightness, including later changes, so existing integrations are unaffected.
  • Anchorless spotlight guides — a multi-step spotlight campaign can target elements identified from a captured page instead of requiring a DigiaAnchor in the host app. Anchorless steps are scoped to the page they were authored against, and the guide is released when the user leaves that screen or a step cannot be placed.
  • Page and component capture (debug builds) — the debug settings screen can capture the current screen's layout and geometry and upload it for authoring anchorless targets, with per-capture control over whether text, images and media, and other structural nodes are included. Capture is limited to debug builds, refuses while a Digia experience is on screen, and is bounded by a traversal time budget so it cannot stall the app.
  • Live testing is its own setting — live testing now has an independent, persisted toggle instead of following the component-sync switch, and a device can be given a custom name that identifies it in the dashboard's device list.
  • Styled dividers — divider content supports solid, dashed and dotted patterns with configurable dash pattern, stroke cap, thickness, indents and a vertical orientation, in both classic and canvas-authored campaigns.

Improvements #

  • Text decoration renders — underline and strikethrough runs, with their authored color, thickness and offset, now render in campaign text; they were previously parsed and discarded pending cross-platform parity.
  • Consistent campaign typography — the host-configured font family is now applied to every surface Digia renders, including the countdown card, survey text inputs, and destructive-action confirm dialogs, which previously fell back to the app's default font. Variable fonts also receive the authored weight and optical-size axes, so text sized by the dashboard no longer renders heavier or wider than authored.
  • Campaign delivery — campaigns and design tokens now arrive together from a single campaign-bundle request, and a failed fetch reports the specific failure (transport, HTTP status, or malformed response). A campaign or token set that has to be skipped is now logged at the default log level rather than only in debug builds.
  • Accurate package constraints — the package declares the Flutter and Dart versions it actually compiles against (Flutter 3.29 / Dart 3.6), so an unsupported toolchain fails at dependency resolution instead of at build time, and drops its unused direct archive dependency, which no longer constrains the host app's own version.

Bug Fixes #

  • Navigating back now updates the current screen. Previously only forward navigation was reported, so screen-scoped campaigns stayed bound to a screen the user had already left.
  • A guide button whose action flow is an empty placeholder keeps its configured action instead of becoming inert.
  • The spotlight target glow matches the dashboard's rendering; it no longer paints an extra solid stroke around the highlighted element.

1.16.0 - 2026-08-07 #

New Features #

  • Debug component recording — debug builds can open Digia's debug settings, record pages, anchors, and slots seen at runtime, and review the captured sessions before curating them in the Engage dashboard.
  • Screen-scoped campaigns — campaigns can target named screens and render only while the host app is on a matching screen; campaigns without screen targeting remain available everywhere.
  • Configurable nudge close buttons — nudge campaigns can configure the close button's margins, background and icon colors, icon size, and touch target while preserving compatibility defaults when fields are absent.
  • Responsive inline story media — inline story cards can configure their aspect ratio and each story item can choose separate fits for its thumbnail and full-screen media; unsupported video fits fall back safely and letterboxed media is rendered over black.

Improvements #

  • Responsive nudge dialogs — dialog campaigns can use the full available window, honor an authored safe-area choice, and apply narrow width fractions consistently to both the surface and its content.

Bug Fixes #

  • DotLottie animation loading — Lottie nudges now decode .lottie bundles reliably, including animation selection and archive image paths that contain leading slashes.

1.15.0 - 2026-07-24 #

New Features #

  • Inline countdown card margin and padding — the countdown campaign's card now accepts a configurable outer margin and inner padding. Campaigns that don't configure them keep the previous fixed padding and no margin.

Bug Fixes #

  • Action variable interpolation — an action's own URL, deep link, share text, and copy text now interpolate {{ token }} campaign variables the same way the surface's visible copy already does, across every action-driven surface (guide buttons, story CTAs, carousel taps, countdown and banner taps, inline-slot deep links). Previously only the visible copy resolved variables; an action's own configured string passed through with the literal placeholder unresolved.

1.14.0 - 2026-07-23 #

New Features #

  • Full campaign font-weight range — dashboard-authored weights (100–900, numeric or named like semibold / extrabold) now render distinctly everywhere Digia renders text: guide/tooltip/spotlight titles and bodies, story item CTAs, survey text and CTAs, and nudge confirm-dialog text and buttons. Guide bodies also gained their own configurable weight, independent of the title's. Previously only 400/500/600/700 were distinguishable — any other authored weight was snapped to the nearest of those four.
  • Fully customizable guide buttons — each guide/tooltip/spotlight action button can set its own background color, text color, font size and weight, corner radius, padding, and margin, and choose one of four styles (fill, outline, text, elevated). Existing campaigns using the old style names (primary/secondary/ghost) keep rendering the same as before.
  • Configurable spotlight glow — a spotlight guide step can render a colored outline/glow around its highlighted target (color and width), instead of just a plain cutout.
  • Responsive inline carousel image sizing — an inline carousel can size its slides by aspect ratio, spanning the carousel's full width, instead of a fixed pixel height, and each slide can set its own image content fit (cover, contain, or fill). Carousels that only configure a fixed height keep their previous sizing.

Bug Fixes #

  • The survey upvote/downvote block is now single-select — choosing one option replaces the other, instead of both being selectable at once.

1.13.0 - 2026-07-23 #

New Features #

  • Typed host action handlers — a host app now provides DigiaConfig.actionHandlers (a DigiaActionHandlers with optional customKV, deepLink, and openURL callbacks) to own how deep-link, web-URL, and the new Custom KV actions are handled, and can also swap any of them at runtime via Digia.setCustomKVHandler, Digia.setDeepLinkHandler, and Digia.setOpenURLHandler. A registered handler fully owns its action; without a link handler the SDK falls back to Flutter's URL launcher; Custom KV has no fallback. This replaces the previous onAction interceptor.
  • Richer campaign action flows — inline carousel items, story items and their CTAs, and guide buttons can now run a full ordered onClick action flow (open URL / deep link, share, copy, dismiss, next, previous, and host-owned Custom KV), with campaign variables interpolated at tap time. Previously these surfaces could only run a single deep link or CTA. Existing single-action campaigns continue to work unchanged.
  • Inline countdown campaigns — a new SDK-owned inline campaign type that renders a countdown-to-deadline offer card: an active state (title, subtitle, optional image) counting down to a deadline, and an expired state (title, subtitle, optional body image, body text, and CTA) shown once the deadline passes, each with its own tap-action flow. Deadlines are ISO-8601 expressions; a value with no timezone offset is interpreted in India Standard Time (UTC+05:30). Surfaced through a DigiaSlot.
  • Inline banner campaigns — a new inline image-banner campaign type: a single image with configurable content fit, aspect ratio or fixed height, corner radius, and margins, plus a tap-action flow. Surfaced through a DigiaSlot.
  • Nudge video aspect ratio — nudge video content can specify an aspect ratio, which sizes the video frame; when set, the player preserves the source video's own ratio and letterboxes within the frame instead of stretching. Without one, the previous fixed-height behavior is unchanged.

Improvements #

  • An engage action flow is now resilient to a single failing step: if one action (a host handler or an SDK default) throws, the remaining actions in the flow still run, instead of the whole flow aborting.

1.12.0 - 2026-07-18 #

New Features #

  • Story overlay controls — inline story overlays can show dashboard-configured close and mute controls (visibility, icon color, background color, size) over the full-screen story viewer; the mute control only appears on video items. A story can also be configured to start all of its videos muted or audible by default, and once the viewer changes the audio state, that choice persists for the rest of the story session.

Bug Fixes #

  • Bottom-sheet nudges no longer leave a gap below the sheet on devices with a bottom safe-area inset.
  • Guide and Spotlight colors that specify an alpha channel (e.g. #80112233) now correctly combine that alpha with the component's own opacity, instead of the alpha being overwritten and ignored.
  • Survey welcome CTA taps, inline carousel item taps, and inline story opens now forward an engagement signal to connected CEP platforms (WebEngage, CleverTap, MoEngage), matching how other surfaces already behave. Previously these three surfaces only recorded the click in Digia's own analytics.

1.11.0 - 2026-07-14 #

New Features #

  • Single-image story previews — a story campaign can now render inline as one campaign-level cover image instead of the circular story strip; tapping it opens the story viewer at the first item. The image supports a BlurHash loading placeholder, content fit (cover/contain/fill), aspect ratio or fixed height, corner radius, and per-side padding. Campaigns that don't configure it — or configure it incompletely — keep rendering the story strip.
  • Story image content fit — each story item can choose how its image fills the full-screen viewer (cover, contain, or fill). Previously every image was cropped to cover.
  • Carousel item spacing and corner radius — inline carousels can set the gap between slides and the corner radius of each slide's image.
  • Clear inline content — new Digia.clearInlineContent([...]) and Digia.clearAllInlineContent() APIs remove loaded carousels and stories by placement key, or all of them at once. Inline content was previously retained for the life of the app session, so a signed-out user's content could linger across an account switch.

Improvements #

  • Analytics events that fail to send are now retried more reliably: the attempt count is persisted, so it survives an app restart instead of resetting; retries are capped at 10 attempts and back off exponentially up to two minutes with random jitter; and newly queued events no longer trigger an early send ahead of an already-scheduled retry.
  • Analytics logging now honors the log level set in DigiaConfig — routine retry chatter is verbose-only, and permanent event drops are surfaced as warnings. Previously analytics logged only in debug builds and ignored the configured level.
  • Guide outside-tap behavior is now either next (the default — advance, or dismiss after the last step) or nothing (scrim taps are inert). The dismiss value and the tooltip sticky flag have been removed.
  • Inline carousels always span the full available width; the per-campaign width override has been removed.

Bug Fixes #

  • Analytics events are no longer silently discarded when the server replies with a 4xx or a response the SDK can't parse — those batches are now retried like any other failure. Only events the server explicitly rejects are dropped.
  • The default maximum analytics batch size is lowered from 200 to 100 events; 200-event batches were failing on the backend.
  • Carousel images no longer rebuild and re-fetch on every rotation of the carousel, in both inline carousels and carousel nudges.
  • Completed segments in the story progress bar now render filled in the indicator's active color instead of a separate grey. The completedColor configuration value has been removed — completed segments follow activeColor.

1.10.0 - 2026-07-08 #

New Features #

  • Destructive button confirmation — buttons can be marked destructive; tapping one shows a confirm dialog (custom title/message/labels, message optional) before the action runs, styled in a fixed danger red.
  • Image loading placeholders — nudges, surveys, and inline carousels show a BlurHash preview while images load, instead of a blank box. Dashboard already auto-computes the hash, so no CMS-side burden.
  • In-App Review action — new CTA action type triggers the native "rate this app" prompt.
  • Linear progress bar — new nudge component, direct-percent or computed-range mode (e.g. "spent 700 of 1000").
  • Guides auto-dismiss on navigation — a guide no longer lingers on screen, orphaned, if the user navigates away mid-guide.

Improvements #

  • Video nudges: mute support wired end-to-end; playback failures now show "Couldn't load video" instead of a raw error dump.
  • Surveys: removed a hardcoded 480px max-height cap on question cards — content sizes naturally now.
  • Analytics events batched less frequently, in larger batches (flush interval 5s→30s, batch size 10→50) — fewer network calls.

Bug Fixes #

  • Guarded against a nudge occasionally re-presenting itself (and double-recording an impression) when unrelated inline-slot state changed.

1.9.0 - 2026-06-30 #

  • Text widget in Nudges now supports Rich Text.
  • Bug fixes in ToolTip/Spotlight arrow position and color.

1.8.0 - 2026-06-25 #

  • Lottie now supports Content Fit & Aspect Ratio

Changed #

  • Fixed click tracking issues

1.1.2 - 2026-04-18 #

Changed #

  • Fixed deduplication of inline impressions

1.1.1 - 2026-04-02 #

Changed #

  • Fixed FontAwesomeFlutter issues

1.1.0 - 2026-03-27 #

Changed #

  • Improved payload handling: inline campaigns now use type: inline + placementKey instead of command: SHOW_INLINE + placementId
  • Payloads missing both type and command are now dropped with a warning instead of silently ignored
  • DigiaSlot lookup updated to use placementKey
  • DigiaSlot and DigiaHost now handle render errors gracefully: collapse to SizedBox.shrink() in production, show an inline error box with console log in debug mode

1.0.0 - 2026-03-18 #

Added #

  • Initial stable release of the Digia Engage SDK

1.0.0-beta.2 - 2026-03-11 #

Added #

  • Inline support for DigiaSlot

1.0.0-beta.1 - 2026-03-11 #

Added #

  • Initial beta release
  • UI framework for custom UI from engagement platform
  • Public API exports for easy integration