Skip to content

Checklists

Checklists are onboarding task lists that help users complete a set of actions to get started with your product. They display as a floating panel with checkable items, a progress bar, and optional rewards for completion.

Overview

A checklist consists of:

  • Launcher -- A floating button or badge that opens the checklist panel
  • Panel -- A slide-out or dropdown panel listing all checklist items
  • Items -- Individual tasks with titles, descriptions, and completion criteria
  • Progress bar -- Visual indicator showing how many items are complete
  • Completion state -- Celebration or reward when all items are done

Checklists are ideal for:

  • New user onboarding (complete your profile, invite a team member, create your first project)
  • Feature adoption campaigns (try 5 key features in your first week)
  • Setup wizards (connect data source, configure settings, verify integration)
  • Trial-to-paid conversion flows (complete these steps to get the most out of your trial)

Creating a Checklist

Via the Admin Panel

  1. Navigate to Content > Checklists and click Create Checklist.
  2. Enter a checklist title and optional description.
  3. Add items, each with a title, description, and completion criteria.
  4. Configure the launcher position and style.
  5. Set trigger, audience, and scheduling rules.
  6. Click Publish.

Via the API

All non-tour content shares one admin endpoint — POST /v1/admin/content — discriminated by content_type. The items / completion / cta structure below is rendered by the SDK at display time, not enforced by the API schema today.

bash
POST /v1/admin/content
Content-Type: application/json
X-Api-Key: sk_live_...

{
  "content_type": "checklist",
  "name": "Getting Started",
  "title": "Get Started with Acme",
  "description": "Complete these steps to set up your workspace.",
  "items": [
    {
      "item_id": "complete-profile",
      "title": "Complete Your Profile",
      "description": "Add your name and profile photo.",
      "completion": {
        "type": "url_visit",
        "url_pattern": "/settings/profile"
      },
      "cta": {
        "text": "Go to Profile",
        "action": "url",
        "url": "/settings/profile"
      }
    },
    {
      "item_id": "invite-team",
      "title": "Invite a Team Member",
      "description": "Collaboration works best with your team.",
      "completion": {
        "type": "event",
        "event_name": "team.member_invited"
      },
      "cta": {
        "text": "Invite Someone",
        "action": "url",
        "url": "/settings/team"
      }
    },
    {
      "item_id": "create-project",
      "title": "Create Your First Project",
      "description": "Projects organise your work into focused areas.",
      "completion": {
        "type": "event",
        "event_name": "project.created"
      },
      "cta": {
        "text": "New Project",
        "action": "url",
        "url": "/projects/new"
      }
    },
    {
      "item_id": "connect-data",
      "title": "Connect a Data Source",
      "description": "Import your data to start building dashboards.",
      "completion": {
        "type": "event",
        "event_name": "datasource.connected"
      },
      "cta": {
        "text": "Add Data Source",
        "action": "url",
        "url": "/integrations"
      }
    }
  ],
  "launcher": {
    "position": "bottom-right",
    "style": "badge",
    "label": "Getting Started"
  },
  "completion": {
    "title": "You're All Set!",
    "body": "You've completed all the setup steps. Time to explore.",
    "confetti": true
  },
  "trigger": {
    "trigger_type": "first_visit"
  },
  "audience": {
    "rules": [
      { "attribute": "signup_date", "operator": "gte", "values": ["2025-06-01"] }
    ]
  }
}

Configuration

FieldTypeRequiredDescription
namestringYesInternal name for the checklist
titlestringYesChecklist heading shown to users
descriptionstringNoSubheading or introductory text
itemsarrayYesList of checklist items (see below)
launcherobjectNoLauncher button configuration
completionobjectNoCompletion celebration configuration
allow_skipbooleanNoAllow users to skip individual items (default: false)
dismiss_on_completebooleanNoAuto-dismiss the checklist when all items are done (default: false)
triggerobjectNoWhen to show the checklist
audienceobjectNoWho should see the checklist

Checklist Items

Each item represents a single task for the user to complete:

FieldTypeRequiredDescription
item_idstringYesUnique identifier for the item
titlestringYesItem title shown in the checklist
descriptionstringNoBrief description of what to do
completionobjectYesHow the item is marked complete
ctaobjectNoAction button for the item
requiredbooleanNoWhether this item is required for checklist completion (default: true)

Completion Criteria

Each item has a completion condition that determines when it gets checked off:

