Configuration and boundaries
Where CCC's dates, floors and defaults are set, and why a figure can be absent because of a configured boundary rather than missing data.
Several questions that look like "the data is missing" are really "a boundary is configured there". This page is where those boundaries live.
They sit in one file, config/settings.json, read on every request. There is no loader and no table, so an edit reaches an environment on the next merge with no install step and no hand migration. An absent key stops the page with a readable error rather than quietly defaulting, which is deliberate: a typo can never read as "no boundary". A key set to null is a real value meaning exactly that.
Every key is listed with its description at /system/settings.
The modern era, and why margin stops at a date
ingest.modernera is 2022-01-01 today. It is the first day CCC imports NetSuite transactions from, and the day after the verkoopdump history stops.
It also does something a reader feels directly: both margin queues skip any transaction dated before it. So an order imported from before 2022 can exist, be visible on a screen, and carry no margin at all. That is not a gap in the calculation, and re-queuing the order will not fix it.
The default activation start for a new rule is calculationrules.startdate, also 2022-01-01, and the seeded rules start within that era. The queue floor is independently enforced; changing a rule window alone does not bypass it.
The two dates are equal today and are separate decisions. Do not assume changing one changes the other.
The other floors
| Key | Is the floor of |
|---|---|
ingest.verkoopdumpfirstorder | The historic transaction backfill, and the per-year order sequence rebuild |
ingest.ns_customerfirstimported | The customer backfill window |
These explain stray old rows. An order dated 2002 is inside the verkoopdump floor and outside the modern era: legitimately imported, legitimately carrying no margin.
Queue windows
| Key | Controls |
|---|---|
ingest.dailyqueuedays | How many days back the daily fan-out queues |
ingest.trailingqueuedays | How many days back the sources that keep adjusting recent days are re-queued: GA4 traffic and the commercetools order discounts |
The second is why a figure from last week can still move. Some upstream sources revise recent days, so CCC re-asks for a trailing window rather than importing each day once.
Screen defaults
| Key | Sets |
|---|---|
pages.transactionsfrom | The default from date on the filtered transaction-style pages |
pages.transactionsto | The default to date on those pages |
pages.rowlimit | The default row limit on those pages |
pages.incomestatementfrom, pages.incomestatementto | The same for the income statement |
The from date is today minus three months today, which is the single most common reason a figure looks absent. See data freshness and history.
Both the page and its data endpoint read these from the same file, so the first page load and the table behind it cannot disagree about dates or the row limit. The multi-select filter defaults are still written out in both places and can still drift.
What is deliberately not configurable
Not every number in the code belongs here, and the ones left behind were left on purpose. Two rules decide.
A number a name already encodes is not configurable, because changing it would make the name lie. The new-product day bands define newproduct_1w through newproduct_6m; the one and two year intervals define customerlife_1y and _2y; the stock day bands define the stock status codes.
A refresh or concurrency heuristic is not a data boundary, so it stays with the code that uses it: the stuck-batch window, the insert chunk size, the upstream token lifetimes and every per-job execution limit, each tuned against a real run.
Related
- Data freshness and history
- Sales orders, whose provenance seam sits at the same date
- Calculation rules
- The settings themselves:
/system/settings
Evidence
Keys, values and descriptions read from config/settings.json. Loader behaviour, the dying absent key and the not-configurable rules from AGENTS.md, Configuration and .env. The modern era floor on both queues from the queueing sites in app/models/batches.php. Basis: code-checked against the current implementation, values as configured locally.
- Type
concept - Status
active - Updated
2026-09-14 - Created
2026-09-14 - Covers
system/settings