A new business system goes live on Monday. By Wednesday, a junior technician has opened the full customer list, a cost price has been read out to a customer at the counter, and nobody can say who changed a quoted discount, because everyone shares one "admin" login. None of this needed a hacker, only a system where access was never decided.
This guide is for owners and managers who are about to commission a custom business system, or who already have one and suspect that too many people can do too much. It explains who should be able to see, create, edit, approve, delete and export what, what to decide before the build, how to write and test it, and how to keep it right as staff join, move and leave. It is general guidance, not legal advice, and does not describe any one supplier's product.
Why "who sees what" is a business decision, not a technical one
A developer can build almost any access rule you ask for, but cannot know which rules your business needs: whether a technician should see the customer's full address, whether a branch manager may give a discount, whether the bookkeeper may export every invoice. Those are questions about trust, money and habit.
If you do not answer them, the default is usually one of two extremes: everyone can do everything, because that is quickest to build, or access is so tight that staff share a password just to get work done. The cheapest moment to decide is on paper, before a single screen exists.
Owner, manager, staff: what each role usually needs
Most small businesses can start from three or four roles and add more only when duties genuinely differ. A role is a named bundle of permissions attached to a job, not a person; a new joiner gets the role instead of a new set of rules.
| Role | Typically needs | Typically should not have |
|---|---|---|
| Owner | See everything, approve large or unusual items, manage users and roles | Nothing is off limits, but daily data entry is better done under a lower role |
| Manager | See and edit their team's or branch's records, approve within a set limit, run reports | Changing roles, seeing other branches' figures unless the job needs it, deleting history |
| Office or admin staff | Create and edit customers, quotations and invoices as drafts | Approving their own discounts or refunds, seeing cost and margin |
| Field or counter staff | Their own jobs, the customer details needed for each job, status updates | The full customer list, prices below sale price, exports |
| External accountant or auditor | Read-only access to invoices, payments and reports | Editing operations, customer contact details beyond what the books need |

