AJ360 · Engagement → Creative · RQ2690

Creative Task Flow
& Productivity Report

What we built, how the tables connect, and why the numbers can be trusted.
Request: RQ2690 | Build (Monthly) Task Flow and Productivity Report
Base: AJ360 | Creative
Date: 12 October 2026
01 · The Ask

What was requested, and the rules we worked within

The request

  • One record per task, aggregated by team and by task type: count and completion time
  • Waiting time before a task reaches Creative, in working days
  • A manager view of load vs. capacity per team
  • The period is chosen by the user, and teams are dynamic, not hard-coded
  • Capacity per the request's method: FTE × hours/day × days/week

Constraints we kept

  • AJ360 | Ingest is read-only: no fields, no automations, no writes
  • Engagement is not loaded: we only chose which fields appear in the sync views
  • Every calculation is a formula or rollup, not a script
  • Automations reference field IDs, never names
  • Working days are set per team by the Creative manager
  • Every number is checked against an independent API calculation before sign-off
RQ269002
02 · Architecture

From source to the manager's dashboard

The source stays in Engagement and syncs into Creative through filtered views. All calculation happens locally in Creative.

AJ360 | Ingest read-only · untouched AJ360 | Engagement source · tables unchanged Tasks view: Tasks - Creative Base Tasks Status History view: History - Creative Base Airtable Sync Created ≥ 1 Jun 2025 4 Creative statuses only AJ360 | Creative working base · all calculation here Tasks - Creative Base synced + 27 local fields History - Creative Base 23,460 events Local Teams working days · capacity AJ360 Collaborators producers ↔ teams 3 Automations link events to tasks · link producers (new / changed) Interface Creative Productivity 1. Teams 2. Task Type 3. Dashboard
RQ269003
03 · Sync Layer

Sync only what the report needs

VIEW 1 Tasks - Creative Base

  • Filter: Created ≥ 1/6/2025
  • 16 source fields: Task ID, Eng. Task Type, Task Status, Video/Design Status, Video/Design Producer, Created, Publish Date…
  • 5,934 tasks today

VIEW 2 History - Creative Base

  • Filter: Action Time ≥ 1/6/2025
  • Status is one of 2. Cr. In Progress · 2. Cr. ReWork · 3. Review Output · 4. Ready to Schedule
  • 23,460 events · fields: Task Status, Task ID, Collaborator, Action Time, Action

Why this design

  • Synced fields are read-only and their type can't change, so every calculation lives in a local field on top of the synced table.
  • Sync linked tables = OFF: no extra tables pulled in; links are built locally.
  • No field was added to Engagement's tables. We only chose what each view exposes.

Operating rule

Both views must keep the same start date. If they drift apart, events lose their task or tasks lose their events, and both drop out of the report.

RQ269004
04 · Data Model

How the tables relate

Tasks - Creative Base ◆ TASK ID (key: TSK…) ◆ Eng. Task Type → link ◆ Producers → link (N:M) ◆ History - Creative Base ← 1:N Σ Actual Start · Actual Delivery Σ Cycle · Wait · Review Rounds Σ Std Hours · Executor Team · Calc Flag History - Creative Base ◆ Task Status · Action Time ◆ Task ID (changes with type) ƒ TSK = REGEX_EXTRACT(Task ID) ◆ Tasks → link (single) N : 1 via TSK Task Type - Eng. ◆ Std Video Hours ◆ Std Design Hours reference for standard hours N : 1 AJ360 Collaborators ◆ Name (= producer text) ◆ Local Teams (Member / Lead) ⌕ Team Working Days ◆ Tasks - Creative Base ← N:M N : M Producers Local Teams ◆ Lead · Members · Status ◆ Working Days · Hours per Day ƒ Weekly Capacity (Hours) N : M Σ ƒ ⌕ = fields calculated locally in Creative Gold frame = tables that received RQ2690 fields
RQ269005
05 · Task Lifecycle

Where every time value comes from

Each measure is read from the event history, not from the task's current status. That is how we know when each step actually happened.

Created task created 2. Cr. In Progress Actual Start MIN · first handoff to Creative 2. Cr. ReWork Review Rounds COUNT · times sent back ↺ may repeat 3. Review Output Actual Delivery last valid delivery 4. Ready to Schedule fallback when Review Output is skipped Wait (Work Days) waiting, in the team's working days Cycle Time (Hours) calendar hours · from handoff to Creative to final delivery
RQ269006
06 · Event Linking

Linking 23,000 events to their tasks

PROBLEM

