Opening — AlifPramanaPutra.fig
0%
Let's TalkLet's Talk
Case Study — PT PKSS · BRI Group

Prima Super App

HR platform for Indonesia's largest labor supply company — attendance, overtime, leave, and payslip for field workers nationwide.

0Years shipped
0Workers served
0Platforms
0Modules shipped
Prima Super App mobile and web admin dashboard
01 — About the Project HR Platform · Labor Supply

Indonesia's largest labor supply company, run on spreadsheets and WhatsApp.

PT PKSS (Prima Karya Sarana Sejahtera) is a labor supply company under BRI Group, managing thousands of outsourced workers across Indonesia. Before this platform, their entire HR operation — attendance, overtime, leave, payroll integration — ran on spreadsheets, WhatsApp messages, and a third-party app they didn't own. The goal: build a system they fully controlled, that could grow with them. What started as a 3-month mobile app became a 3-year product — rebuilt, scaled, and automated across three major versions.

Project at a GlanceV1 — 2022-23V2 — 2024-25V3 — 2025-26
Timeline2022 - 20232024 - 20252025 - 2026
PlatformiOS, Android & WebiOS, Android & WebiOS, Android & Web
Users10,000Multi-company±53,000
FocusFoundationScaleField Gaps
Scope13 mobile · 14 web menusMobile 13→17 · Web 14→19Enhancement
DesignFigma
DeliverablesUser flows, hi-fi mockups
CollaborationDirect with client (PT PKSS) and development team (PT Infobit Unixa Komputasi)
V1 — 2022 – 2023

Build the Foundation

PKSS had 50,000+ outsourced field workers across Indonesia already using GreatDay to manage attendance, overtime, and time off. The platform worked but PKSS didn't own it. Every feature was a subscription, every data point lived in someone else's system. The goal of Prima Super App wasn't to digitize a manual process. It was to replace a dependency, build an in-house HR platform so PKSS could stop subscribing to GreatDay and take full ownership of their workforce data. Starting with an initial rollout of 10,000 workers.

ClientPT PKSS (Prima Karya Sarana Sejahtera), a labor supply company under BRI Group
PlatformiOS, Android & Website
Timeline2022 - 2023
My RoleUI/UX Designer
DeliverablesUser flows, hi-fi mockups
Users10,000 (initial V1 rollout) · 50,000+ total outsourced workers

The Problem

Two things directly affected payroll accuracy and both were broken:

1 — Overtime calculation was inconsistent

Indonesian labor law defines overtime into categories — LB1, LB2, LL1, LL2 & LL3 — each with different pay multipliers depending on the day type. Manual calculation meant different results depending on who did the math.

2 — Workers couldn't correct missed attendance

A failed clock-in meant missing pay. Their previous app (GreatDay) handled this, so it was a non-negotiable expectation coming in.

1 — Overtime: From Categories to Time

The initial design was logical: workers select their overtime category (LB1, LB2, LL1, LL2 & LL3) when submitting a request. The categories are defined by law, the client understood them, and the design was approved.

Worker flow — initial design, category-based input
Worker flow — initial design (category-based input)
Admin view — initial design, convert to overtime categories format
Admin view — initial design (convert to overtime categories format)

Then we hit UAT. Field workers didn't know what LB or LL meant. They knew they worked late on a Tuesday. They knew it was a national holiday. But mapping lived experience to a labor law category before submitting a form was friction that served the system, not the person using it. A change request came in: this isn't working.

Design Decision

Flip the input model from category-first to time-first.

Rather than asking workers to understand labor law, the new form asks three things: start time, end time, and day type (Workday / Weekend / National Holiday). The system calculates the correct LB/LL category automatically. The worker never sees the categories but the admin still gets exactly the same structured output they always needed.

Worker time-based input, after redesign, screen 1
Worker — time-based input (after) — 1
Worker time-based input, after redesign, screen 2
Worker — time-based input (after) — 2
Admin result kept in overtime categories format with detail view, after enhancement
Admin — the result kept in overtime categories format with the detail view (after)

Same output. Simpler input. The client approved the first version because it made systemic sense. Field workers showed us it didn't work in practice. That gap between logically correct and actually usable is exactly the problem design is supposed to catch.

2 — Attendance Correction: Let the Human Layer Do the Work

Workers who missed a clock-in needed a correction flow. The obvious risk: an open correction feature becomes a fraud vector — workers claiming presence they didn't have.

User flow — attendance correction
User flow — Attendance correction

The instinct was to solve this inside the system: GPS verification, photo evidence, manager confirmation in-app. But building a verification layer without the right data infrastructure would have bloated V1's scope and pushed the deadline.

