The point where a generic task list stops being enough
Most project boards give you a title, a status, and maybe a due date. That's fine until someone needs to track a day rate per task, or wants a column that shows total estimated hours across a whole epic without opening every task to add them up by hand. At that point the team either builds a shadow spreadsheet that duplicates the board — which drifts out of sync within a week — or the tool needs a way to add a field that isn't in the original schema.
Ten field types, two of which compute themselves
WKFGo's custom fields cover the usual ground — text, number, URL, date, dropdown, multi-select, checkbox, user — plus two that don't take manual input at all:
Rollup aggregates a numeric field across a set of tasks: sum, avg, min, max, or count, over built-in numeric fields like story_points, progress, or estimated_time. Point a rollup at an epic's subtasks and it recalculates automatically as those tasks change — no one has to remember to update it.
Formula does arithmetic on a task's own numeric fields: literals, + - * /, parentheses, unary minus, and identifiers that reference known numeric fields (including other custom fields). estimated_time * 1.15 for a padded estimate, or progress / 100 * story_points for points-completed, are the kind of thing it's for.
Why the formula evaluator matters more than it sounds
The tempting way to build a "formula field" is to run the expression through a language's own eval. WKFGo deliberately doesn't — the formula evaluator is a small, hand-written recursive-descent parser that only understands numeric literals, the four basic operators, parentheses, and identifiers that resolve to a real numeric field on the task. Anything else — a function call, an unknown identifier, a stray token, malformed syntax — is rejected outright with a validation error before the field is even saved. There's no code execution surface for a formula string to escape into, because the evaluator was never built to run code in the first place.
That's a deliberate trade-off: you can't write IF() or string manipulation into a WKFGo formula field. What you get in exchange is a formula field that's safe to expose to any user who can edit project settings, not just admins who are trusted with something closer to a scripting console.
Where this actually gets used
- Weighted estimates — a formula field that pads
estimated_timeby a fixed multiplier for external-facing timelines, while the raw estimate stays visible for internal planning. - Portfolio rollups — a rollup field on a parent task summing
story_pointsacross every linked subtask, so a lead can see epic size without expanding it. - Progress-weighted effort —
progress / 100 * story_pointsas a rough "points actually delivered so far" number, useful in a burn-up view without needing a separate calculation each sprint. - Cost-adjacent tracking — a number field for a day rate multiplied by
estimated_timein a formula field, when finance wants a rough cost signal on the board itself rather than a separate spreadsheet. For anything beyond a rough signal, WKFGo's dedicated finance module is the right place — a formula field is a quick estimate, not a ledger.
Setting one up
In Project Settings → Custom Fields, add a field, name it, and pick a type. For rollup, choose the numeric field to aggregate and the aggregation method. For formula, write the expression using the normalized names of existing numeric fields — the same name you gave the field is lowercased, with anything that isn't a Latin letter or digit collapsed to an underscore, so a field named "Day Rate" becomes day_rate in an expression. There's no separate reference name — the field's name is what both shows on the card and what a formula refers to. One practical consequence: a numeric field named entirely in Persian normalizes to nothing usable, so any field you intend to reference from a formula needs at least some Latin characters in its name, even on an otherwise Persian-language board. Required fields and dropdown/multi-select option lists work the same way regardless of whether the field is manual or computed. Computed fields show up wherever regular custom fields do — on the task card and in exports — they're just read-only, since there's nothing for a person to type into them.
Frequently Asked Questions
Can a formula reference another formula field? It can reference any known numeric field, including other custom fields, as long as the reference resolves to a number — but circular references (a formula that depends on itself, directly or through another formula) fail validation rather than looping.
What happens to a rollup if the underlying tasks are deleted? The rollup recalculates from whatever tasks currently match its scope — deleted tasks (including soft-deleted ones in the recycle bin) drop out of the aggregate automatically.
Is there a limit on how many custom fields a project can have? No hard cap, but every field adds a column to task exports and a row to the settings screen — past a couple dozen it becomes a maintenance problem for humans well before it's a performance problem for the database.
Can I change a field's type after tasks already have data in it? Changing type is possible but not lossless — going from text to number, for instance, only keeps values that parse cleanly as numbers. Treat a type change as a one-way migration, not a safe toggle.
Ready to track the numbers your board doesn't show by default?