Progress that is allowed to be negative
A progress bar that cannot go below zero hides the one thing you needed to know. Here is what measuring from a baseline gives you, and what it costs.

Goal progress in Market4 is the fraction of the distance a goal set out to cover, and it is allowed to come back negative. The calculation is the current value minus the baseline, divided by the target minus the baseline, with no clamp at either end. A goal whose metric has fallen below where it started reports a number below zero, and a goal that has overshot reports one above one. Neither is rounded into the nought-to-one range that a progress bar would prefer.
Progress measured from zero congratulates you for work you did before the goal existed. A site sitting at 72 organic clicks that sets a goal of 80 has covered none of the distance on day one, but current divided by target reports ninety per cent — a badly misleading figure, because it is highest exactly when the goal has done nothing yet. Measuring from the baseline puts that same site at zero on day one and moves it only as the metric moves.
The trade is that a baseline-relative fraction has no floor. If the metric drops below where the goal started, the numerator goes negative and so does the answer. Market4 keeps that number rather than flooring it at zero, because a bar pinned at zero cannot tell the difference between a goal that has not started moving and a goal that is going backwards, and those two need different responses from whoever reads the screen.
| Baseline | Current | Target | Progress reported |
|---|---|---|---|
| 40 | 40 | 80 | 0 — nothing covered yet |
| 40 | 60 | 80 | 0.5 — halfway |
| 40 | 90 | 80 | 1.25 — overshot, and shown as overshot |
| 40 | 30 | 80 | -0.25 — below the starting line |
Goal progress returns null — not zero — whenever the honest answer is that it is unknown. There are three such cases in Market4: no baseline was recorded when the goal was set, nothing has been measured since, or the baseline already equals the target. The third is a goal with no distance in it, which is a data entry error rather than a completed goal, and reporting it as finished would be the wrong way to handle it.

Reaching the target marks a goal as reached and leaves it open. Closing is a separate decision with three possible endings, because a number passed through in week two is not a result.

Market4 turns one release note into a changelog page, a blog post, a mail-out and a week of social posts — and then tells you which of them brought anyone back.
Returning null keeps a missing measurement from masquerading as a bad one. A goal showing zero and a goal showing nothing look different on a screen, and only one of them is a reason to go and check whether the connection to the data source is working. This is the same reasoning that stops the baseline from defaulting to zero when it could not be measured: a defaulted baseline would hand a customer ninety per cent progress on their first day and be indistinguishable from a real reading.
Whether reaching a goal means going up or down is a property of the metric rather than of the goal, so Market4 derives it and does not store it. Of the seven goal metrics, six improve upward — organic clicks, organic impressions, sessions, key events, published posts and keywords won — and average position improves downward, because a lower position number means a higher place on the page. A stored direction flag is a field somebody eventually sets wrong, and a goal that reports success when a customer's rankings collapsed is a serious bug in this record.
The arithmetic handles the downward metric without a special case. For an average position goal the distance is target minus baseline, which is negative, and an improvement makes the numerator negative too, so the fraction comes out positive. A ranking that got worse produces two same-signed terms and a negative fraction, exactly as it does for clicks. Only the reached test needs to know the direction, and it asks the question separately: at or below target for average position, at or above target for everything else.
Reaching a goal and closing a goal are separate states in Market4. Progress and the reached test are both computed from the numbers at read time; the status is a decision somebody records. There are four statuses — ACTIVE, ACHIEVED, MISSED and ABANDONED — and the three endings are deliberately not collapsed into one closed state, because they are three different lessons. A goal that was abandoned in week two teaches something a goal that was missed on the deadline does not.
One more separation is worth naming: the goals service in Market4 never fetches the measurement itself. The current value is taken by whoever already had the round trip to Search Console or GA4 in hand and is then handed in to be recorded. That keeps the progress calculation a pure function of four numbers, which is why it can be reasoned about and tested without any network at all.
If the progress is measured from a baseline, yes. Clamping at zero makes a goal that has gone backwards look identical to one that has not started, and those need different responses. The alternative is to show the raw fraction and let the display decide how to draw it — a bar that stops at zero is fine as a drawing, as long as the number underneath it still says minus twenty-five per cent.
Because zero is a measurement and null is the absence of one. A goal reporting zero has been measured and has covered no distance; a goal reporting null could not be measured at all, which usually means the connection to Search Console or GA4 was not working when the goal was created. Collapsing the two would hide a broken integration behind a plausible-looking number.
The same arithmetic covers it with no special case. Average position improves downward, so the target minus the baseline is negative; an improvement makes the current minus the baseline negative too, and dividing one negative by another gives a positive fraction. Only the separate reached test needs the direction, and it checks current at or below target for average position and at or above target for the other six metrics.
Progress returns null. A goal whose baseline already equals its target has no distance in it, so the fraction would be a division by zero. Market4 treats that as a data error rather than as a completed goal, because the alternative — reporting it as finished — would quietly mark a mistyped goal as a success and remove any prompt to go and fix it.
Because achieved, missed and abandoned are three different lessons. A goal that was abandoned says something about how it was chosen; a goal that was missed on its deadline says something about the plan behind it; a goal that was achieved says the approach worked. Collapsing them into closed would delete the record of which of those actually happened.
A consent banner changes what GA4 can measure, and the reports carry no marker saying so. What the seven consent types cover, what basic and advanced consent mode each do when someone declines, and how to read numbers collected under either.

A signup that starts on your marketing site and finishes in your app is two users in GA4 unless the domains are configured together. Here is what the setting does and what it cannot fix.