Design Decision

Keep the app purely administrative. Let the human relationship handle verification.

Attendance correction screens
Attendance correction screens
  1. Worker explains the situation to their supervisor in person
  2. Supervisor verbally approves
  3. Worker submits a correction request in the app with a written reason
  4. Supervisor approves in the app — creating a formal paper trail

The app doesn't verify whether the absence was legitimate. That trust layer lives in the supervisor-worker relationship, which already existed. The app just makes the agreement official. This kept scope tight, matched how PKSS supervisors already operated, and created accountability without adding complexity the team wasn't ready to support.

Outcome

Delivered across iOS and Android in 3 months, for 10,000 field workers. PKSS was proud of what shipped, despite a tight timeline with piloting, go-live, and maintenance still ahead, they had built their first in-house HR tool and were confident it could fully replace GreatDay. The late-stage overtime redesign added time, but it shipped a product field workers could actually use. And the architecture built here — approval flows, role hierarchy, data structure — became the exact foundation V2 would expand into a platform serving multiple companies.

V1 final hi-fi screens overview 1
Final hi-fi screens — overview
V1 hi-fi screen 2
V1 Home screen
V1 Overtime screen
V1 Time Off screen
V1 Reliever screen
V1 Activity Log screen
V1 Attendance screen
V1 Clock In/Out screen
V1 Salary Slip screen
V1 Offline Mode screen
V1 Tutorial screen
V1 hi-fi screen 8
V1 final hi-fi screens overview 2
Final hi-fi screens — overview
V1 hi-fi screen 9
V1 hi-fi screen 10
10,000 workers3 months6 modules

What I Learned

/01

Stakeholder approval isn't user validation. The overtime input was approved, built, and delivered before field workers showed it didn't work. Approval reflects intent — usability reflects reality. Both need to be tested.

/02

Scope discipline is a design decision. The attendance correction could have become a complex verification system. Keeping it administrative wasn't a compromise — it was the right call for where the product was at. Knowing when not to add complexity is as important as knowing how to solve it.

/03

Design for the mental model, not the data model. LB1 and LB2 made sense to the system. Field workers think in hours and day types. The gap between those two is exactly where design adds value.

V2 — 2024 – 2025

Scale for Many

V1 proved the concept. PKSS had their HR system across mobile and web, and it worked. The next ask changed everything: make it available to their client companies, each with their own branding, their own org structure, and their own workers. One requirement "white label" became the foundation for a complete rethink of how the platform was built. Both platforms grew as a direct result. New modules emerged from client needs. The login screen itself changed. By the end of V2: 17 mobile menus, 19 web menus — up from 13 and 14 in V1.

ClientPT PKSS (Prima Karya Sarana Sejahtera)
PlatformiOS, Android & Web
Timeline2024 - 2025
My RoleUI/UX Designer
DeliverablesUser flows, hi-fi mockups
ScopeMobile: 13 → 17 menus · Web: 14 → 19 menus

The Problem

Making one app work for one company is a solved problem. Making it work for many companies each with different org structures, different approval chains, different branding is an architecture problem that surfaces as a UX problem. The key challenges V2 introduced:

1 — Onboarding without IT support

Each company has its own structure: branches, clients, work units. That needs to be configured before anyone can use the app.

2 — Approval across different org structures

An approval chain that works for a 3-layer hierarchy breaks for one with 6 layers.

3 — Fundamentally different schedule types

Some workers have fixed shifts. Others have schedules that change week to week.

1 — Multi-tenant Setup: Build the Container First

The first challenge of white label wasn't branding — it was onboarding. Before a company could use the platform, someone needed to configure their entire org structure: company, branches, clients, office branches, work units, and finally workers. Six layers. Wrong order meant broken data relationships across the entire system. The initial instinct was a single long form. The problem: admins don't think in data hierarchy. They think in "my company has branches, and each branch has clients."

Design Decision

Container-first: create the shell before filling the details.

Admin Maker step-by-step wizard flow — add company
Admin Maker — step-by-step wizard flow (add company)
Admin Maker step-by-step wizard flow — add client
Admin Maker — step-by-step wizard flow (add client)
  1. Create the company
  2. Add branches — directly under the company
  3. Add clients — also directly under the company, independent from branches
  4. Add office branches under each client
  5. Add work units under each office branch
  6. Add workers into work units

Branch and client sit at the same level, not nested inside each other. This was a deliberate decision: one client can serve multiple branches without duplicating data. Putting client inside branch would have meant creating the same client record repeatedly for every branch that works with it. The hierarchy enforces itself through the UI — you can't add an office branch without a branch, you can't add a work unit without an office branch. Data relationships are always correct by the time setup is complete.