Why least access beats everyone-is-admin
Least access, often called least privilege, means each person gets only the access their job needs, and extra access is added when a real need appears. Giving everyone admin rights feels easier on day one, because nobody is ever blocked. The costs arrive later.
- Honest mistakes get bigger. A person who can delete a customer record will eventually delete the wrong one.
- Sensitive information spreads. Cost prices, margins, staff pay and customer phone numbers are what most often leave with a person, by accident or on purpose.
- Accountability disappears. If everyone can change a price, "who changed it?" has no answer.
- One leaked password opens everything. The more powerful the account, the more it costs you, and a leaver with admin rights is a bigger risk than one with a narrow role.
Least access is not distrust. It is the same reason a shop keeps the cash drawer and the safe key with different people. Good staff are protected by it, because there is no doubt about who touched what.
The six actions to decide for every kind of record
"Can access the system" is far too blunt. For each kind of record (customers, quotations, invoices, jobs, stock, staff files), decide separately who may do each of these:
- See. Open and read it. This can be limited to your own records, your branch, or everything.
- Create. Add a new one.
- Edit. Change an existing one, often limited by stage: free as a draft, locked once approved.
- Approve. Give the final yes: a discount, a refund, a purchase, a leave request.
- Delete. Remove it. Voiding or archiving, with a reason, is usually safer than erasing.
- Export. Download a list or report. It is the permission most often forgotten, and a spreadsheet copy leaves the system and its controls entirely.
What to decide before the build starts
These decisions cost an afternoon now and a change request later. Bring a rough draft to the first conversation; what to prepare before a first conversation shows where it fits.
- List the roles. Name them by job, not by person, in the smallest set that reflects genuinely different duties.
- List the records. Customers, quotations, invoices, payments, jobs, stock, suppliers, staff files, reports.
- Fill in the six actions for each role and record. A one-page grid is enough.
- Decide the scope. Everything, only their branch or department, or only records they created or are assigned?
- Mark the sensitive fields. Cost price, margin, staff pay and customer contact details often need tighter rules than the record that holds them.
- Set the approval rules. Who approves a discount, refund, credit note or price change, up to what amount, and who steps in when that person is away?
- Name the administrators. Who can add users and change roles, and who is their backup?
- Decide the exit rule. Who removes a leaver's access, and by when?
A role-by-permission example for a small service business
Below is a made-up grid for a small repair and servicing business. It illustrates the format and is not a recommendation for your business; every cell is something you would adjust.
| Record or action | Owner | Manager | Office | Technician | Accountant |
|---|---|---|---|---|---|
| Customer name and phone | All | All | All | Own jobs only | No |
| Quotations | Create, edit, approve | Create, edit, approve within limit | Create, edit drafts | No | No |
| Discount above the limit | Approve | Request | No | No | No |
| Invoices | All | All, no delete | Create, edit drafts | No | View, export |
| Cost price and margin | View | View | No | No | View |
| Refunds and credit notes | Approve | Request | Prepare | No | View |
| Staff pay and leave | All | Own team's leave | No | Own record | Pay summary only |
| Void or delete a record | Void with reason | Drafts only | Own drafts | No | No |
| Export to spreadsheet | All | Own branch | No | No | Invoices, payments |
| Add users, change roles | Yes | No | No | No | No |
Notice the patterns: money-moving actions are split into "prepare" and "approve" between different people; the technician sees only what a job needs; the accountant can read and export but not change operations; and only one role manages users. A real grid would also name a second administrator, covered below.
Scope, sensitive fields and approvals
Branch and department scope. A role is only half of the rule; the other half is how far it reaches. A branch manager might see only their own branch's sales and stock, while head office sees all. A sales team might see only the customers assigned to them. Say so for each role, because "manager" means different things in a one-outlet shop and a multi-branch company. For several outlets, see multi-outlet management.
Money, cost and contact fields. Field-level rules let a person open a record yet not see certain fields in it. Typical candidates: cost price and margin, salary and bonus, bank details, and customers' phone numbers and addresses. Asking "which fields would hurt us if they walked out the door?" quickly produces the list.
Discounts and refunds. Decide the limits in plain numbers: for example, staff may offer nothing, a manager up to a limit you set, and anything higher needs the owner. Just as important, nobody approves their own request; a refund that one person both raises and approves is the classic gap. For how quotes become invoices, see quotation to invoice automation.
Writing it into the specification
Access rules that live in a conversation get forgotten or argued about. Put a short section in the specification so they can be built, tested and held to:
- A role list with a one-line description, and the permission grid attached as a table.
- Scope rules in sentences: "A branch manager sees only records where Branch equals their own branch."
- Field and approval rules: which fields are hidden from which roles, the approval limits, and that nobody approves their own request.
- Administration rules: how many administrators, how users are added and removed, and what a new role requires.
- A change clause: adding a role later is a quoted change, so know the cost. See bugs versus change requests for how that line is drawn.
Also check what you can change yourself. Some systems let an administrator edit roles on a screen; others need the developer for every adjustment. Ask which before you compare two custom software quotes, because the answer affects running cost for years.
Testing roles in user acceptance
Most acceptance testing checks that people can do things. Permission testing checks that people cannot do other things, and that part is easy to skip. Build it into the user acceptance testing plan:
- Create one test user per role and walk the grid: for every cell marked "No", try it and confirm the system refuses.
- Try the back doors. Paste a link to a restricted page, search for a customer you should not see, open a report, and try the export button.
- Test the scope. As a branch manager, confirm another branch's records cannot be found in search or reports.
- Test the approval limits just below, at and above the threshold, and confirm nobody can approve their own request.
- Test the lifecycle. Disable a user and confirm they are locked out; change a role and confirm the new access applies.
- Record the result against the grid and fix gaps before the final payment.
Shared logins, and why to avoid them
One login for the whole front desk is tempting, since it saves creating accounts. It also means you cannot tell who did what, cannot remove one person without changing the password for everybody, and cannot give people different access. Every leaver then forces a password change, which in practice gets skipped.
Give each person their own login, and fix forgotten passwords with a proper reset process rather than sharing. Where a counter terminal truly needs a shared account, keep it to non-sensitive functions, change its password whenever someone who knew it leaves, and write down who has it. The same rule applies outside the system: for the hosting side, see cPanel account security.
Admin accounts: how many, and who holds them
An administrator can add users, change roles and often see everything, so the account is the most valuable one you have. Three habits work well for small firms:
- Keep admins few, but never one. If the only administrator is on leave, ill, or has left, nobody can add a new hire or fix a locked account. Two named administrators, usually the owner and one trusted senior person, avoid that single-owner bottleneck.
- Separate admin from daily work. Each administrator keeps an ordinary account for everyday tasks.
- Do not give admin to the developer by default. A builder may need access during the project and for support, but it should be named, limited, time-bound and agreed in writing. Who ultimately controls the system is covered in source code and system ownership.
Record who the administrators are, where recovery details are kept, and who can replace one in an emergency.
When staff join, change role or leave
Permissions drift. A person covers a colleague's leave and keeps the extra access; a promotion adds rights but nobody removes the old ones; a leaver is forgotten. Build a small routine around the three moments.
- Joiners: assign a standard role and record who approved it.
- Movers: replace the role rather than adding to it, so old access does not pile up.
- Leavers: remove access on or before the last day, not weeks later.
- Every quarter, review the user list: does everyone still work here, and does each role still match the job?
A short offboarding checklist for the system:
- Disable the account on the last working day, or earlier if the exit is unfriendly. Disable rather than delete, so the history stays attached to a name.
- Reassign their open jobs, quotations and approvals to a named person.
- Change any shared password they knew, and remove them from shared mailboxes.
- Remove their access to connected tools, such as email, file storage and messaging groups.
- Collect devices and exports they hold, and note the date and who did it.
The same tidy-up applies outside the system. If the leaver carried a digital card, see what to do with a digital name card when an employee leaves.
Signs permissions are too loose or too tight
| What you notice | It usually means | First step |
|---|---|---|
| Everyone has the admin role | Roles were never designed | Draft the grid and move people to standard roles |
| Staff can see cost prices or other branches' sales | Scope and field rules are missing | Add scope and hide the fields |
| A former employee still appears as an active user | No offboarding routine | Disable now and start the checklist |
| Nobody can say who approved a discount | Shared logins or no approval rule | Individual accounts and a recorded approver |
| Staff keep asking the owner to do small things | Roles are too tight | Review the most common requests and delegate within a limit |
| Only one person can add users | Single-owner bottleneck | Appoint a second administrator |
Too tight costs too: people who cannot do their work invent workarounds such as spreadsheets, screenshots or borrowed logins, often worse than the risk you tried to prevent.
Questions to ask a developer
- How are roles set up: fixed in code, or editable by an administrator on a screen?
- Can permissions be set per action (including export), not just per page?
- Can access be limited by branch, department or "own records only", and can fields such as cost or pay be hidden?
- Can approval limits be configured, and can the system stop a person approving their own request?
- How are users added, disabled and removed, and does disabling keep their history?
- Can a second administrator be created without the developer?
- What access will you, the developer, keep after launch, and how is it recorded?
Treat vague answers as information: a developer who has built access rules before answers quickly and in plain words.
A short pointer: audit trails and backups
Roles decide who is allowed to act. Two related safeguards, a record of who did what and when, and tested backups so mistakes can be undone, deserve their own guide. For now, put both on your questions list for the developer.
A checklist before you sign off
- Roles named by job, with the six-action grid in the specification.
- Scope stated for each role, and sensitive fields hidden where needed.
- Approval limits written down, with no self-approval.
- No shared logins; two named administrators, each with an everyday account too.
- Every "No" in the grid tested in acceptance.
- A joiner, mover and leaver routine, a quarterly review date, and the developer's own access recorded.
Common mistakes
- Deciding roles after the build. Retrofitting access costs more than planning it.
- Forgetting export. A restricted list becomes unrestricted once someone can download it.
- Testing only what people can do. The "No" cells are where leaks live.
- Deleting leavers' accounts. The history then loses its names; disable instead.
- Making the owner the only administrator. It creates a bottleneck.
Where Gotka Technologies fits
Gotka's App & System Development service builds mobile apps, web apps and business systems, from an indicative RM8,000 for web apps and dashboards, RM12,000 for business systems and integrations and RM15,000 for mobile apps, each confirmed by a written quote once your needs are scoped. This guide is general advice and does not describe any role, permission or security feature of a Gotka system, so ask any supplier, Gotka included, to put the access rules they will build in writing. For the customer-facing side, see customer portals for service businesses; for what each role sees in reports, business dashboards and reporting; for staff records, attendance, leave and claims; and if you are moving old records in, data migration. The team is reachable through the contact page.
Key terms used in this guide
- Role: a named bundle of permissions attached to a job, such as manager or technician.
- Permission: a specific thing a role may do, such as view, create, edit, approve, delete or export.
- Least privilege (least access): giving each person only the access their job needs.
- Admin (administrator): an account that can add users and change roles, and often sees everything.
- Scope: how far a role reaches, such as all records, one branch or only own records.
- Field-level access: hiding fields such as cost price from roles that can open the record.
- Segregation of duties: one person prepares a task and another approves it.
What are user roles and permissions in a business system?
A role is a named group of permissions tied to a job, such as owner, manager or technician. A permission is a specific action, such as seeing, creating, editing, approving, deleting or exporting a type of record. Assigning roles instead of individual rules keeps access consistent, makes new joiners quick to set up, and lets you change a whole job's access in one place.
Why is giving every staff member admin access a bad idea?
Admin access lets a person change settings, see every record and often manage other users. If everyone has it, an honest mistake can delete important data, sensitive details such as cost prices and staff pay spread widely, nobody can tell who changed what, and one leaked password exposes everything. Giving each person only the access their job needs limits all of those risks.
What should I decide about roles before a custom system is built?
List the roles by job and the record types, then decide for each role who can see, create, edit, approve, delete and export each record. Add the scope (all, branch, department or own records), mark sensitive fields such as cost and contact details, set discount and refund approval limits, and name at least two administrators. Write all of it into the specification.
How many admin accounts should a small business have?
Usually two: the owner and one trusted senior person, each with a separate named account. A single administrator is a bottleneck if that person is away, ill or leaves, while too many dilute control. Each administrator should also keep an ordinary account for daily work, and the developer's own access should be limited, named and agreed in writing.
How do I test user roles before accepting a system?
Create one test user per role and go through your permission grid. For every action marked not allowed, try it and confirm the system refuses, including through pasted links, search, reports and the export button. Test branch scope, approval limits just below and above the threshold, and that nobody can approve their own request. Also disable a user and change a role to check both take effect.
What should I do with a system account when someone leaves?
Disable it on or before their last working day rather than deleting it, so the history stays attached to their name. Reassign their open jobs and approvals, change any shared password they knew, remove them from shared mailboxes and connected tools, collect devices and exports, and note the date and who did it. Review the full user list every quarter as well.
How to Review and Test a Custom Business System Before You Accept It
How to test a custom business system before you accept it: user acceptance testing with real tasks, real data, a punch list and a clear definition of done.
App DevelopmentWho Owns the Source Code of Your Custom Business System?
Who owns the source code of a custom business system you paid for in Malaysia? What the Copyright Act 1987 defaults to, and what to confirm before signing.
App DevelopmentMoving Your Business Data Into a New Custom System
Moving to a new custom business system? Here's what actually happens to your existing data — what to clean up, test and keep as a safety net before cutover.