The Task ID in the event history changes when the task type changes, so matching on the full text failed for 227 events. Pasting links by hand also stops at a row limit.

SOLUTION

  • A TSK field = REGEX_EXTRACT({Task ID}, "TSK[0-9]+"), a stable key that never changes
  • Automation RQ2690 | Link Event to Task finds the task by TSK and links the event
  • Runs automatically on every new event that arrives through sync
Event link status 23,190 linked · 98.8% 270 unlinked · 1.2% Events of tasks created before 1 Jun 2025, so out of scope by design Result: every in-scope task has its full history
RQ269007
07 · Time Fields

Time fields: conditional rollups, no scripts

FieldComputed from HistoryMeaning
Actual StartMIN · In Progressfirst handoff to Creative
Last Creative EventMAX · In Progress / ReWorklast time it was with Creative
Last Review OutputMAX · Review Outputlast delivery for review
Last ReadyMAX · Ready to Schedulefallback delivery
Last ReworkMAX · ReWorklast send-back
Review RoundsCOUNT · ReWorknumber of revision rounds

Actual Delivery logic

IF( Last Review Output AND NOT before Last Creative Event, → Last Review Output, IF( Last Ready after Last Creative Event, → Last Ready )) // otherwise BLANK = not delivered yet

A delivery doesn't count if the task went back to Creative after it. Ready to Schedule was added because 112 published tasks skipped Review Output and would have been misread as rework.

RQ269008
08 · Data Validity

Calc Flag: which tasks enter the report?

Every task gets exactly one of 7 classifications. Only OK · Ready for reporting counts in the metrics; the rest are shown under data quality.

OK · Ready for reporting 5,148 · 86.8% No Start · never reached Creative 559 · 9.4% Cancelled · stopped before delivery 109 In Progress · not delivered yet 43 Back to Brief · returned to editorial 40 No Standard 28 · Rework 7 35

Order of checks

  • No Actual Start → No Start
  • No Actual Delivery → Cancelled / Back to Brief / Rework / In Progress
  • Task type without standard hours → No Standard
  • Otherwise → OK

Technical lesson

A formula shown as a single-select silently falls back to the default option when its text doesn't exactly match an option name. We caught this on 149 tasks and fixed it.

RQ2690 · totals across the full scope since 1 Jun 202509
09 · Producers → Teams

From a producer's name to the executing team

Video / Design Producer text synced from Engagement ƒ Producer Names Producers link set by automation New + Changed Teams (Member / Lead) rollup, de-duplicated ARRAYUNIQUE + COMPACT Executor Team · Team Status executing team and attribution state OK / Unassigned / No Producer

Task attribution to teams · full scope

1,306 3,200 1,428 OK · attributed to a team Unassigned Team · producer has no team No Producer · no producer name (mostly 2025)

What this means

  • 4,506 / 4,506 producer names matched a person in Collaborators, no exceptions
  • The gap isn't linking: many producers aren't registered in Local Teams
  • Producer data is reliable from May 2026 only
  • The fix is administrative: the Creative manager adds them to their teams and every number updates automatically
RQ269010
10 · Dynamic Working Days

Waiting time in each team's working days

The built-in WORKDAY_DIFF assumes a Saturday–Sunday weekend. So we built a formula that reads each team's own working days from Local Teams.

Example: requested Thursday, reached Creative Sunday

Thursdayrequest created Fridayweekend · not counted Saturdayweekend · not counted Sunday+1 working day Wait (Work Days) = 1 for a team working Sunday to Thursday

How the formula works

  • Wait Span (Days): calendar days in Qatar time
  • Start Weekday: weekday of the creation date (0 = Sunday)
  • For each of the 7 weekdays: if it's a team working day, count how often it falls inside the span
  • Changing a team's working days in Local Teams recalculates all its tasks instantly

Checked on 1,306 tasks against an independent calculation: 0 mismatches.

RQ269011
11 · Load vs Capacity

Load and capacity in the same unit

LOAD Load = Std Hours

Std Hours = Std Video Hours if Video ≠ 0. Not Needed + Std Design Hours if Design ≠ 0. Not Needed

Standard hours come from the task type, and count only for the tracks the task actually needs.

CAPACITY Capacity

Weekly Capacity = Members × Hours/Day × |Working Days| // Active teams only Period Capacity = Weekly ÷ |Working Days| × team working days in range

Current team setup

TeamMembersDaysh/dayWeekly
Engagement Creative3Sun → Thu8120 h
App Artwork2Sun → Thu880 h
Weekly capacity (hours) Engagement Creative 120 App Artwork 80