2 — Structure as a Living Feature

Once the org structure existed as structured data, it became something that could do more than just organize permissions. The first thing it unlocked: automatic org chart generation. The same data admins input during setup renders as a visual hierarchy. No extra work — the org chart is a live read-out of the structure that already exists.

Org chart auto-generated from company structure
Org chart auto-generated from company structure

The second and more complex implication was rethinking approval logic. In V1, approval was simple: one approver, one decision. In V2, org structure meant multiple approvers in a chain. The question: if an overtime request goes to 3 approvers, what does "approved" mean? The first answer was OR logic — any one approver can approve. Simple, but it let a manager approve something their director hadn't seen.

Design Decision

Switch to AND logic: every approver in the chain must approve.

AND logic introduced a state that didn't exist before: "Diterima Sebagian" (Partially Approved). A request where some approvers said yes but others hadn't — or said no — lives in a visible middle state. Workers see exactly where in the chain their request is sitting, not just "pending."

Approval flow, Diterima Sebagian state, screen 1
Approval flow — Diterima Sebagian state (1)
Approval flow, Diterima Sebagian state, screen 2
Approval flow — Diterima Sebagian state (2)
Approval flow, Diterima Sebagian state, screen 3
Approval flow — Diterima Sebagian state (3)
Approval flow, Diterima Sebagian state, screen 4
Approval flow — Diterima Sebagian state (4)

This made the system honest. Instead of a black-box "pending," workers see progress. Instead of one approval being enough, the full chain is respected regardless of how many layers a company has.

3 — Shifting: Two Worker Types, Two Different Problems

V2 introduced work scheduling. Not all workers have the same kind of schedule and that difference required two entirely different design approaches. Shift Tetap (Fixed Shift): a permanent, recurring schedule — admin sets it once and it applies going forward. Shift Outsourcing (Variable Shift): a schedule that changes — different shifts on different dates depending on deployment. Admin uploads an Excel file, one row per worker per date, and the system processes it.

Design Decision

Different input models for fundamentally different work patterns.

Fixed shift (Shift Tetap) setup flow
Fixed Shift (Shift Tetap) setup flow
Shift Outsourcing Excel upload flow
Shift Outsourcing — Excel upload flow

Beyond setup, the shifts had a direct UX consequence: the attendance button became shift-aware. In V1, this already worked but only because all workers had fixed shifts. The system always knew their schedule, so the home screen could reflect the right state automatically: clock in before shift, clock out after, done for the day.

V1 home screen — before shift and after shift
V1 home — before shift & after shift

V2 introduced a problem. Shift Outsourcing requires admins to upload schedules — but during early rollout and implementation, not all workers had schedules assigned yet. A strict shift-gated system would have blocked them from clocking in entirely.

Enhancement

If a worker has no assigned schedule, let them self-select their shift instead of blocking them.

V2 home screen — worker with assigned shift
V2 home — worker with assigned shift
V2 home to shift picker — worker without assigned schedule
V2 home → shift picker — worker without assigned schedule

When a worker has no scheduled shift for the day, the app surfaces a shift selection screen showing all available shifts in their work unit. The worker picks the one that matches their actual hours, then proceeds to clock in normally. This kept the system honest: workers with assigned schedules clock in within their shift window automatically. Workers without a schedule still clock in — they just manually confirm which shift they're on. No one gets blocked because an admin hasn't uploaded their schedule yet.

4 — Overtime, Refined

V1 established the time-based input model. V2 improved how overtime moved through the system after submission. Before: overtime requests were batched and reviewed monthly. A request submitted on the 3rd might not be approved until month-end. After: daily approval. Each request is reviewed as it's submitted. Admins can also proactively assign overtime to workers, not just receive submissions. Two additional guardrails: no back-date — overtime can't be submitted for a date that's already passed — and admin-assigned overtime, for planned overtime, admins create a pre-approved record before the shift.

Workers Flow

V2 overtime submission flow, worker
Overtime submission (worker)
V2 overtime assignment flow, worker
Overtime assignment (worker)
V2 overtime history — assignment label
When it's an assignment, the card includes an "Assignment" label

Admin Flow

V2 admin overtime flow
V2 overtime assignment dashboard, admin
Overtime assignment dashboard (admin)
V2 overtime history, admin
Overtime history (admin)

This was refinement, not redesign. The input model from V1 stayed. The approval cycle became faster and more accountable — shaped by how the V1 system was actually being used.

5 — Role-based Filtering: The Same Data, Different Lenses

