Draft for review

Q in Outreach

Where Q's cards go in QLU Outreach: when each one appears, what it points at, and what it says. 44 cards across one guided first campaign, from the assignment's Message button to the campaign page, plus one-time tips after it.

  • 26 September 2026
  • Follows Q-DESIGN.md and ONBOARDING-HANDOFF.md (fs-Qlu2-frontend, aabid/people-search-onboarding)
  • Read against fs-QOutreach-frontend main @ 1ce71d7c

How Q behaves here

  • Q fills; the person decides. Q may type into the chat box and demonstrate a control, then put it back. It never sends, publishes, starts a call or pauses a campaign.
  • Nothing while QLU writes. No card while the chat streams or messages are being generated, rewritten or published. Cards about finished content only.
  • One card at a time, always closable, never over the bottom bar's buttons, the chat box or an open dropdown.
  • Moments, not a tour. Up to three per screen, each with Show me. No step counter, no Skip.
  • First-touch tips appear once, 0.75 s after the person's own action, and go with Got it or ×.

Learn row: Outreach

  1. Rounds set
  2. Sample message approved
  3. Campaign published
  4. First reply opened

The Learn page already lists Outreach as coming soon, with the first workflow "Send a first message to a shortlist". The guided run ends at outcome 3. Lessons are named or.* and anchors or-*.

HelloQ's first card on a screen Guided runpart of the first campaign; stops after publish Momentup to three on a screen, with Show me First touchonce, after the person's own action

Step 1 of the first campaign

Getting started

Assignment People tab and the Message dialog (in QLU), Outreach home, the three template pages

Every campaign starts in QLU: the person ticks people on an assignment's People tab and selects Message. The first two cards are built in fs-Qlu2-frontend, where People Search's lessons are readable, so they can follow its last card ("Saved to Prospects").

Hello

Message these people

Appears
The first time someone with no campaigns ticks people on an assignment's People tab.
Points at
Message button (MessageButtonV2) · anchor as-message
Stands
Below the button, spotlight.
Note
Built in QLU, not Outreach. Replaces the older message-onboarding-completed hint and the Message button's pulse.

Message these people

Message starts an outreach campaign for the people you've ticked. You choose the rounds and channels, QLU writes a message for each person, and nothing is sent until you publish.

Got it
Guided run

Four ways to start

Appears
The Message dialog opens for the first time.
Points at
The dialog (MessageModal) · [role="dialog"]
Stands
Right of the dialog.

Four ways to start

Create From Scratch lets you set every round yourself. AI-Generated Templates suggests sequences for these people. Saved Templates reuses one you saved. Add to Existing Campaign puts them into a campaign that's already running.

Got it
Hello

Campaigns start from an assignment

Appears
Outreach home loads for someone with no campaigns at all, 1.1 s after load. Decide by the unfiltered campaign count, not the empty-list text, which also shows under a status filter.
Points at
The left rail's Assignments item (shared LeftSidebar)
Stands
Right of the rail, level with the item.

Campaigns start from an assignment

Open an assignment, tick the people you want to reach on its People tab, and select Message. Your campaigns then appear here with their progress and replies.

Go to Assignments
First touch

Sequences for these people

Appears
AI Generated Templates has finished generating and shows at least one template.
Points at
The first TemplateCard
Stands
Right of the first card.

Sequences for these people

QLU drafted these for the people you selected. Each sets the rounds, the channels and the days between them. Pick one and select Add; you can change any round on the next screen.

Got it
First touch

Join a running campaign

Appears
Existing Campaigns shows at least one campaign.
Points at
The first campaign card
Stands
Right of the card.

Join a running campaign

Choose a campaign for these people to join. They get its rounds, with messages QLU writes for each of them, which you review before publishing.

Got it
First touch

Your saved templates

Appears
My Saved Templates shows at least one template.
Points at
The first TemplateCard
Stands
Right of the card.

Your saved templates

Templates you saved when publishing. Each keeps its rounds and messages, and QLU rewrites the messages for these people. Rename one with the pencil.

Got it

Step 2 of the first campaign

Rounds

Builder step 1 · /chat-campaign/:listId

The most important screen to teach. Every channel's setup requirement is checked here, one dialog at a time, only after Next. Round 1 defaults to LinkedIn, so most new people meet the extension and sign-in first.

Guided run

Plan your rounds

