All articles
Playbook7 min read

How We Ship Code and Run Product Experiments From Slack

Our product team ships code and runs experiments without leaving Slack. Mio reads the repo, opens and merges the pull request through GitHub, ships the change to production, and reads the result back through PostHog. An idea goes from a sentence in a thread to something live and measured in one loop.

Arthaud Mesnard

TL;DR

  • We run the full loop in Slack: Mio reads the repo, opens and merges the pull request through GitHub, ships to production, and reads the result back through PostHog.
  • The loop actually closes: with PostHog and Langfuse connected, Mio reads the result and proactively proposes the next change to try, for us to approve.
  • This is not a replacement for review and judgment. Sensitive steps wait for a human, and the change is small and reversible by design.
  • You teach the workflow once, then it runs like a coworker you can hand an experiment to, not a tool you operate step by step.

The gap that kills most small product bets is not the coding. It is the distance between "we should try this" and actually seeing it in front of users. That distance is usually a ticket, a queue, a handoff, and a wait. We closed it by moving the loop into the channel where the conversation already happens.

The problem: the gap between "let's try it" and "it's live"

Every product team has the same conversation. Someone says, "We should try changing the empty state," or "What if the CTA said this instead?" It is a good idea and it is small. Then it goes to die in the gap.

The gap is procedural, not technical. The idea becomes a ticket. The ticket waits behind other tickets. When it finally gets picked up, someone context-switches into it, writes the change, opens a PR, waits for review, merges, waits for the deploy, then remembers a week later to go check whether it did anything. By the time there is a result, the thread where the idea started is long buried.

The cost is not the ten lines of code. It is that the friction is high enough that most small bets never get made. Teams stop proposing the two-hour experiment because the surrounding process costs two days. The good, cheap ideas get filtered out not because they are bad but because the loop around them is expensive.

What closing the loop actually requires

To take an idea from a Slack thread to a measured result without the gap, the loop needs four things:

  • Read the actual code. The change has to be grounded in the real repo, not a guess about how the code is structured. That means reading the relevant files before proposing a diff.
  • Go through real version control. Opening and merging a pull request through GitHub keeps the change reviewable, attributable, and revertible. You do not want to skip source control to move fast; you want source control to move fast.
  • Reach production. An idea is not tested until users see it. The change has to actually ship, not sit in a merged-but-undeployed limbo.
  • Read the result back. "Live" is not the finish line. You need to see what happened in your analytics to know whether the bet paid off. That closes the loop instead of leaving it open.

Each of these already exists as a tool. The loop is slow because a person carries the work between them, and that person has other work.

How we run it in Slack

We made an AI coworker carry the loop. Mio lives in Slack, connects to our repo, GitHub, PostHog, and Langfuse, and runs the change end to end. You describe the experiment in a thread and Mio takes it from there.

Read the repo and propose the change

Mio reads the actual code before it writes anything, so the diff is grounded in how the repo is really structured.

@Mio read the onboarding component in our repo and draft the change to show a sample project in the empty state instead of the blank screen. Show me the diff before opening a PR.

Open and merge the pull request through GitHub

Mio opens the pull request through GitHub. It stays a real PR with a real diff, reviewable and revertible, and merges once it has the go-ahead.

@Mio open a PR with that change, link it here, and merge it once I approve

Ship it to production

Mio ships the merged change to production, so the experiment is actually in front of users rather than stuck in a deploy queue.

@Mio ship the merged change to production and post here when it's live

Read the result back through PostHog

Then Mio closes the loop. It reads the result back through PostHog, so the same thread that started with an idea ends with what the idea did.

@Mio in three days, pull the activation rate for new signups from PostHog before and after this change and post the comparison in this thread

Propose the next change from what it saw

This is what actually closes the loop. With PostHog and Langfuse connected, Mio does not just report the result and stop. It reads what the change did and proactively proposes the next one: where activation is still dropping off, which step in a traced flow is failing, what is worth trying next. The proposals are suggestions, not silent commits. We still approve before anything moves.

@Mio based on the PostHog funnel and the Langfuse traces since this shipped, propose the next change worth trying and draft the PR, but wait for my go-ahead before opening it

The whole loop lives in one thread. The idea, the diff, the PR, the deploy, the result, and the proposal for what to try next are all in the same place, in front of the people who had the conversation. The result of one experiment becomes the starting point for the next.

What changes when the loop is one thread

The obvious change is speed: an experiment that used to span a ticket and a week now happens in a loop you can watch.

The change that matters more is which ideas get made at all. When the loop is cheap, the two-hour bet is worth making, so more of them happen. The team stops pre-filtering out small experiments because the process around them no longer costs more than the experiment. You end up running the long tail of cheap, reversible bets that a heavier process quietly kills, and that is where a lot of product learning actually lives.

None of this removes judgment. The change is small and reversible by design, the PR is real and reviewable, and the sensitive steps wait for a human to approve. The coworker carries the mechanical loop. The team still decides what is worth trying and what the result means.

The real shift: you teach the workflow once

Here is the part that makes this more than a faster deploy button. You teach Mio the workflow one time, read the repo, open the PR, ship, measure, and after that it runs almost on autopilot. It is a coworker working in the background you can hand an experiment to, not a pipeline you operate step by step.

That is the shift worth naming. A background agent that reads your code, ships a change, and reads the analytics back used to be something only a well-staffed team with its own tooling could build. Teaching a workflow once in Slack and having it run puts that same loop in the hands of a small product team. The edge stops being who can afford to build the machinery and starts being who has the best ideas and the clearest read on the results.

If you already ship software, you have all the pieces: a repo, GitHub, a way to deploy, and product analytics. The change is connecting the loop and running it where the conversation already happens.

For more on running product work this way, see the best Slack AI agents and how to automate your weekly product update with Mio and Linear.

Try Mio free at app.mio.xyz.

FAQ

Mio is the Slack-native AI coworker that already knows your company, connects to 3,000+ tools, and turns shared context into work. Just @mio, it's handled.