TR Start free
HomeBlog › Guide

Customer complaint tracking software: how to stop losing requests, and what an SLA actually does

O Ohana360 Team • September 7, 2026 • 13 min read
Illustration of a support queue screen showing ticket priorities and SLA time-remaining bars

Most small businesses do not go looking for customer complaint tracking software. They discover the need like this: a customer calls, says "I wrote to you about this last week", and nobody can find the message. Then a second customer says the same sentence. By the third one the question has changed: "How many requests do we get in a week, and how many do we close on time?" There is no answer, because there is nothing countable to answer with.

This guide is written for a team handling somewhere between 5 and 50 support requests a day: a field service company, an online store's operations desk, a software team, an agency, a dealer network. What they share is the shape of the problem. Requests arrive through chat apps, phone calls, email and a web form at the same time, each one lands somewhere different, and nobody can see the whole picture of which ones have been answered. Our running example is Northfield Climate Services: an eleven-person team installing and maintaining air conditioning systems, mostly for business customers. (Demo data.)

The life of a ticket, and its five leaks

Between a problem reaching you and a customer saying "yes, that is sorted", there are six links. Tickets do not get lost inside those links; they get lost in the gaps between them. The diagram below shows one month at Northfield.

Channel where from Ticket no record opened Owner who has it SLA timer clock running Resolution note written Notify customer knows THE FIVE LEAKS IN THE LOOP (DEMO DATA, ONE MONTH) 1 The WhatsApp message never became a ticket It stayed inside one phone: no number, no owner, and no clock running on it 9 requests 2 A ticket opened with nobody on it The record everyone can see and nobody owns is always the one that waits longest 4 tickets 3 Priority depends on who is typing When the same fault is critical on Monday and medium on Tuesday, the urgent one sinks 11 tickets 4 Fixed, but the customer was never told The work finished in silence, so the customer opens the same thing again the next day 6 repeats 5 Nobody knows how many came in this month Support load that is never counted cannot be planned, staffed or priced no record

What the five have in common is that none of them is a mistake. Nobody did anything wrong; a step simply never got recorded. One at a time.

The long version of running messenger traffic without losing it is in the WhatsApp customer management guide. The difference here is that the problem at the end of that traffic needs to live as its own record.

What to record at every link

You do not close these leaks with more effort. You close them by deciding in advance what gets recorded at each step. The table below is the trail a problem should leave on its way from first message to closure.

LinkRecordFields that must be filledWho, and when
1. ChannelThe ticket is openedChannel (phone, email, web, chat), account, contactWhoever sees the message first, that day
2. Ticket noNumber and subjectNumber (automatic), a one-sentence subject, descriptionAutomatic plus the person logging it
3. OwnerAn owner or a queueThe responsible person; if unclear, the right queueAn assignment rule, on creation
4. SLA timerThe priority fieldPriority; the target hours follow from itThe person logging it, against the definition
5. ResolutionThe resolution noteWhat was done, which part, which setting, by whomWhoever fixed it, at closing
6. NotificationEmail or messageWhat the customer was told, and whenThe owner, at resolution

Row five is the one everyone skips. The resolution note is not written for today, it is written for three months from now: when the same customer calls about the same unit, being able to read what was done last time is the single thing that makes a second visit unnecessary. It does not need to be longer than two sentences, but "sorted it" is not enough either.

💡 Write the subject as the problem, not as the customer's words. "Urgent help please" is not a subject. "Compressor not engaging on the server room unit" is searchable, and the knowledge base suggestions read that sentence too.

What an SLA is, and how to read the timer

An SLA, a service level agreement, is the written version of how fast you will get back to someone. In enterprise contracts it is a legal clause. In a small team it does something far more practical: it decides what to work on next without anyone having to ask. If you have five open tickets and the team is discussing which one comes first, that team does not have an SLA.

SLA targets: hours per priority Demo data • App Settings > SLA Targets Critical work stopped for everyone 4 hours High degraded, but still running 8 hours Medium annoying, not urgent 24 hours Low questions, requests, ideas 48 hours The timer starts when the ticket opens and turns amber in the last 25%. Change the priority and the remaining time is recalculated at once. THREE STATES On track 3h 12m left Warning (last 25%) 0h 48m left Breached time is up OPEN RIGHT NOW #00001042 BREACH Brightline Retail 3 hours over #00001047 0h 40m Kestrel Logistics warning band #00001051 19h 05m Aldergate Schools on track HOW TO READ IT Breaches first, warning band second Timer ignores office hours: plan for it Priority is a written definition, not a negotiation