Appears
The Rounds step of the person's first campaign has loaded, 0.9 s after the page loader goes.
Points at
The round list · anchor or-rounds (RoundList-V2.5)
Stands
Right of Round 1, spotlight.
Note
Today this is only said after launch, in the How Your Campaign Works banner on the campaign page.

Plan your rounds

A campaign is a sequence of rounds. Everyone starts in Round 1, and anyone who hasn't replied moves to the next round after the wait you set. Choose each round's channel and timing here; QLU writes the messages in a later step.

Got it
First touch Docked

Choose a channel

Appears
The channel dropdown is open, the first time.
Points at
[data-test-id="channel-dropdown-cta"]
Stands
Docked in a corner while the dropdown is open, like People Search's "Choose a search mode".
Note
Add one line for what this person is missing, from the same checks Next runs: the extension, the LinkedIn sign-in, a mailbox, a number. On the desktop app there is no extension, so that line changes.

Choose a channel

LinkedIn rounds send from your LinkedIn account through the QLU extension. LinkedIn Recruiter uses your InMail credits. Email rounds send from a mailbox you've connected; add one with Add Email Channel. Call and Text need a QLU number.

Got it
First touch

When Round 1 goes

Appears
Round 1's Time to Send dropdown is opened.
Points at
[data-test-id="schedular-dropdown-cta"]
Stands
Right of the dropdown.

When Round 1 goes

Send Now sends Round 1 from this browser tab as soon as you publish, a few seconds apart, so keep the tab open until it finishes. Pick a later time to start the campaign then.

Got it
First touch

The wait between rounds

Appears
The person adds Round 2 or changes a round's wait.
Points at
[data-test-id="days-inc-dec"]
Stands
Right of the wait controls.

The wait between rounds

This round goes only to people who haven't replied, this long after the previous round. Rounds need at least 24 hours between them.

Got it
First touch

Outside your sending hours

Appears
An On Holiday or Outside Preferred Hours badge appears on a round.
Points at
The badge on that round
Stands
Right of the badge.

Outside your sending hours

This round lands on a holiday or outside the days and hours you prefer to send. Change its time, or keep it and confirm when you select Next. Your hours are in Settings, under Calendar.

Got it
First touch

Reconnect this mailbox

Appears
The "Email not connected" banner appears.
Points at
The banner's Authorize Access button (AuthorizeAccessModal)
Stands
Below the banner.

Reconnect this mailbox

QLU can't send from this mailbox until you sign in to it again. Select Authorize Access; once that's done, the round unlocks and Next works.

Got it
First touch

More rounds

Appears
Hover or press on Add Round.
Points at
[data-test-id="new-round-cta"]
Stands
Right of the button.

More rounds

Add up to 10 rounds. A new round copies the last one's channel and waits a day; change either.

Got it
First touch

Sync with Loxo

Appears
The person turns on a sync row. Rows show only when Loxo, Ezekia or Invenias is connected; the copy names the one touched.
Points at
[data-test-id="loxo-sync-toggle-row"] and its Ezekia and Invenias siblings
Stands
Right of the row.

Sync with Loxo

Turn this on to sync the campaign to a Loxo job after you publish. You pick the job here.

Got it
First touch

Install the QLU extension

Appears
The "QLU Extension Uninstalled" dialog opens. Web only.
Points at
[data-test-id="Qlu_extension_modal"]
Stands
Right of the dialog.
Note
Keep the LinkedIn Action Required dialog as it is: it's a consent step, and Q doesn't stack a card on it.

Install the QLU extension

LinkedIn rounds are sent by the QLU extension in this browser. Install it, sign in to LinkedIn in the same browser, then select Next again.

Got it

Step 3 of the first campaign

Verification

Builder step 2 · only with an email, call or text round

Missing personal emails and phone numbers. Nothing here blocks Next.

Guided run

Missing contact details

Appears
The contacts have loaded and at least one person is missing details.
Points at
The missing-details panel (AddEmailsCard) · anchor or-verify-missing
Stands
Right of the panel, spotlight.

Missing contact details

{N} people have no personal email or phone number yet, and those rounds will skip them. Sync your address book, upload a list with the details filled in, or add them by hand. You can go on without them.

Got it
First touch

Personal or work

Appears
The person changes a Personal/Work choice or opens the select-all control.
Points at
[data-test-id="select-valid-email-cta"]
Stands
Below the control.

Personal or work

Choose which address each person gets. Select all personal emails switches everyone who has one.

