Developer documentation

OOnboard v1.0.0

A self-hosted WordPress onboarding flow builder — 10 step types, conditional branching, A/B testing, drop-off analytics, and post-completion automation. Your data, your database, no SaaS fees.

WordPress plugin WP 6.0 · PHP 8.0+ GPL-2.0-or-later 2026-04-25
01 · Overview

What OOnboard does

Multi-step guided experiences for new users — from simple welcome screens to quiz-driven branching flows with registration gating, video steps, and post-completion automation. Self-hosted, WordPress-native, no monthly SaaS cost.

🏗️
10 step types
Welcome, info, video, form, registration gate, checklist, quiz, feature highlight, countdown, success
🔀
Conditional branching
Quiz steps route users to different steps via next_step_index
🧪
A/B testing
Variant A vs B with automatic winner detection by completion rate
📉
Drop-off analytics
Per-step view counts and color-coded abandonment rate
Post-flow actions
Redirect, XP award, badge, OMailer subscribe, role change, signed webhook
🏷️
Merge tags
Personalise any step with {{user_name}}, {{site_name}}, and custom tags
🔗
Orravo integrations
ORegister (XP + badges) and OMailer (list subscribe) built-in
🛡️
Self-hosted
All data in your own database. No third-party service dependency.
FeatureOOnboardUserGuidingAppcues
Self-hosted❌ SaaS❌ SaaS
WordPress-native
Data stays in your DB
Registration gating in-flow
ORegister + OMailer integration
CostOne-time / annual$89–249/mo$249+/mo
02 · Installation

Getting installed

1
Upload the oonboard folder to /wp-content/plugins/ or install via WP Admin → Plugins → Add New → Upload.
2
Activate through the WP Admin Plugins screen.
3
On activation, OOnboard creates two database tables ({prefix}oob_progress, {prefix}oob_events) and registers the oo_flow custom post type.
4
Navigate to OOnboard in the WordPress admin sidebar.
ℹ️Requires WordPress 6.0+, PHP 8.0+, MySQL 5.7+ / MariaDB 10.3+, and jQuery (bundled with WordPress).
03 · Quick Start

Your first flow in minutes

1
Go to OOnboard → Flows and click New Flow.
2
Enter a flow name and click Create Flow — you'll be taken to the Builder.
3
Click + Add Step, choose Welcome Screen, and fill in title, content, and button text.
4
Add more steps as needed.
5
In Flow Settings, choose your Display Style and Trigger.
6
Click Save Flow, then Activate Flow to publish it.
7
Copy the shortcode and paste it wherever you want the launch button:
[oonboard_trigger id="YOUR_FLOW_ID" label="Start"]
04 · Admin Interface

Admin interface

Persistent two-row sticky header — brand bar (icon + name + version + light/dark toggle) plus a horizontal tab nav. Theme preference persisted to localStorage under key oob_theme.

4.1 · Dashboard

Dashboard

Four-stat summary row — Total Flows, Flow Starts, Completions, Avg Completion Rate — followed by a table of recent flows with per-flow conversion stats.

4.2 · Flows

Flows tab

Lists all flows with name, display style, trigger type, status pill (Active / Draft), start count, and completion rate. Actions: Edit (opens Builder), Duplicate, Delete. Live search filters flows by name.

4.3 · Builder

Flow builder

PanelContents
Left — Steps listOrdered steps with index + type. + Add Step opens the type picker (10 types). Each row has Edit, Move Up, Move Down, Delete.
Right — Step EditorAppears when editing a step. Common fields: Title, Content, Button Text, Skip Text. Type-specific fields appear below.
Right — Flow SettingsAlways visible: Flow Name, Display Style, Progress Style, Trigger, Target Page ID, Allow Skip, Resume Position, Back Button, A/B Test, Post-Flow Actions (redirect, message, XP, OMailer, role, webhook).
💡Save Item stages changes locally. Click the top-right Save Flow to persist to the database. The flow must be Activated (not Draft) to be visible to users.
4.4 · Progress

Progress tab

