GTM Kit 2.12.0 ships the Introductions Framework: an in-product modal channel for welcoming new users, announcing add-on launches, and surfacing version-specific notes, served from gtmkit.com so we can iterate on the message without shipping a new plugin release each time.
If you are an existing user on a running install, you see no visible change after the upgrade. The framework is deliberately quiet on existing sites: there is no welcome modal for users who have already been using GTM Kit, and the remote-announcement channel is empty by default. Two bug fixes also ride along.
If you build on top of GTM Kit, there is a new public API. Read on.
What changed
A welcome modal for fresh installs
Fresh installs of 2.12.0 and later see a brief welcome modal on the first GTM Kit admin page they open, linking to the documentation. The modal is dismissible four ways (ESC, close button, dismiss CTA, click on the overlay) and never returns once dismissed. The setup wizard is undisturbed.
The welcome modal is gated on gtmkit_initial_version >= 2.12.0. Existing installs upgrading from 2.11.0 or earlier never see it. This is intentional: existing users already finished onboarding long ago and do not need a welcome.
A remote channel for launch and upgrade announcements
The framework fetches announcement content from gtmkit.com via the existing 12-hour transient pattern already used for plugin metadata. Announcements render through a fixed set of generic content blocks (heading, body, image, video embed, primary CTA, secondary CTA). The schema is validated on the wire; anything off-schema is dropped quietly.
The remote channel is currently empty by design. When we have something worth announcing in-product, it goes through this surface and reaches users without waiting for a plugin release.
Public API for add-ons
Two pieces of public extensibility land in this release.
PHP filter. Add-ons can register their own modals by hooking into gtmkit_introductions:
add_filter( 'gtmkit_introductions', function( array $introductions ): array {
$introductions[] = new MyAddon\My_Feature_Launch_Introduction();
return $introductions;
} );
The registered class must implement \TLA_Media\GTM_Kit\Admin\Introductions\Domain\Introduction_Interface. The interface defines get_id(), get_priority(), should_show(), get_render_mode(), and get_blocks(). Lower priority wins; one modal renders per admin page load.
JS API. Component-rendered modals register their React component via a stable global:
window.gtmkit.introductions.registerComponent( 'my-intro-id', MyComponent );
The API is race-safe: a pending-queue fallback handles the case where your bundle loads before the framework boots.
REST dismissal route. POST /wp-json/gtmkit/v1/introductions/{id}/seen records a per-user dismissal. Capability check is edit_posts. Per-user state lives in user meta and is removed on plugin uninstall.
Developer reference is in the plugin source under docs/internal/introductions.md.
Two bug fixes
Hidden product-data tag no longer crashes the page on a re-run product loop. Some plugins (WP Grid Builder is one) re-run WooCommerce’s product loop on shop and archive pages without a current product in context. GTM Kit’s hidden product-data tag previously fataled in that path; it now skips and continues.
WP-CLI no longer logs “headers already sent” when Cookie Keeper is enabled. The notice was harmless but noisy. Translation registration now happens at the right moment in the WP-CLI request lifecycle.
Developer notes
- New PHP filter:
gtmkit_introductions. Receives and returnsIntroduction_Interface[]. Non-conforming entries are silently dropped. - New PHP interface:
\TLA_Media\GTM_Kit\Admin\Introductions\Domain\Introduction_Interface. Five methods:get_id,get_priority,should_show,get_render_mode,get_blocks. - New JS API:
window.gtmkit.introductions.registerComponent(id, Component). Fires thegtmkit.introductions.readyaction once the API is exposed; safe to wire from add-on bundles regardless of load order. - New REST route:
POST /wp-json/gtmkit/v1/introductions/{id}/seen. Capabilityedit_posts. - New user meta key:
_gtmkit_introductions. Cleaned up on uninstall.
What’s next
The Introductions Framework is plumbing. Over the next releases we will start using it ourselves for add-on launch announcements and major-feature intros. Add-ons can wire in their own intros against the public filter today.
Leave a Reply