With multiple companies and a 6-layer hierarchy, every table in the platform had to answer: whose data should this person see? A Super Admin sees everything. A branch manager sees their branch. A client admin sees only their client's work units. Same data, different lens.

Design Decision

Auto-scope filters to the user's access level. Don't start at the top.

Filter hierarchy — same report, different roles
Placement filters are adjusted based on the user's access level

Rather than showing the full hierarchy and hiding what's irrelevant, filters default to the user's own access level. A branch manager opens an attendance report and immediately sees their branch — no extra filtering needed. The pattern was applied consistently across all 19 web menus, so the experience of "what I see = what I'm responsible for" felt natural throughout.

Outcome

V2 transformed a single-company HR tool into a multi-tenant platform. The Admin Maker gave PKSS's clients the ability to self-onboard their org structure without IT support. The org chart became a bonus deliverable — not in the original scope, but immediately valued by clients. AND approval logic gave workers visibility into where their requests actually stood. The platform was now ready to serve not just PKSS's own operations, but their entire client network — each under their own branding, each with their own structure, all running on the same foundation.

V2 final hi-fi screen 5
V2 mobile Patrol screen
V2 mobile Daily Register screen
V2 mobile Reimbursement Claim screen
V2 mobile Time Off screen
V2 mobile Overtime screen
V2 mobile Clock In screen
V2 mobile Login screen
V2 mobile Home screen
V2 final hi-fi screen 10
V2 website Data Filtering screen
V2 website Daily Register screen
V2 website Overtime screen
V2 website Reimbursement Claim screen
V2 website Time Off screen
V2 website Shift Settings screen
V2 website Patrol screen
V2 website Admin Maker screen
17 mobile + 19 web menusMulti-tenant

What I Learned

/01

Data architecture is a UX problem. The multi-tenant setup wasn't just a backend task — how admins configured their org structure affected every feature downstream. Getting the setup flow right meant getting everything else right.

/02

Clean data models generate features for free. The org chart wasn't in the original scope. It emerged because the structure data was already there. When the underlying model is solid, features cost almost nothing to add.

/03

The correct answer isn't always the simpler one. OR approval logic is easier to build and easier to explain. AND approval logic is what actual approval chains require. Designing for correctness meant adding complexity — and a new UI state — that the simpler version didn't need.

V3 — 2025 – 2026

Close the Gaps

Three years of running the platform. 53,000 users across multiple companies. By V3, PKSS didn't need more features, they needed the platform to close the gaps that field use had exposed. Two pain points remained: finding the right replacement worker fast when someone was absent, and workers having no way to record their actual attendance during overtime hours.

ClientPT PKSS (Prima Karya Sarana Sejahtera)
PlatformiOS, Android & Web
Timeline2025 - 2026
My RoleUI/UX Designer
DeliverablesUser flows, hi-fi mockups
Users±53,000 across all companies

The Problem

Two operational gaps remained after V1 and V2.

1 — Finding a replacement worker was manual

When a worker was absent, the RO (field supervisor) had to search for a replacement themselves — checking who was qualified, who was available, who hadn't exceeded their deployment limit. No system supported this. It all happened over phone calls.

2 — No way to record overtime attendance

Overtime requests existed, but there was no clock-in/clock-out specifically for overtime hours. Workers were submitting requests after the fact without a real-time record of when they actually started and finished.

1 — PGS Reliever: Turning a Phone Call Into a Workflow

Context: PGS (Petugas Pengganti Sementara) are temporary workers deployed when a permanent worker is absent. Before V3, the RO handled this entirely through phone calls and manual records — there was no system support at all. The design problem had two parts: finding the right person, and managing how many days they'd already worked.

Finding the right reliever

A single RO might have access to a large pool of potential reliever workers. Calling through them manually was slow and error-prone. The system needed to surface the right candidates quickly.

Design Decision

Filter-first: let ROs narrow the pool by qualification, location, and category before selecting.

Reliever assignment — filter and selection flow
Reliever assignment — filter and selection flow
Reliever list
Reliever list

Rather than presenting a flat list of everyone available, the assignment screen opens with filters: job qualification, geographic location, and deployment category. The RO narrows the list, picks the right person, and the system generates the assignment automatically — including a formal Surat Tugas (assignment letter) sent directly to the reliever.

Managing the 21-day quota

Indonesian labor regulations cap external reliever deployment at 21 working days per month. Before V3, tracking this was manual — and it was easy to exceed the limit without realizing it until it was too late.

Design Decision

Visual quota tracking with progressive warnings, not just a hard block.