Paginated table of all user interactions. Filter by flow or status. Delete individual records with the trash icon.

ColumnDescription
UserDisplay name + email, or "Guest" for anonymous users
FlowFlow name
VariantA or B (for A/B tests)
Statusstarted completed abandoned
StepCurrent step number
TimestampsStarted at / Completed at
4.5 · Analytics

Analytics tab

Per-flow analysis. Select a flow from the dropdown to see stats.

ComponentDescription
Stats rowTotal Starts, Completions, Completion Rate, Avg Completion Time
Daily Completions chartCanvas bar chart — daily completions over last 30 days
Step Drop-Off tablePer-step view counts and abandonment percentage
A/B Test ResultsSide-by-side cards for Variant A and B; "Winner" badge on the higher completion rate
Drop-off <10% — healthy
10–30% — investigate
>30% — needs attention
4.6 · Settings

Global settings

SettingDescription
Default Display StyleApplied to new flows; can be overridden per flow
Disable for adminsAuto-trigger flows won't fire for WordPress admin users
Load assets globallyEnqueue frontend CSS/JS on all pages — needed for manual trigger buttons in headers/footers
Default OMailer List IDDefault list for post-flow OMailer subscriptions
ORegister XP event keyThe event key sent to ORegister on flow completion

The Settings tab also shows a Merge Tags Reference and Shortcode Reference panel in-admin.

05 · Step Types Reference

Ten step types

👋
welcome
Welcome Screen
Large headline, subheading, background image, CTA button. The opening screen of your flow.
📄
info
Informational
Title + rich text body (HTML, images, embeds) + Continue button.
🎬
video
Video Step
YouTube, Vimeo, or self-hosted MP4. Optional auto_advance when video ends via API.
📝
form
Form Step
Text, email, tel, number, textarea, select, checkbox, radio fields. Data saved to user_meta.
🔐
registration_gate
Registration Gate
Prompts guest users to register mid-flow. Flow continues automatically after wp_create_user().
checklist
Checklist
List of tasks the user checks off. Optional all_required gate before advancing.
🧩
quiz
Quiz / Assessment
Multiple-choice with next_step_index per option for conditional branching paths.
🔦
feature_highlight
Feature Highlight
Spotlight overlay via CSS selector. Dims the page, boxes the target with a glowing border.
⏱️
countdown
Countdown
Real-time countdown to a target ISO date-time. Creates urgency for time-sensitive onboarding.
🎉
success
Success / Completion
Celebration screen with optional confetti. Optional redirect after redirect_delay seconds.
06 · Display Styles

Four display styles

🪟
modal
Modal
Centered overlay with dimmed backdrop. Default.
🖥️
full-page
Full-Page
Fills the entire viewport with a solid dark backdrop.
↪️
slide-in
Slide-In
Panel slides in from the right edge of the screen.
📌
embedded
Embedded
Renders inline inside a page element. No overlay.

Set per-flow in Flow Settings. Can also be overridden by the style attribute on the trigger shortcode.

07 · Progress Indicators

Progress indicators

TypeDescription
barThin accent-colored progress bar at the top of the flow card
steps"Step 2 / 5" text label
dotsRow of clickable dots, one per step
percentPercentage text — e.g. "40%"
noneNo progress indicator shown
08 · Flow Triggers

Flow triggers

TriggerWhen it fires
ManualOnly when the user clicks a [oonboard_trigger] button or OOBFrontend.launchFlow() is called
First LoginHooks into wp_login. Queues the flow after the first login and auto-launches it on the next page load.
Page LoadAuto-launches when a user visits the configured Target Page ID. Excludes anonymous users and already-completed users.
Time-BasedReserved for Pro — trigger N days after the user's registration date.
09 · Conditional Branching

Conditional branching

Implemented via the Quiz step type. Each answer option has a next_step_index field that overrides the default sequential next step.

When a user selects an option, OOB_Engine::ajax_complete_step() reads the chosen option's next_step_index and jumps there instead of current_index + 1. If next_step_index is null, the flow advances normally.