Sizing the target by priority rather than by customer is the only workable approach for a small team. Four priorities and four numbers are enough. Pick numbers your team can genuinely hit: an SLA you miss every week is worse than none at all, because it turns into a promise made to a customer and then broken.

PriorityDefinition (write it down)ExampleTargetWho takes it
CriticalWork has stopped, revenue is being lost right nowCold storage unit is down4 hoursOn-call engineer, immediately
HighDegraded but running, a workaround existsOne of two units is out8 hoursAccount owner, same day
MediumAnnoying, not urgent, can be scheduledFaulty remote control24 hoursQueue, next available person
LowA question, an information request, an ideaQuery about contract scope48 hoursQueue, in order

The timer has three states and all three are visible at a glance on the list: on track (time remaining, green), warning (into the last quarter of the window, amber) and breached (time is up, red). It starts the moment the ticket is opened and recalculates instantly if the priority changes. One honest caveat: the timer does not know about office hours or public holidays, it counts wall-clock time. A 24-hour ticket opened at 17:00 on Friday arrives on Monday already breached. The fix is to set targets that acknowledge this: on a team working weekdays 09:00 to 18:00, "24 hours" really means "next business day", and 48 is the more honest number to promise.

Queues, assignment and statuses

The answer to unowned tickets is not making everyone watch every ticket. It is a queue: a shared pool that can own records, where members see and edit the queue's records as if they were their own. If a ticket cannot go to a person, it goes to a queue, and it never sits in the middle of nowhere. Three queues usually cover a small service business: Field Team, Technical Support, and Billing and Contracts.

Assignment rules automate the queue. You write conditions, and the first matching active rule sets the owner. A starting set might look like this:

The status list matters just as much as the owner, because the honesty of your overdue report depends on it. Six statuses cover a service team:

StatusWhat it meansWhose move
NewLogged, nobody has looked at it yetYours
In ProgressAn owner picked it up, work has startedYours
Waiting on CustomerWaiting for information, approval or accessTheirs
EscalatedBeyond the first responder, moved up a levelYours, different person
ResolvedWork done, note written, customer informedTheirs (confirmation)
ClosedConfirmed, or the window expiredNobody's

The most valuable of the six is Waiting on Customer. Without it, tickets where the customer owes you an answer look exactly like tickets you are sitting on, and your overdue count stops telling the truth.

💡 Do not leave the gap between Resolved and Closed empty. When you move a ticket to Resolved, send the customer one sentence, and only close it once they confirm or after a set window such as three working days. That gap is the single biggest reason complaints get raised twice.

The first 7 days: a setup plan

The most common way this migration fails is trying to move every historical conversation across. Do not. One hour a day for seven days is enough, and on day eight every new request comes out of the system.

DayWhat to doWhat you have at the end of it
1Rewrite the channel list to match reality (add WhatsApp and Portal) and simplify the ticket typesA record that tells you where a request came from, in one field
2Write the four priority definitions down and enter the SLA targets in hoursAn urgency order that does not change with who is typing
3Create the queues, add members, and write two or three assignment rulesTickets that never end up unowned
4Embed the web form on your site and file a test ticket through itYour "contact us" traffic arriving as numbered records
5Write and publish knowledge base articles for your five most frequent questionsA team that never writes the same answer twice
6Switch on two ready-made flows: a call task on critical tickets, a nudge on anything open three daysYour first two alerts running by themselves
7Build the reports and run a 30-minute rehearsal: turn a chat message into a ticket in sixty secondsA working loop and a team that knows it

Day eight has one rule: no parallel running. Keeping two systems in week one teaches people the new one. Keeping them in week two ruins both, because nobody writes the same thing down twice and once they stop, neither list can be trusted.

How the flow works in Ohana360

Service360 owns this entire loop. Here is what it does, without inflation, and what it does not do, without hiding it.

Want to see the loop in 94 seconds?

Which alerts to put on rails

The flow engine ships with three case templates, and all three are worth switching on in week one:

You build the remaining alerts yourself on the same screen. Date conditions in scheduled flows offer three options: "in the past", "within the next X days" and "older than X days". Escalation tiers are built the same way, for example a manager notification on "status is New and created more than 2 days ago". The general logic of making follow-up the system's job is covered in the automated customer follow-up guide.