Assignment restriction settings — warning and block
Assignment restriction settings — Super Admin configures warning / block rules and the quota limit
Reliever quota — warning and block states
Reliever quota — warning and block states
Assign button disappears when reliever reaches quota limit
When the reliever already reaches the quota limit, the Assign button disappears

Progressive warnings matter here. A hard block at exactly 21 days creates operational emergencies — an RO with no reliever and no time to find one. Surfacing the threshold early gives time to plan before it becomes a problem.

Completion flow

When the reliever finishes their assignment and clocks out, they input a WhatsApp number in the app. This triggers the performance evaluation and task acceptance process — keeping the post-assignment workflow inside the system rather than jumping back to manual channels.

Reliever completion — clock-out and WhatsApp input screen
Reliever completion — clock-out and WhatsApp input screen

2 — Auto Overtime: Closing the Arc

This is where the overtime story which started in V1 completes.

  1. V1: Workers manually selected overtime categories (LB1, LB2, LL1, LL2). Field workers didn't understand the categories. We flipped to time-based input: start time, end time, day type. The system calculated the categories.
  2. V2: Approval moved from monthly batches to daily. Admins could assign overtime proactively. No back-dating allowed.
  3. V3: A new need surfaced — field workers needed to record their attendance during overtime, not just submit a request after the fact. There was no clock-in/clock-out specifically for overtime hours.

The challenge: adding overtime attendance without disrupting the existing attendance and overtime submission systems.

Design Decision

Add overtime clock-in as a parallel default state, and separate the act of recording attendance from the act of submitting a formal request.

Home screen — Clock In and Overtime Clock In side by side
Home screen — "Clock In" + "Overtime Clock In" side by side

When a worker has no active regular schedule or has already completed their shift, the home screen shows two attendance buttons simultaneously: Absen Masuk for regular attendance and Absen Lembur for overtime. The worker can clock in for overtime directly from the home screen without touching the existing regular attendance flow. But the result isn't a finalized overtime submission. It becomes a Draft.

Overtime list — Draft status
Overtime list — Draft status

Why Draft, not automatic submission? In the field, workers often start overtime before their SPL (Surat Perintah Lembur — overtime authorization letter) is ready. Requiring SPL at clock-in time would block workers from recording attendance in the moment. Making it auto-submit without SPL would create unverifiable requests in the approval queue. Draft solves both: the attendance is recorded the moment it happens, and the formal submission — with SPL — happens whenever the worker is ready. The two steps are decoupled without either being skipped.

The real-time record is immediately visible to admins. The Daily Attendance view gains a dedicated Hadir Lembur tab — showing every worker currently clocked in for overtime, with photo and location data for both clock-in and clock-out.

Admin Kehadiran Harian, tab Hadir Lembur
Admin — Kehadiran Harian → tab Hadir Lembur

The overtime arc is now complete: from asking workers to understand labor law categories, to letting them clock in naturally and handle the paperwork separately.

Outcome

V3 closed the gaps that three years of field use had revealed. ROs could assign replacement workers in minutes instead of through phone calls. Workers could record overtime attendance in the moment without waiting until after the fact, and without needing an SPL ready at the start. The Draft state gave them the flexibility to clock in first, submit formally later. The three-version arc tells a complete story: a product that started by replacing a third-party dependency, scaled to serve an entire company network, and matured by listening to what field use actually required — not just what the system assumed it would.

V3 final hi-fi screen 5
V3 final hi-fi screen 6
V3 final hi-fi screen 7
±53,000 usersAutomation

What I Learned

/01

Features get better when data accumulates. Auto overtime wasn't possible in V1 — there wasn't enough reliable data yet. Two years of attendance records and approved schedules made it straightforward by V3. Some features need time to be earned.

/02

Progressive warnings outperform hard blocks. Blocking at exactly 21 days creates emergencies. Warning at 19 gives time to respond. How you design a constraint matters as much as the constraint itself.

/03

Good design compounds. The overtime fix in V1 unlocked better approval in V2. Better approval in V2 made auto-calculation possible in V3. Every design decision that reduced friction created headroom for the next one.

The Arc 2022 — 2026

From a third-party dependency to a self-improving platform PKSS fully owns.

0Workers served
0Versions shipped
0Modules (mobile+web)
0Years of ownership

V1 replaced a third-party HR app PKSS didn't own. V2 turned it into a platform that could serve their entire client network. V3 automated what three years of field use had revealed. Every version's fix created the headroom the next one needed.

← Back to portfolio

Handoff

Ready for a designer who ships?

Designer spec sheet

Alif Pramana Putra

RoleUI/UX Designer
BaseJakarta, Indonesia (UTC+7)
RangeRemote / Hybrid / Onsite
Status● Open to work
Download CV ↓