💡Example: A quiz at step 2 routes Option A → step 3 (advanced flow) and Option B → step 5 (basic flow). This enables two completely different paths through the same flow based on user answers.
10 · Merge Tags

Merge tags

Double-brace {{placeholders}} replaced at render time by OOB_Merge_Tags::process(). Work in step title, content, and subheading fields.

TagReplaced with
{{user_name}}User's display name — "there" for guests
{{user_first}}User's first name
{{user_last}}User's last name
{{user_email}}User's email address
{{site_name}}WordPress site name
{{site_url}}WordPress home URL
{{current_date}}Today's date (WordPress date format)
{{current_year}}Current year (4 digits)
{{admin_email}}Admin email address

Custom merge tags

PHPadd_filter('oob_merge_tag_context', function($context, $flow_id, $user_id) {
    $context['custom']['plan_name'] = 'Pro';
    return $context;
}, 10, 3);

// Now use {{plan_name}} in any step field
11 · Post-Flow Actions

Post-flow actions

Run automatically when a user completes the final step, via OOB_Actions::run(). Configure in Builder → Flow Settings.

ActionDescription
Redirect URLRedirect the user's browser to a specified URL
Success MessageDisplay a custom message on the completion screen
Award XPCalls oregister_award_xp($user_id, $amount, $event_key) — requires ORegister
Award Badge IDCalls oregister_award_badge($user_id, $badge_id) — requires ORegister
OMailer List IDSubscribes user to an OMailer list via om_subscribe() — requires OMailer
Assign WP RoleChanges the user's WordPress role on completion
Webhook URLSends a POST request with a JSON payload to an external URL
Webhook SecretHMAC-SHA256 signs the payload — header: X-OOnboard-Signature
JSON · webhook payload{
  "event":   "flow_completed",
  "flow_id": 42,
  "user_id": 7,
  "time":    1745625600
}
12 · A/B Testing

A/B testing

Enable per-flow in Builder → Flow Settings → A/B Test checkbox. New users are randomly assigned 50/50 to Variant A (original steps) or Variant B (separate step set).

DetailValue
Variant assignmentRandom 50/50 for new users. Stored in {prefix}oob_progress.variant — users always see the same variant.
Variant B stepsStored in _oob_variant_b post meta. A "Variant B" step list appears in the builder when A/B testing is enabled.
ResultsAnalytics tab → A/B Test Results section. Side-by-side starts, completions, completion rate. "Winner" badge on the higher-performing variant.
13 · Shortcodes

Shortcodes

[oonboard id="X"]

Embeds a flow inline on any page or post in Embedded display style.

[oonboard id="42"]
AttributeRequiredDescription
idYesFlow post ID

[oonboard_trigger id="X" label="Start"]

Renders a styled button that launches a flow when clicked.

[oonboard_trigger id="42" label="Start the Tour" style="modal"]
AttributeDefaultDescription
idFlow post ID (required)
labelStartButton text
stylemodalmodal, full-page, slide-in, embedded
classAdditional CSS classes for the button element
14 · Gutenberg Block

Gutenberg block

OOnboard registers an OOnboard Flow block in the Gutenberg editor under the Widgets category.

1
In the block editor, search for "OOnboard" or find it under Widgets.
2
Insert the block and select which flow to embed in the block settings sidebar.
3
The block uses server-side rendering — calls OOB_Shortcode::render_embed() at display time. In the editor it shows a preview card with the flow name and ID.
15 · Integrations

Orravo integrations

ORegister
XP & Badges
Calls oregister_award_xp() and oregister_award_badge() on flow completion. XP event key configurable in Settings. ORegister must be installed and active.
OMailer
List Subscribe
Calls om_subscribe() with first_name, last_name, list_id, and source on completion. OMailer must be installed and active.
OForms
Field vocabulary
Form step fields mirror OForms field types. Full OForms renderer integration is on the roadmap for a future release.
PHP · OMailer callom_subscribe( $user_email, [
    'first_name' => $user->first_name,
    'last_name'  => $user->last_name,
    'list_id'    => $list_id,
    'source'     => 'oonboard',
] );
16 · Developer API