The team lead isn't counted in capacity, because Members Count only counts members. This can be revisited with the Creative manager.

RQ269012
12 · Automations

Only three automations, all on field IDs

New event syncedTask ID: TSK48211-PR-Reel ƒ TSK extractedTSK48211 Find recordTASK ID = TSK48211 · max 1 Event ↔ Task linkedrollups update instantly
AutomationTriggerAction
RQ2690 | Link Event to TaskA History event whose Tasks link is empty and TSK is filledFinds the task where TASK ID = TSK, then fills Tasks
RQ2690 | Link Producers – NewA task with Producer Names and an empty Producers linkFills Producers from Producer Names by name match
RQ2690 | Link Producers – ChangedWhen Video Producer or Design Producer is edited (only those)Refills Producers from Producer Names

No infinite loops

The Changed automation watches the two producer fields only, so its own update to Producers never re-triggers it.

Backfilling old records

For existing records we switched the trigger formula to "" and back, so they matched the condition again and the automation ran on them.

RQ269013
13 · Manager Dashboard

Manager dashboard: 15 Sep → 12 Oct 2026

Tasks delivered (OK)
217
in the period
Median cycle time
28.3h
handoff to Creative → delivery
Median wait
1.0day
in team working days
Rework rate
49.8%
108 of 217 went back at least once
Standard hours
1,026.5h
total delivered load

Load vs capacity

Engagement Creative 95.4% · Healthy Load 458 h · capacity 480 h · 69 tasks App Artwork 0% · no tasks Load 0 h · capacity 320 h Unassigned No capacity 568.5 h · 148 tasks

The vertical line marks full capacity.

Dashboard rules

  • Date filter on Actual Delivery, Qatar time
  • Metrics use OK tasks only
  • Median, not average; cycles over 720 h excluded
  • 5 sections: KPIs · types · capacity · producers · data quality
  • Built as an Omni custom element: native interfaces can't compute medians or cross-table ratios
RQ269014
14 · Verification

Why the numbers hold: independent checks at every layer

What we checkedScopeResult
Start, delivery and rounds rollupsall tasks 0 mismatches
Actual Delivery logicall tasks 0 mismatches
Producer → person links4,506 4,506 / 4,506
Wait Span · Weekday · Work Days1,306 0 mismatches
Weekly capacity2 teams 120 h · 80 h
Every dashboard figure15/9 → 12/10 exact match

What the checks caught

The first AI-generated (Omni) version of the dashboard read 5 wrong fields: publish date instead of delivery, wait instead of cycle time, capacity instead of review rounds… and showed 1,439% utilization.

We rewrote the element by hand with fixed field IDs, and made it show a clear error if it can't read a field, instead of silently showing wrong numbers.

Documented

Each of the 36 fields we created carries a description of what it computes, its source and who uses it, prefixed RQ2690 |.

RQ269015
15 · Honest Limits

What the numbers measure, and what they don't

State these with every report

  • Actual Start = when the task was handed to Creative, not when work began
  • Cycle time is calendar hours, not effort; the system records no working hours
  • No separate timing for video vs. design: 97–98% of "4. Delivered" values are set by an automation at Review Output
  • Producer data is reliable from May 2026
  • The median is the right measure: 51 tasks took over 720 hours

Recommendations to measure better

  • Add a "Started" status set by the executor when work actually begins, separating queue time from work time
  • Require Video/Design Status when sending to Creative (121 tasks arrived with no track)
  • Register every producer in Local Teams (only two teams today)
  • Track each line separately if management needs video vs. design comparisons
RQ269016
16 · Next Steps

Remaining before handover

BUSINESS For Creative management

  • Assign unattributed producers to their teams: mahmoud shams, Ali Arslan, Baran Yildiz, Muhammed Ali, Mustafa Taha… (68% of the period's load has no team)
  • Clarify App Artwork's work: no tasks were recorded for them in the period
  • Read the rework rate (49.8%) as a quality signal, not a calculation error
  • Decide whether team leads count toward capacity

TECH Technical

  • Publish the 3. Dashboard page after review
  • One-decimal precision on Wait / Cycle / Std Hours
  • Delete 4 unused test fields (flagged in their descriptions)
  • Keep both sync views on the same start date
  • Revoke the temporary tokens used for verification
RQ269017
17 · Inventory

What was delivered

Sync views
2
from Engagement, its tables untouched
Documented local fields
36
rollup · formula · lookup · link
Automations
3
event and producer linking
Manager dashboard
1
5 sections · 100% verified
0 scripts · 0 writes to Ingest · 0 new fields in Engagement tables