Which reports to build

Two case reports come ready in the report list: Cases by status and Cases by priority. You build the rest in the report builder, drop them on a dashboard and add an email subscription if you want one. The reportable fields on the case object are: Subject, Status, Priority, Channel, Ticket No and Created date. Date fields group by day, week, calendar month, quarter and year.

#ReportObjectGroup byMeasure / filter
1Cases by statusCasesStatusRecord count (ready-made)
2Cases by priorityCasesPriorityRecord count (ready-made, donut)
3Incoming cases by monthCasesCreated (calendar month)Record count
4Incoming cases by weekCasesCreated (week)Record count
5Open casesCasesStatusRecord count, filter: Status ≠ Closed
6Critical cases by monthCasesCreated (calendar month)Record count, filter: Priority = Critical
7Tasks by typeTasksTypeRecord count (ready-made)

Two honest boundaries. First, SLA breaches and resolution time are not fields in the report builder; both are calculated values. You watch breaches from the SLA strip on the home page and the Live SLA Breaches card in the notification centre, and if you want a monthly breach count you export the case list and split it in a spreadsheet. Second, the channel breakdown is not reliable in the report builder; for a channel split, filter and count from the Channel column on the list view, or export it.

If your customer records still live in spreadsheets, that is the sensible place to start the migration: the Excel customer tracking guide comes with a template and a migration order. Current numbers are on the pricing page, and you can request a demo to try it with your own data.

Frequently asked questions

What does customer complaint tracking software do that a shared inbox does not?
It keeps three questions answerable at any moment: who has this problem, by when is it supposed to be solved, and what were we last told the customer. A spreadsheet or a shared inbox can hold all three, on one condition: somebody keeps updating them by hand. The real difference is not the reporting, it is that the record queues itself. A ticket gets a number, gets an owner, starts a timer sized by its priority, and flags itself on the list as that time runs out. In a shared inbox the newest message sits on top and the most overdue one quietly sinks to the bottom.
What is an SLA, and how should a small business set its targets?
An SLA (service level agreement) is the written version of how quickly you will respond to a request and how quickly you aim to close it. For small teams the approach that works is to size the target by priority rather than by customer: four hours when work has stopped entirely, eight when things are degraded but running, twenty-four when it is annoying but not urgent, forty-eight for questions and requests. Pick four numbers your team can actually hit. An SLA you miss every week is worse than no SLA at all, because it is a promise you made to a customer and then broke.
Do WhatsApp messages become tickets automatically?
Not in Ohana360, and that is worth stating plainly. The WhatsApp360 add-on is click-and-write: it opens a templated message from a record and logs the send as an activity on that record. There is no inbound sync, no sending from a flow and no bulk sending. What works in practice is this: keep using WhatsApp as the first-contact channel, but turn the problem itself into a ticket within about sixty seconds and set the channel field to WhatsApp. Adding a new value to that picklist is a one-line job in the Object Manager.
What statuses should a support ticket move through?
Ohana360 ships six: New, In Progress, Waiting on Customer, Escalated, Resolved and Closed. The most valuable of those is Waiting on Customer, because it separates the tickets where the ball is in your court from the ones where it is not, and stops the second group from polluting your overdue list. Escalated marks the records that have moved past the person who first picked them up. On the record page the statuses appear as a path, and choosing Resolved or Closed makes the resolution note mandatory.
How do I stop answering the same question over and over?
Write the answer once and put it in the knowledge base. With Knowledge360 enabled, a Suggested Articles card appears on the ticket: it takes the words in the ticket subject, looks for them in the title, summary and category of your published articles, and offers the three best matches. You link the article to the ticket and base your reply on it. If Portal360 is also on, the customer can search the same article from the portal's Knowledge Base tab, and a good share of those tickets never get opened at all.
Does the customer get an email automatically when a ticket is updated?
Not out of the box; there is one step to build first. The Send Email action in the flow engine reads the recipient from a field on the record, and a ticket has no standard email field. So teams that want automatic updates do this: add a custom field called something like Notification Email to the ticket in the Object Manager, fill it at intake, then build a flow that emails that field when the status changes to Resolved. For one-off updates you write from the Email card on the ticket page instead, and the message lands in the record's conversation and on its activity timeline.

Give every problem a number

Requests from chat, phone, email and your web form on one list: owned, timed, and closed with a note that says what was actually done.

Read next