Developer API

PHP helper functions

PHP// Check if the current user has completed a flow
oob_has_completed_flow( int $flow_id, int $user_id = 0 ): bool

// Get the admin builder URL for a flow
oob_get_flow_url( int $flow_id ): string

OOB_Flow — flow CRUD

PHPOOB_Flow::create( string $name, array $settings = [] ): int
OOB_Flow::update( int $id, array $data ): bool
OOB_Flow::delete( int $id ): bool
OOB_Flow::duplicate( int $id ): int
OOB_Flow::get( int $id ): ?WP_Post
OOB_Flow::get_all( array $args = [] ): array
OOB_Flow::get_steps( int $id ): array
OOB_Flow::get_settings( int $id ): array
OOB_Flow::get_post_actions( int $id ): array

OOB_Progress — progress tracking

PHPOOB_Progress::upsert( int $flow_id, int $user_id, string $session_key ): int
OOB_Progress::update_step( int $flow_id, int $step_index, int $user_id, string $session_key ): void
OOB_Progress::complete( int $flow_id, int $user_id, string $session_key ): void
OOB_Progress::abandon( int $flow_id, int $user_id, string $session_key ): void
OOB_Progress::has_completed( int $flow_id, int $user_id ): bool
OOB_Progress::log_event( int $flow_id, string $event, int $step_index, ... ): void

OOB_Analytics

PHPOOB_Analytics::get_flow_stats( int $flow_id ): array
OOB_Analytics::get_dashboard_totals(): array
OOB_Analytics::get_dropoff_by_step( int $flow_id ): array
OOB_Analytics::get_ab_stats( int $flow_id ): array

OOB_Merge_Tags

PHPOOB_Merge_Tags::process( string $content, array $context = [] ): string
OOB_Merge_Tags::get_available_tags(): array

JavaScript API

JS// Programmatically launch a flow
OOBFrontend.launchFlow( flowId, displayStyle );

// Close a running flow
OOBFrontend.closeFlow( flowId );
17 · Database Schema

Database schema

oob_progress

ColumnTypeDescription
idBIGINT UNSIGNEDPrimary key
user_idBIGINT UNSIGNEDWordPress user ID — 0 for guests
flow_idBIGINT UNSIGNEDPost ID of the oo_flow CPT
variantVARCHAR(8)A or B (A/B tests)
step_indexSMALLINTCurrent step the user is on
statusVARCHAR(20)started, completed, or abandoned
session_keyVARCHAR(64)PHP session key for guest users
started_atDATETIMEUTC timestamp of flow start
updated_atDATETIMEUTC timestamp of last update
completed_atDATETIMEUTC timestamp of completion (NULL if incomplete)

Indexes: (user_id, flow_id), (flow_id, status)

oob_events

ColumnTypeDescription
idBIGINT UNSIGNEDPrimary key
user_idBIGINT UNSIGNEDWordPress user ID
flow_idBIGINT UNSIGNEDFlow post ID
step_indexSMALLINTStep the event occurred on
event_typeVARCHAR(30)start, step_view, step_complete, complete, skip, abandon
variantVARCHAR(8)A/B variant
session_keyVARCHAR(64)Guest session key
created_atDATETIMEUTC event timestamp

Indexes: (flow_id, event_type, created_at), (flow_id, step_index, event_type)

Custom post type: oo_flow

Meta keyTypeDescription
_oob_stepsJSONArray of step objects
_oob_settingsJSONFlow settings object
_oob_post_actionsJSONPost-completion action settings
_oob_variant_bJSONArray of step objects for Variant B
18 · REST / AJAX Endpoints

AJAX endpoints

All endpoints registered via wp_ajax_* hooks and require a valid nonce.

Frontend endpoints (public + logged-in)

ActionMethodDescription
oob_get_flow_initPOSTGet flow metadata and resume index. Params: flow_id
oob_get_stepPOSTFetch a step's rendered data. Params: flow_id, step_index
oob_complete_stepPOSTMark step complete, get next step index. Params: flow_id, step_index, quiz_answer (opt), form_data (opt)
oob_skip_stepPOSTSkip a step, advance to next
oob_abandon_flowPOSTMark flow as abandoned