Got it

Step 4 of the first campaign

Messages

Builder step 3 · the chat with QLU

The closest match to People Search: QLU writes, Q stays quiet, then Q explains what is finished. Nothing from Q while QLU is answering, writing rounds, generating messages, rewriting rounds, switching the right-hand panel, uploading an attachment or publishing.

Guided run

How should QLU write it?

Appears
Step 3 opens with only QLU's greeting in the chat.
Points at
The chat box · [data-cy="ai-search-l2-conversation-prompt-input"]
Stands
Left of the box, level with its top. Never over it.
Note
Draft one for me types a brief into the box, such as "A short, friendly first message about the {assignment} role", and leaves it there. The person sends.

How should QLU write it?

QLU writes your first message, then every round from it. Tell it what the message is about and the tone you want, or paste a template of your own. How would you like to start?

Draft one for mePaste my template
Guided run

Your sample message

Appears
QLU's answer carries the sample message and has finished streaming: Generate for all Rounds has just become clickable.
Points at
The latest answer, with the ring also on Generate for all Rounds
Stands
Beside the answer. Spotlight, chat held.

Your sample message

QLU will build every round on this message. Ask for changes in the chat, or select Generate for all Rounds when it reads right.

Got it
Moment 1

Every round, for one person

Appears
The sample panel has finished writing every round.
Points at
Round 1 in the sample panel · anchor or-sample-campaign
Stands
Left of the panel, over the chat side.
Show me
Opens Round 1's Modify menu, then closes it without choosing.

Every round, for one person

QLU has written each round for one person from your list. Edit a message directly, or use Modify to make it shorter, simpler or more formal.

▶ Show meNext
Moment 2

Refine through chat

Appears
Next on moment 1.
Points at
The chat box
Stands
Above the box.
Show me
Types "Make Round 2 shorter and more direct" into the box and leaves it.

Refine through chat

Describe a change here and QLU rewrites the rounds it affects. Show me types an example for you to review and send.

▶ Show meBackNext
Moment 3

Write for everyone

Appears
Next on moment 2.
Points at
Generate for all in the sample panel's bar · anchor or-generate-all
Stands
Above the button, never over it.

Write for everyone

When these read well, Generate for all writes every round for each person on your list, in the same style.

BackDone
First touch

Emails in one thread

Appears
The person touches Send email as a reply. It shows only with two or more email rounds from the same mailbox.
Points at
The Send email as a reply toggle
Stands
Below the toggle.

Emails in one thread

With this on, later emails go as replies in the same thread, under the first email's subject.

Got it
Moment 1

Review person by person

Appears
Every person's messages are generated: QLU's "All messages have been generated" line is in the chat.
Points at
The first row's Review Messages · anchor or-recipients
Stands
Left of the list.
Show me
Opens the first person's messages, then returns to the list.

Review person by person

QLU has written every round for each person. Open anyone to read and edit their messages; Next Recipient moves through the list.

▶ Show meNext
Moment 2

One person, or everyone

Appears
Next on moment 1.
Points at
The chat box and the person's name above it
Stands
Above the box.
Show me
Opens the first person so their name appears above the box, then closes them again.

One person, or everyone

With a person open, chat changes only their messages, and their name shows above the box. Close it to change everyone's.

▶ Show meBackNext
Moment 3

Publish

Appears
Next on moment 2.
Points at
[data-test-id="publish_cta"]
Stands
Above the button, never over it.

Publish

Publish starts the campaign. On the way you can save it as a template, to start the next one from it.

BackDone
First touch

Fix these first

Appears
The "Character limit exceeded" or "Empty message found" summary appears.
Points at
The summary in the list's header
Stands
Below the summary.

Fix these first

Some messages are too long for their channel, or empty. Select Publish to jump to the first one, then fix it there.

Got it
First touch

Save as a template

Appears
The Save as Template? dialog opens.
Points at
The dialog (ConfirmFormSubmitModalV2)
Stands
Right of the dialog.

Save as a template

Save this campaign's rounds and messages to start the next one from Saved Templates. Skip for Now publishes without saving.

Got it

Step 5 of the first campaign

Live

Builder step 4

The guided run ends here: the first message has gone to a shortlist.

Guided run

Your campaign is live

