The holy grail for translations: single item flow

Since achieving single item flow for our development process, we’ve been working towards achieving the same for our translation process. Searching for the holy grail you might say. Impossible … or not?

Knowly and the holy grail
Posted on
Reading time 8 minutes

New features have been deployed, profit! But wait, they’re not yet available to all clients, because they’re waiting for translation. That’s not ideal. What do we do about it? Since we reached single item flow for our development process, we’ve been working hard to achieve the same for our translation process, with our team of freelance translators. A task that at first seemed impossible. Challenge accepted!

The challenge

We practice the Improvement Kata, which is a great way to work towards achieving big (seemingly impossible) goals in an incremental and experimental way, so the task becomes less Herculean.

Here’s how we defined our challenge for translations for new features:

  • Get to single item flow.
  • Translated within a day.
  • No time spent on answering questions from the translation team.
  • No more than five minutes spent preparing the single item package.

We wanted a lot! Where to begin? We broke things down, and started by establishing two target conditions, the first leg of our marathon if you like:

  1. Define and measure the time it takes to translate a single item to all languages.
  2. Get all labels for new features translated within three days (on demand).

Now, that was something workable 😊.

Defining a single item

On the development side

A single item is a feature that gets developed and deployed. We wanted to deliver translations for each feature to the translation team as they were available. We needed a way to package this information for delivery.

We wanted to deliver translations for each feature to the translation team as they were available

We use Jira to manage our development flow, and the requirements for each feature are written up in what we call a story in Jira. We started by adding a new field to each story, where developers could add details of new labels or pages they created for the new feature. We also linked new labels to their story in our database, so we could easily check which labels belong to which story.

A new status was then added to the development flow once a story was online: processing translations. Moving a story through this status would trigger a message that contained the content of the field to be sent to the translation team. We used a webhook for this. Webhooks are a way for apps to communicate with each other when a specified event happens. This was our first iteration.

We quickly noticed that both the new field and status were easily forgotten or skipped, so we made it a pop-up window that couldn’t be ignored, that appeared earlier in the process when a story was transitioned from being tested to being deployed.

Some (healthy 😉) discussions followed about what was sufficient information to provide to the translators. They needed to have context for what they were translating, and understand how a new feature behaves. We concluded that annotated screenshots, along with a short description were ideal. Sending a lot of words with technical jargon, less so.

We realized we already write a short description of each story for internal release notes, so pulling this to the notification automatically saved a step for the developers. Images weren’t included in the webhook initially, we had to add those manually, and it was a hassle. So we spent some time getting that working too.

All these small steps were starting to add up to something really useful!

On the translation side

Once we had a single item package ready, we needed to decide where to send it. Upwork was our primary way of communicating with the translators, on an individual level. We support 24 languages, so it was important to make the setup manageable. Since we use Slack internally anyway, we invited the whole freelance team to join a dedicated translation Slack space. Every single one of them accepted. This was a game-changer!

It was important to make the setup manageable

Having all 24 team members set up together in one space, in a community, was so much easier to manage. We created a dedicated group channel in Slack for sending the webhooks with new translations to, and language channels for individual contact.

An example of one of our automated Slack messages

The next job was to communicate our challenge and expectations with the translators: react to the webhooks as they arrive, ideally within 24 hours. We were curious how this would be received, but the team adapted quickly. Slack is ideal for instant messages, a quick thumbs-up, or a check mark. We followed up by drafting a small translation manual to explain how we'd like things to work, and why, and addressed some common questions. We pinned this to the Slack space for the team to reference whenever needed.

Since we built and manage our own translation tool, another change we made for the translators was to add a new filter for them, so they could easily find labels for each story. Then we took that a step further and added a link to their webhook that would take them directly to that filtered selection.

Measure the timings

With a system in place, we needed to be able to measure progress. We wanted to know how quickly translations were turned around. We didn’t want to be doing this manually for each language for every story deployed, life's too short! So we built a way to get a report from the database on the translation timings per language, per story. It’s now possible with just a few clicks … without needing a developer! It gave us some numbers to crunch and some food for thought.

Reduce the turnaround time

Ok, everything’s in place, but the turnaround isn’t what we’d hoped. We did ask a lot in reducing a two-week turnaround time to three days (striving for one day). We wanted to know what was holding the freelance team back from acting on the webhooks as they came in. There was only one way to find out, and that was to ask. So we did, and the responses were surprising.

Some translators tended to batch the items, rather than work through them one at a time, because of issues with the Upwork time tracker, and concerns about overcharging us. Encouraging manual time logging was the solution here. We trust the team and want to compensate fairly for the time they spend on our project. Some simply needed time to adjust to the new way of working.

We had recurring complaints about issues with the Slack notifications, or pings. Not all team members use Slack regularly. After experimentation with various Slack features such as keywords, mentions, tags, and email notifications we managed to resolve the problem. We added a channel mention and keywords to our webhook, which triggered both pings and emails depending on the preferences of the individual translator. Meaning none of them would miss updates in the future!

Requests for changes to our translation tool to make life easier also came in. They asked, and we listened! We improved the way labels are saved, so it’s quicker to work through a list. Then we improved the filter for searching for existing similar labels, to help keep consistency. We also added a keep alive script, so active sessions in the translation tool don't expire after 24 minutes like they used to.

The life of a freelancer can be a lonely one

The life of a freelancer can be a lonely one, and we like to let the team know they’re appreciated, since they’re invaluable to us and integral to our plans. Owlsome Knowly T-shirts might have helped with that, along with a bit of Slack community spirit 😉.


Did we meet our challenge? Not yet. But that’s ok. We’ve made huge strides in the right direction, that we couldn’t have imagined a year ago. We learned a lot on the way too. Our translators are an invaluable source of information and feedback, for us, and each other. We have a single item flow with a process in place for translations. The team gets proper context, resulting in faster and better translations for our clients. We call that a win!

The team gets proper context, resulting in faster and better translations for our clients

The turnaround is not as fast as we defined in our challenge yet, but we’re getting close. The majority of our languages have translations ready within three days. At the last count, we had translations for 17 out of 24 languages within three days, four followed shortly after, with just three outstanding for longer than 10 days.

What’s next? Well, we’ll keep you posted. The marathon is not complete 🏃‍♂️. We’re already working on the next challenge 😉.

Get started today!

Join almost 1 million participants and try out our awesome tool.

Start your free trial today