json
{
  "completion": {
    "type": "manual"
  }
}
json
{
  "completion": {
    "type": "event",
    "event_name": "project.created"
  }
}
json
{
  "completion": {
    "type": "url_visit",
    "url_pattern": "/settings/profile"
  }
}
json
{
  "completion": {
    "type": "tour_complete",
    "tour_id": "dashboard-tour"
  }
}
Completion TypeDescription
manualUser clicks the checkbox to mark it complete
eventAutomatically completes when a matching event fires
url_visitAutomatically completes when the user visits a matching URL
tour_completeAutomatically completes when the user finishes a specific tour

TIP

URL-based completion confirms a page visit but not the action. Use event completion when you need precision (e.g. the user genuinely created a project, not just visited the page where they could).

Item CTA

Each item can have a call-to-action button that directs the user to complete the task:

json
{
  "cta": {
    "text": "Go to Settings",
    "action": "url",
    "url": "/settings/profile"
  }
}

CTA actions:

ActionDescription
urlNavigate to a URL
tourStart a specific tour
trackFire a custom event

Launcher

The launcher is a floating button that opens the checklist panel. It persists on screen while the checklist has incomplete items.

Position

ValueDescription
bottom-rightBottom-right corner of the viewport (default)
bottom-leftBottom-left corner of the viewport
top-rightTop-right corner of the viewport
top-leftTop-left corner of the viewport

Style

StyleDescription
badgeSmall badge showing the checklist label and progress count (default)
buttonProminent button with the checklist title
iconCompact icon-only launcher
json
{
  "launcher": {
    "position": "bottom-right",
    "style": "badge",
    "label": "Setup Guide"
  }
}

The launcher displays a progress indicator (e.g., "2/4") showing how many items are complete.

Progress Tracking

Checklist progress is tracked per user. Each item's completion state is persisted, so if a user closes the browser and returns later, their progress is preserved.

The progress bar at the top of the checklist panel shows overall completion:

[===========--------] 3 of 5 complete

Progress bar styling uses the --spot-progress-bg and --spot-progress-fill theme variables.

Completion Celebration

When all required items are complete, the checklist can show a celebration:

json
{
  "completion": {
    "title": "Setup Complete!",
    "body": "You've finished all the setup steps. Explore your new workspace.",
    "confetti": true,
    "cta": {
      "text": "Start Exploring",
      "action": "url",
      "url": "/dashboard"
    }
  }
}
FieldTypeDescription
titlestringCompletion heading
bodystringCompletion message (supports safe HTML)
confettibooleanShow a confetti animation on completion
ctaobjectOptional action button

Skippable Items

When allow_skip is true, each item shows a "Skip" link that marks it as skipped. Skipped items count towards completion (the checklist can still reach 100%) but are tracked separately in analytics.

json
{
  "allow_skip": true
}

Items with required: true cannot be skipped even when allow_skip is enabled.

Programmatic Control

Checklists surface based on trigger + audience rules. Items complete via the configured completion type — url_visit, tour_complete, event, or manual (user clicks the checkbox).

Hook content:dismiss to react when a user closes the checklist:

js
Spotlight.on('content:dismiss', (data) => {
  console.log(`User dismissed content: ${data.contentId}`);
});

Styling

Checklists inherit all --spot-* theme variables. Key variables for checklist appearance:

VariableEffect
--spot-bgPanel background colour
--spot-textItem text colour
--spot-primaryLauncher colour, checked item icon colour
--spot-borderPanel border, item divider colour
--spot-radius-lgPanel border radius
--spot-shadow-lgPanel box shadow
--spot-progress-bgProgress bar background
--spot-progress-fillProgress bar fill colour
--spot-successCompleted item checkmark colour

Analytics

Checklist analytics are tracked automatically:

EventDescription
content:viewChecklist panel was opened
checklist:item_completeA single item was completed
checklist:completeAll required items are complete
content:dismissChecklist panel was closed

The admin analytics dashboard shows:

  • Per-item completion rates (which items do users complete first, which do they skip?)
  • Overall checklist completion rate
  • Average time to complete the full checklist
  • Drop-off analysis (which items cause users to abandon the checklist?)

Best Practices

  • Keep checklists short -- 3 to 6 items is the sweet spot. More than 7 items feels overwhelming.
  • Order items by importance -- Put the most impactful actions first. Users are most motivated at the start.
  • Use event-based completion -- Track actual user actions rather than relying on URL visits alone.
  • Celebrate completion -- The confetti and completion message create a positive moment that reinforces the behaviour.
  • Make items actionable -- Every item should have a clear CTA that takes the user directly to where they can complete the task.
  • Consider required vs optional -- Mark nice-to-have items as required: false so the checklist can complete without them.

Spotlight