Appears
Step 4 opens after Publish. Ends the guided run (outcome: campaign published).
Points at
The live card, with the ring on Continue to Campaign · [data-test-id="continue_to_campaign"]
Stands
Right of the card, spotlight.
Note
When Round 1 is scheduled: "Round 1 goes at the time you set. Later rounds go only to people who haven't replied. Select Continue to Campaign to follow it."

Your campaign is live

Round 1 is sending from this tab, a few seconds apart, so keep it open until every message shows as sent. Later rounds go only to people who haven't replied. Select Continue to Campaign to follow it.

Got it

Step 6 of the first campaign

Campaign page

/v2/campaigns/:id

The results page of Outreach. Three moments on the first visit, then one-time tips. There is no approval step: after launch everything sends on schedule, except Call rounds.

Moment 1

Your rounds

Appears
The first visit to a campaign page, 0.9 s after it loads.
Points at
The first round card · [data-test-id="round_Container"]
Stands
Right of the card.
Show me
Expands Round 1, then collapses it.
Note
Replaces the How Your Campaign Works banner (localStorage hideCampaignInfo).

Your rounds

Each card is a round, holding the people currently in it. Open one to see who's there and when their message goes. Later rounds open up as people move on.

▶ Show meNext
Moment 2

Each person's messages

Appears
Next on moment 1.
Points at
The first person's View All Messages · [data-test-id="rec_Container"]
Stands
Right of the person's card.
Show me
Opens the first person's messages, then closes them.

Each person's messages

View All Messages shows every round for this person. Edit an unsent message for them or for everyone, or pause just them.

▶ Show meBackNext
Moment 3

Replies

Appears
Next on moment 2.
Points at
Campaign Finished - Got Responses! · anchor or-got-responses
Stands
Above the card.

Replies

People who reply leave the rounds and move here, tagged Interested, Not interested, Out of office and so on. Reply to them from the Inbox.

BackDone
First touch

A call is due

Appears
A Call round has people in it. Campaigns that start with a call land here straight after Publish.
Points at
Initiate Call · anchor or-initiate-call
Stands
Below the button, spotlight.

A call is due

Call rounds wait for you. Select the people to call, then Initiate Call to ring them from the Dialer.

Got it
First touch

This one needs you

Appears
The first person card showing an error is on screen.
Points at
That card's warning
Stands
Right of the card.

This one needs you

QLU couldn't send this message. Hover the warning to fix it: add the missing email or number, or skip the round.

Got it
First touch

Email rounds on hold

Appears
The Campaign Paused banner appears.
Points at
The banner's Authorise Access button
Stands
Below the banner.

Email rounds on hold

A mailbox this campaign sends from has lost access, so its email rounds are waiting. Select Authorise Access to sign in again.

Got it
First touch

Who the change is for

Appears
The person selects Edit on an unsent message.
Points at
The edit scope choice (RoundContent)
Stands
Right of the dialog.

Who the change is for

Change just this person's message, or everyone's. For everyone, QLU adjusts each person's version; Preview Recipients shows them before you save.

Got it
First touch

Pause

Appears
Hover on the campaign's Pause button.
Points at
[data-test-id="Stop_campaign"]
Stands
Below the button.

Pause

Pause stops every round until you resume. To pause one person, use Pause on their card.

Got it

After the first campaign

Inbox

/inbox

First-touch tips only. A person can reply only once the prospect has replied.

First touch

Your replies

Appears
The first visit to the Inbox with at least one campaign.
Points at
The Inbox and Sent tabs · anchor or-inbox-tabs
Stands
Right of the tabs.

Your replies

Pick a campaign, then a person. Inbox lists the people who replied; Sent lists everyone else you've messaged.

Got it
First touch

Reply once they answer

Appears
The person opens someone who hasn't replied.
Points at
The locked reply box · anchor or-inbox-reply
Stands
Above the box.

Reply once they answer

You can reply here once they respond. Until then, the campaign's rounds carry on.

Got it
First touch

Reply channel

Appears
The channel picker is opened.
Points at
The channel picker
Stands
Above the picker.

Reply channel

Your reply goes on the channel they replied on. Pick another here, such as email instead of LinkedIn.

Got it
First touch

Check for new replies

Appears
Hover on the refresh button.
Points at
The refresh button in the profile header
Stands
Below the button.

Check for new replies

Fetches this conversation's latest replies. LinkedIn can be checked once every 5 minutes.

Got it
First touch

Reply tags

Appears
The filter is opened.
Points at
The filter
Stands
Right of the filter.

