Nudge library

BoomTower seeds a tenant-wide catalog of approved nudges via versioned library migrations. Each library nudge has a stable libraryKey slug. Partner apps (for example HeadRight) should map their UI presets to these keys — not to display names or hardcoded KSUIDs.

How library nudges work

  1. Tenant library — migrations upsert nudges with source: "library" and a unique libraryKey. IDs are deterministic per tenant.
  2. Organization catalog — each org activates a subset via PATCH /v1/organizations/{id} with a nudges array. Members only receive nudges that are active in their org catalog.
  3. Member toggles — per-member on/off and schedule overrides use GET/PATCH …/members/…/nudge-settings (see REST API).
  4. Reply tracking — set responseType on a nudge and fetch standardized replies via GET /v1/nudges/{key}/replies (see Nudge replies).

HeadRight preset mapping

Map each HeadRight habit preset to the libraryKey below. Resolve the BoomTower nudge id once via GET /v1/nudges (filter source === "library") and cache libraryKey → id.

HeadRight presetlibraryKeyDisplay name
daily-commitdaily-commitDaily Commit
weigh-inweigh-inWeekly weigh-in
push-upspush-upsPush-ups
guzzle-your-gallonguzzle-your-gallonGuzzle your gallon
booze-checkbooze-checkBooze check
bedtimebedtimeBedtime for Bonzo
weekly-report-cardweekly-report-cardFriday report card

Integration flow

Recommended approach for HeadRight (server-side, using your organization API key):

  1. On connect (or first dashboard load), call GET https://api.boomtower.com/v1/nudges with X-API-Key.
  2. Build a map of library nudges: libraryKey → id where source === "library".
  3. When a user toggles a preset, PATCH member nudge settings with the resolved nudgeId and enabled.
GET https://api.boomtower.com/v1/nudges
X-API-Key: YOUR_ORG_API_KEY

// Response entries include:
// { "id": "…", "source": "library", "libraryKey": "water", "name": "Drink water", … }
PATCH https://api.boomtower.com/v1/organizations/{orgKsuid}/members/nudge-settings?externalApp=headright&externalId={userId}
X-API-Key: YOUR_ORG_API_KEY
Content-Type: application/json

{
  "data": {
    "overrides": [
      { "nudgeId": "RESOLVED_NUDGE_KSUID", "enabled": true }
    ]
  }
}

Do not match nudges by display title or hardcode KSUIDs. Keys and names can evolve; libraryKey is the stable contract.

BoomTower will activate all HeadRight habit nudges in your organization catalog. Until that is done, toggles for missing catalog entries will fail with a "not in organization catalog" error.

Full catalog

Default prompts and schedules below. Times are interpreted in each member's timezone when nudges are sent.

Daily check-in

daily-check-in

How are you feeling today? Reply with a number 1-10 or a few words.

Daily at 9:00 AM (member timezone) · bucket: wellness

Drink water

water

Time for a glass of water — stay hydrated.

Daily at 10:00 AM (member timezone) · bucket: habits

Do pushups

pushups

Quick strength break — drop and give yourself a few pushups.

Daily at 11:00 AM (member timezone) · bucket: habits

Stretch

stretch

Loosen up — stretch your back and shoulders for a minute.

Daily at 2:00 PM (member timezone) · bucket: habits

Take a walk

walk

Get the steps in — take a short walk if you can.

Daily at 3:00 PM (member timezone) · bucket: habits

Deep breath

breath

Reset with a few slow, deep breaths.

Daily at 12:00 PM (member timezone) · bucket: habits

Posture check

posture

Posture check — sit tall and relax your shoulders.

Daily at 2:30 PM (member timezone) · bucket: habits

Gratitude

gratitude

What's one thing you're grateful for today?

Daily at 6:00 PM (member timezone) · bucket: habits

Wind down

sleep

Start winding down for bed — screens off when you can.

Daily at 9:00 PM (member timezone) · bucket: habits

Daily Commit

daily-commitHeadRight: daily-commit

Do you commit to getting your headright today so you can be here tomorrow?

Daily at 8:00 AM (member timezone) · bucket: habits

Weekly weigh-in

weigh-inHeadRight: weigh-in

Results! What do you weigh (in lbs)?

Daily at 8:00 AM (member timezone) · bucket: habits

Push-ups

push-upsHeadRight: push-ups

Drop and give me as many as you got! How many pushups did you have in you?

Daily at 12:00 PM (member timezone) · bucket: habits

Guzzle your gallon

guzzle-your-gallonHeadRight: guzzle-your-gallon

Did you guzzle your gallon? How much water did you drink today (in oz)?

Daily at 5:00 PM (member timezone) · bucket: habits

Booze check

booze-checkHeadRight: booze-check

Did you bend to the booze? How many drinks did you have today?

Daily at 8:00 PM (member timezone) · bucket: habits

Bedtime for Bonzo

bedtimeHeadRight: bedtime

Bedtime for Bonzo! Go the hell to bed!

Daily at 11:00 PM (member timezone) · bucket: habits

Friday report card

weekly-report-cardHeadRight: weekly-report-card

AI-generated weekly report card image from member chat history.

Daily at 5:00 PM (member timezone) · bucket: habits

Example preset map (TypeScript)

// presets.ts — stable mapping; resolve ids at runtime from GET /v1/nudges
export const PRESET_LIBRARY_KEYS = {
  water: 'water',
  pushups: 'pushups',
  stretch: 'stretch',
  walk: 'walk',
  breath: 'breath',
  posture: 'posture',
  gratitude: 'gratitude',
  sleep: 'sleep',
} as const;

export async function resolveLibraryNudgeIds(apiKey: string): Promise<Record<string, string>> {
  const res = await fetch('https://api.boomtower.com/v1/nudges', {
    headers: { 'X-API-Key': apiKey },
  });
  const body = await res.json();
  const map: Record<string, string> = {};
  for (const nudge of body.data ?? []) {
    if (nudge.source === 'library' && nudge.libraryKey) {
      map[nudge.libraryKey] = nudge.id;
    }
  }
  return map;
}

Public docs URL: https://boomtower.com/docs/nudge-library

API reference: https://boomtower.com/docs · Embed consent: https://boomtower.com/docs/embed-consent · Nudge replies