BambooHR and Slack: finding the onboarding steps that stalled
A new engineer's first day was three weeks ago. The People Ops coordinator, Dana, has BambooHR open on one screen. The onboarding checklist for that hire shows eleven tasks. Nine are ticked. Two are not: "Laptop issued" and "Payroll bank details confirmed." Both are assigned to owners outside her team. Both are past their due date by twelve and nine days respectively.
On her other screen is Slack. In #it-helpdesk, on day two, the IT lead wrote: "Dock is out of stock, ordering a replacement, laptop ships when it lands." In a DM eleven days ago, the hire wrote: "I don't think my bank details went through, the form errored out." Nobody replied to that DM. In #people-ops, the finance manager wrote on day four: "Holding payroll setup for the two new starters until we get the cost centre confirmed."
Dana's question is not "which tasks are open." BambooHR answers that in one click. Her question is the one her VP asked in standup: which onboarding steps stalled without anyone noticing. An open task with an active thread underneath it is fine. Somebody is on it. An open task with silence underneath it, or with a blocker that was mentioned once and then dropped, is the one that will still be open next month. Those two look identical in BambooHR. They look identical in Slack too, because Slack has no idea what an onboarding task is.
What BambooHR shows on its own
BambooHR is genuinely good at the record side of this. Onboarding checklists are structured objects: a task has a name, an assignee, a due date, a completion state, a completion timestamp, and a template it came from. You can filter to incomplete tasks. You can filter to overdue tasks. You can group by assignee and see that IT owns four of the seven items sitting past due across all current hires. Reports and the API expose all of it, so a weekly overdue-tasks export is straightforward.
Where it stops is precise, and it is not a shortcoming. BambooHR knows the state of a task and it knows nothing about the reason for that state. There is no field for "waiting on a supplier," because nobody typed that into BambooHR. The IT lead typed it into Slack, in a sentence, to a person, at 4pm on a Tuesday. The system holds a checkbox that says false. It cannot distinguish false-because-blocked from false-because-forgotten, because from inside BambooHR those are the same value.
The task's own comment thread is worth mentioning fairly: BambooHR does have comments, and a diligent team could put the blocker there. In practice the conversation happens where the people already are, and that is Slack. The record is complete and the reason is elsewhere.
What Slack shows on its own
Slack has the other half. The dock shortage, the errored bank form, the cost centre hold: all three explanations exist, in full sentences, with authors and timestamps. Slack search will find them. Searching dock in #it-helpdesk returns the message. Searching the hire's name returns a scatter of mentions across four channels.
Where Slack stops is that it has no concept of the checklist. It does not know there is a task called "Laptop issued," does not know who owns it, does not know it is twelve days overdue, and cannot tell you that the dock message is about that task rather than about a different laptop for a different person. Slack search is keyword-shaped, so it finds messages containing "dock" but not the DM that says "the form errored out" without naming payroll, bank, or the hire's team.
The harder limit is the negative case. Dana's actual question includes "without anyone noticing," and the strongest evidence of nobody noticing is the absence of messages. Slack cannot return an absence. You cannot search for the thing that was never posted. You can only notice it by holding a list of tasks in one hand and checking each one against the conversation, which is the manual work she is doing now.
Why the gap exists structurally
Line them up and the shape is clear.
| BambooHR | Slack | |
|---|---|---|
| Onboarding task exists | Yes, as a record | No concept of it |
| Owner and due date | Yes, structured fields | Only if someone typed a name |
| Completion state | Yes, boolean plus timestamp | No |
| Why it is stuck | No field for it | Yes, in prose |
| Nothing has been said in 11 days | Not visible | Not queryable as an absence |
Half of the evidence is a record: rows, fields, states, dates. Half of it is a sentence somebody wrote to a colleague, unstructured, no schema, meaning carried by phrasing rather than by a field.
This is why the gap is not a reporting feature either product is missing. A better BambooHR report still reports over BambooHR's fields, and the reason has no field. A better Slack search still searches messages, and there is no message that says "task 4 of 11 is overdue."
It is worth being fair about the adjacent tools too, because people reach for them here. Workflow automation platforms like Zapier and Make handle this pairing well in the direction they are built for: a BambooHR event fires, a Slack message goes out, a record moves forward. They are trigger based, and that is the point of them. But a trigger fires at a moment and moves something along; it cannot be asked, three weeks later, what already happened and why. And BI tools such as Power BI Copilot or Looker Conversational Analytics genuinely do natural language over data, competently, but they connect to databases and modelled sources. A DM saying "the form errored out" is not in a model and was never going to be. It is outside the set of things those tools can see at all, no matter how good the question.
What the join actually requires
Two things, and only one of them is mechanical.
The key. The thing that ties a BambooHR task to a Slack conversation is the person, plus a window of time. The task carries an employee name, an employee ID, and usually a work email. Slack carries display names, real names, and profile emails. Email is the reliable join; display names drift and get shortened. So: for each incomplete onboarding task belonging to hire X, gather Slack messages from the hire's start date onward that mention X by name, by @-handle, or by user ID, in the channels where onboarding actually happens, plus the DMs the requester can see. That part is matching, and it is unambiguous.
The judgement. Once you have the messages, someone has to read them and decide which of three things a task is:
- Moving. Somebody spoke about it recently and named a next step. "Laptop ships when the dock lands" is a blocker, but a live one with an owner.
- Stalled quietly. The last message about it is old, or there was never a message at all. The bank details DM sits here: eleven days, no reply, and the person who could act on it never saw it.
- Done in reality but not in the record. Someone posted "laptop handed over this morning" and never ticked the box.
No rule matches those apart. "Last message older than seven days" flags the dock thread, which is fine. Keyword matching for "blocked" misses "holding payroll setup until we get the cost centre confirmed," which never uses the word. The classification depends on reading what the sentence means, which is exactly the operation that neither a filter nor a trigger performs.
How you would answer it with Skopx
Skopx connects to both sides, BambooHR and Slack among nearly 1,000 integrations, so the question gets asked once rather than assembled by hand. Dana types something like this in chat:
For everyone who started in the last 60 days, list every incomplete BambooHR onboarding task, and for each one show the most recent Slack message that refers to it or to that hire's setup, with the date and who wrote it. Flag the tasks where nothing has been said in over a week, and the ones where someone said it was done but the task is still open.
The answer comes back as a list with citations: the task from BambooHR, the message from Slack, links to both so she can open the thread and read the full context rather than trusting a summary. The bank details DM surfaces with eleven days of silence against it. The dock thread surfaces with a recent date and gets read as live. Anything a hand-built export would have missed because it never said "blocked" gets caught, because the classification came from reading the sentence.
Once that question is worth asking every week, it becomes a console instead of a chat message. Skopx's Internal Apps turns the same sentence into a standing view: current hires down the left, incomplete tasks grouped underneath, each row carrying its last-heard-from date and the sentence that explains it. Dana opens it on Monday morning. Rows with recent chatter sit quiet. Rows with two weeks of silence sit at the top. Next to each stalled row, a button she can click that posts a nudge into the right Slack thread, with a confirmation step before it sends, so nothing goes out by accident.
Honest limits
The console reads and, when a person clicks, acts. It does not store anything of its own. There is no form to fill in, no new record created anywhere, no scheduled run at 8am, no alert that pings you when something stalls, no public link to send to someone outside. If nobody opens it, nothing happens. The single write is the nudge button, and only after a human confirms it.
It sees what the person opening it is permitted to see. Private channels the requester is not in, and DMs between two other people, stay invisible. The bank details DM in the story is visible because it was sent to Dana. If it had gone to someone else privately, it would be outside the join, and the honest answer for that task would be "nothing found," not "nothing happened."
The judgement call is a judgement call. A task flagged as stalled might have been resolved in a hallway conversation. A thread that looks live might be three people agreeing to do nothing. That is why the answer carries citations: the point is to put the right eight rows in front of Dana in the morning rather than the right zero, and let her read the threads herself.
And it does not fix the process. If onboarding tasks are habitually completed in reality and never ticked in BambooHR, this will show you that clearly, week after week, until somebody decides to do something about it. That decision is not a query.
Skopx Team
The Skopx engineering and product team