Reply tags

QLU tags each reply as Interested, Not interested, Out of office and so on. Filter to see one kind.

Got it

After the first campaign

Home and Calendar

/ and /calendar-view

First-touch tips only.

First touch

Across your campaigns

Appears
Hover on the stat tiles.
Points at
The stat row on Campaign View
Stands
Below the row.

Across your campaigns

Your average response rate, and how many messages and links people have opened, across all your campaigns. Live Activity shows the latest message sent.

Got it
First touch

What's going out

Appears
The first visit to Calendar View.
Points at
The calendar grid
Stands
Above the grid.
Note
The channel filters are icons without labels. They need plain labels whether or not Q is there.

What's going out

Each row is a campaign, and each cell counts the messages it sends that day, by channel. The icons above filter by channel.

Got it

What building it takes

Everything Q-specific stays in two places, as in People Search. Product files only gain data-q-anchor attributes and two small hooks.

  1. Move QGuide/ into src/shared (qlu-global-components), so every app uses one Q. Only track.ts (QLU's Mixpanel) and modes.ts (People Search's mode type) are tied to QLU; the rest needs React, createPortal, clsx, LogRocket and SCSS modules.
  2. An Outreach guide in src/onboarding/: copy.ts for every word, QOutreachGuide.tsx with the tips list (on, target, prefer, spotlight, journey, holdScroll), and useScreen.ts, one 300 ms poll over the anchors. Mounted once in DefaultLayout beside GlobalModals.
  3. A busy flag on the chat. data-q-busy on the conversation is true while any query isStreaming (Conversation.tsx:152), while useIsAnyMessageGenerating sees work, while rounds are being rewritten, while an attachment uploads and while isPublishPending. data-q-view carries which panel is open. The chat's auto-scroll respects useQScrollHold.
  4. Where progress lives. qlu-q-guide is localStorage, and Outreach runs on its own site, so its lessons are separate from People Search. The Learn page can't show Outreach progress without a server-side store: the unused user.isOnboarded, the existing /userEvents/onboard, or a new endpoint. Someone is new when they have no campaigns.
  5. Placement. The builder's bottom bar is fixed (Next, Generate for all Rounds, Generate for all, Publish) and the chat box is sticky: add both to Q's keep-clear list. The chat step splits the screen in half, so expect the overlap People Search has in Research Mode, and dock or narrow those cards. The desktop app needs no extension: branch the setup copy on isQluWorldClient().
  6. Older guidance to fold in: the How Your Campaign Works banner (hideCampaignInfo), the Plus tips in the shared left rail (usePlusOnboarding) and QLU's message-onboarding-completed hint. They yield while Q is guiding, as People Search's older tours do.
New anchorOnFile
or-roundsThe round listCampaign-V2.5/RoundList-V2.5/index.tsx
or-nextRounds' Next (the test id next-button-cta is also on step 2)Campaign-V2.5/CampaignForm/DefineRounds/index.tsx
or-verify-missingThe missing-details panel…/VerifyEmails/Cards/AddEmailsCard/index.tsx
or-conversationThe chat, with data-q-busy and data-q-viewCampaign-V2.5/Conversation/Conversation.tsx
or-sample-campaignThe sample panelCampaign-V2.5/SampleCampaign-V2.5/sampleCampaign.tsx
or-generate-allBoth Generate buttons (the test id generateAll_cta is on both)Conversation.tsx, sampleCampaign.tsx
or-recipientsThe generated-messages list…/GenerateMessages-V2.5/ProfileCabinet/profileCabinet.tsx
or-liveThe live cardCampaign-V2.5/CampaignForm/SendMessages/sendMessages.tsx
or-got-responsesCampaign Finished - Got Responses!RoundCompleteCard-V2/index.tsx
or-initiate-callInitiate CallRoundDetailCard-V2/roundDetailHeader.tsx
or-inbox-tabsInbox and SentInbox/Recipient/Tabs/Tabs.tsx
or-inbox-replyThe reply boxInbox/Chat/MessageInput/index.tsx

Existing test ids used as they are: channel-dropdown-cta, schedular-dropdown-cta, days-inc-dec, new-round-cta, select-valid-email-cta, publish_cta, continue_to_campaign, round_Container, rec_Container, Stop_campaign, Qlu_extension_modal, loxo-sync-toggle-row, and the chat box's data-cy.

Fix before Q points at these