Admin endpoints (requires manage_options)

ActionDescription
oob_create_flowCreate a new flow
oob_save_flowSave steps, settings, and post-actions
oob_delete_flowDelete a flow
oob_duplicate_flowDuplicate a flow
oob_save_settingsSave global plugin settings
oob_get_flow_dataGet full flow data as JSON
oob_delete_progressDelete a progress record by ID
19 · Hooks & Filters

Hooks & filters

Actions

HookArgumentsDescription
oob_flow_completed$flow_id, $user_id, $actionsFired when a user completes a flow
oob_flow_started$flow_id, $user_idAvailable for custom extension on flow start
PHPadd_action('oob_flow_completed', function($flow_id, $user_id, $actions) {
    if ($flow_id === 42) {
        update_user_meta($user_id, 'onboarding_complete', '1');
    }
}, 10, 3);

Filters

FilterArgumentsDescription
oob_merge_tag_context$context, $flow_id, $user_idAdd custom merge tag values to the context
oob_step_html$html, $step, $flow_idFilter the rendered HTML of any step
oob_flow_settings$settings, $flow_idFilter flow settings before they're used
20 · FAQ

Frequently asked questions

Can guests (non-logged-in users) use OOnboard flows?
Yes. For guest users, OOnboard uses PHP session keys to track progress. Guest data is stored in {prefix}oob_progress with user_id = 0 and a session_key.
Does the plugin slow down my site?
OOnboard's frontend assets are registered but not enqueued unless a flow shortcode is present on the page, or Load assets globally is enabled in Settings. The AJAX calls are lightweight and cached at the WP object cache layer where available.
How do I show a flow to returning users again?
Call OOB_Progress::reset($flow_id, $user_id) programmatically, or provide a restart button using [oonboard_trigger].
Can I use multiple flows on the same page?
Yes. Each flow instance tracks its own state independently. You can embed multiple [oonboard] shortcodes or trigger buttons on the same page.
What happens to flow data when I uninstall the plugin?
OOB_DB::uninstall() drops the {prefix}oob_progress and {prefix}oob_events tables, deletes all oo_flow posts, and removes OOnboard options. This is permanent.
Can I reset analytics for a flow?
Not yet from the admin UI. Use DELETE FROM {prefix}oob_events WHERE flow_id = X and DELETE FROM {prefix}oob_progress WHERE flow_id = X directly in your database.
How does A/B testing work for returning users?
A user's variant assignment is stored in the variant column of {prefix}oob_progress. Once assigned, they always see the same variant. New users are randomly assigned 50/50.
Does OOnboard integrate with WooCommerce?
Not natively, but you can trigger flows after WooCommerce events using the oob_flow_completed action hook alongside WooCommerce's own hooks — for example, triggering a welcome flow after a first purchase.
21 · Changelog

What's shipped

v1.0.0 Initial release · 2026-04-25
  • Flow builder admin with 10 step types
  • Full-page, modal, slide-in, and embedded display styles
  • Progress bar, step numbers, dots, and percentage indicators
  • Conditional branching via quiz step next_step_index
  • Resume from last position
  • Auto-launch triggers: first login, page load
  • User progress table with status and step tracking
  • Drop-off analysis per step with color coding
  • Daily completions chart (30-day canvas)
  • A/B flow testing with variant assignment and comparison
  • Post-flow actions: redirect, success message, role, XP, badge, OMailer, webhook
  • HMAC-SHA256 signed webhooks
  • Merge tags: {{user_name}}, {{site_name}}, etc.
  • Shortcodes: [oonboard id], [oonboard_trigger id]
  • Gutenberg block with server-side rendering
  • ORegister and OMailer integration hooks
  • Dark/light admin theme with token system
  • Complete uninstall hook — removes all data
  • oob_flow_completed action hook for developer extensibility
✦ Need help?

Got a question about OOnboard?

Reach out directly — Kenneth replies within 24 hours.