Matomo bulk requests account for PHP parsing and field-reader defaults.
The Tracking API records a hit when idsite is the website ID and rec is 1. Event and ecommerce dependencies apply to query hits and observable bulk entries. Exact matomo.php and piwik.php routes are recognized on Matomo Cloud and self-hosted domains.
The pinned matomo_php8 profile models bounded bracket trees, mapped sanitization and field-reader defaults for observable bulk entries. Independent controls execute PHP 8.3.35 with pinned Matomo source. Chronological advice compares explicit parseable cdt timestamps. Unknown deployment context, unsupported query forms and unmapped readers remain explicit gaps.
The official JavaScript tracker reports absent cookie support and browser plugins as 0, and present capabilities as 1. Those optional fields accept both values. Other values remain outside the reviewed producer profile; that format finding does not establish collector rejection.
What this pack matches
Bulk entries retain source-specific decoding.
Entries from body.requests[] reuse this pack's event contracts. Native maps use the bounded matomo_php8 server reader profile; unmapped readers remain informative.
Chronological advice compares only explicit parseable cdt timestamps and warns on a backward step. Missing or unresolved timestamps do not acquire an inferred clock.
{
"source_field": "body.requests[]",
"inherited_params": {
"token_auth": "body.token_auth"
},
"encoding": "url_query",
"inherited_overrides": true,
"native_map": "matomo_php8",
"check_chronological_order": true
}
Rules
Codes are stable. A finding in CI, MCP, or the playground lands on the same id.
| Field | Required | What it checks | Rule ids | Source |
|---|---|---|---|---|
idsite |
required | It is the numeric Matomo site ID the hit is recorded against. The server requires a positive site ID before looking up its account configuration. Minimum numeric value: 1. Fix: Set `idsite` to the website ID from Matomo Administration. | vendor.matomo.param.idsite.missingvendor.matomo.param.idsite.emptyvendor.matomo.param.idsite.invalid |
docs |
rec |
required | Matomo documents `rec=1` as required to record the request. Fix: Set `rec` to `1`. | vendor.matomo.param.rec.missingvendor.matomo.param.rec.emptyvendor.matomo.param.rec.invalid |
docs |
action_name |
recommended | Matomo documents `action_name` as recommended. For page tracks it is the page title. Fix: Set `action_name` to the page title or action name. | vendor.matomo.param.action_name.missingvendor.matomo.param.action_name.empty |
docs |
url |
recommended | Matomo documents `url` as recommended. It is the full URL of the current action. Fix: Send the absolute page URL in `url`. | vendor.matomo.param.url.missingvendor.matomo.param.url.emptyvendor.matomo.param.url.invalid |
docs |
_id |
recommended | Matomo documents `_id` as recommended. It is a 16-character hexadecimal visitor ID. Fix: Send a stable 16-character hex visitor ID in `_id`. | vendor.matomo.param._id.missingvendor.matomo.param._id.emptyvendor.matomo.param._id.invalid |
docs |
rand |
recommended | Matomo documents `rand` as recommended so the request is not cached. Fix: Send a unique `rand` on every hit. | vendor.matomo.param.rand.missingvendor.matomo.param.rand.empty |
docs |
apiv |
recommended | Matomo documents `apiv=1` as the Tracking API version. Fix: Send `apiv=1`. | vendor.matomo.param.apiv.missingvendor.matomo.param.apiv.emptyvendor.matomo.param.apiv.invalid |
docs |
cid |
optional | It forces the visitor ID. Matomo documents `cid` as a 16-character hexadecimal string. Fix: Send a 16-character hex visitor ID in `cid`, or use `_id` / `uid` instead. | vendor.matomo.param.cid.emptyvendor.matomo.param.cid.invalid |
docs |
e_v |
optional | It is the event value. Matomo documents it as a float or integer, not a string label. The official PHP float reader accepts signed decimal and exponent spellings. Fix: Send a number in `e_v`, such as `9.99`. | vendor.matomo.param.e_v.emptyvendor.matomo.param.e_v.invalid |
docs |
e_c |
optional | It is the event category. Matomo documents it as required for event tracking and forbids an empty value. Fix: Set `e_c` to the event category, such as `Videos`. | vendor.matomo.param.e_c.empty |
docs |
e_a |
optional | It is the event action. Matomo documents it as required for event tracking and forbids an empty value. Fix: Set `e_a` to the event action, such as `Play`. | vendor.matomo.param.e_a.empty |
docs |
e_n |
optional | It is the event name. Matomo documents `e_n` as optional and forbids an empty value when it is sent. Fix: Set `e_n` to the event name, or drop the empty pair. | vendor.matomo.param.e_n.empty |
docs |
idgoal |
optional | It is the goal ID. Matomo documents `idgoal=0` as required for ecommerce cart and order hits. | vendor.matomo.param.idgoal.empty |
docs |
ec_id |
optional | It is the unique ecommerce order id. Matomo documents it as required when tracking an ecommerce order. Fix: Set `ec_id` to the order id when `idgoal=0` is an order, not a cart update. | vendor.matomo.param.ec_id.empty |
docs |
revenue |
optional | It is the grand total or goal conversion value. Matomo documents it as required when tracking an ecommerce order. The official PHP float reader accepts signed decimal and exponent spellings. Fix: Set `revenue` to a number, such as `19.99`, with no currency symbol. | vendor.matomo.param.revenue.emptyvendor.matomo.param.revenue.invalid |
docs |
urlref |
optional | It is the HTTP referrer URL. Matomo documents `urlref` as the full referrer used for channel attribution. Fix: Send the absolute referrer URL in `urlref`, or drop the empty pair. | vendor.matomo.param.urlref.emptyvendor.matomo.param.urlref.invalid |
docs |
uid |
optional | It is the User ID. Matomo documents `uid` as any non-empty unique string identifying the logged-in user. Fix: Send the logged-in user id in `uid`, or drop the empty pair. | vendor.matomo.param.uid.empty |
docs |
res |
optional | It is the device resolution. Matomo documents `res` as width x height, such as `1280x1024`. Fix: Send `res` as `WIDTHxHEIGHT` digits, such as `1280x1024`. | vendor.matomo.param.res.emptyvendor.matomo.param.res.invalid |
docs |
h |
optional | It is the current hour in local time. Minimum numeric value: 0. Maximum numeric value: 23. Fix: Send the local hour in `h` as an integer. | vendor.matomo.param.h.emptyvendor.matomo.param.h.invalid |
docs |
m |
optional | It is the current minute in local time. Minimum numeric value: 0. Maximum numeric value: 59. Fix: Send the local minute in `m` as an integer. | vendor.matomo.param.m.emptyvendor.matomo.param.m.invalid |
docs |
s |
optional | It is the current second in local time. Minimum numeric value: 0. Maximum numeric value: 59. Fix: Send the local second in `s` as an integer. | vendor.matomo.param.s.emptyvendor.matomo.param.s.invalid |
docs |
cookie |
optional | The pinned JavaScript tracker sends `1` when cookies are supported and `0` when they are unavailable. The server reads the flag as an integer with default zero. Fix: Send `cookie=1` for cookie support, `cookie=0` for no support, or omit the optional flag. | vendor.matomo.param.cookie.emptyvendor.matomo.param.cookie.invalid |
docs |
new_visit |
optional | If set to `1`, Matomo forces a new visit for this action. Fix: Send `new_visit=1` to force a new visit, or omit the pair. | vendor.matomo.param.new_visit.emptyvendor.matomo.param.new_visit.invalid |
docs |
ping |
optional | If set to `1`, the request is a heartbeat that only updates visit duration. Fix: Send `ping=1` for a heartbeat, or omit the pair. | vendor.matomo.param.ping.emptyvendor.matomo.param.ping.invalid |
docs |
pv_id |
optional | It identifies actions on one page view. Matomo documents `pv_id` as six characters from `[0-9a-Z]`. Fix: Send a six-character alphanumeric `pv_id`, shared by events on the same page view. | vendor.matomo.param.pv_id.emptyvendor.matomo.param.pv_id.invalid |
docs |
search |
optional | It is the site-search keyword. Matomo documents that a hit with `search` is tracked as a site search, not a pageview. Fix: Send the search keyword in `search`, or drop the empty pair. | vendor.matomo.param.search.empty |
docs |
search_count |
optional | It is how many site-search results were shown. Matomo documents `search_count=0` for keywords with no results. Fix: Send the result count in `search_count` as an integer, including `0`. | vendor.matomo.param.search_count.emptyvendor.matomo.param.search_count.invalid |
docs |
pdf… |
optional | The pinned JavaScript tracker sends `1` for a present browser plugin and `0` for an absent plugin. The core server reads these supported plugin flags as integers with default zero. Fix: Send `1` for a present plugin, `0` for an absent plugin, or omit the optional flag. | vendor.matomo.param.pdf.emptyvendor.matomo.param.pdf.invalid |
docs |
c_n |
optional | It is the content name. Matomo documents `c_n` on content impressions and interactions. Fix: Send the content name in `c_n`, such as `Ad Foo Bar`. | vendor.matomo.param.c_n.empty |
docs |
c_p |
optional | It is the content piece. Matomo documents `c_p` as the path to the image, video, audio, or text. Fix: Send the content piece in `c_p`, or drop the empty pair. | vendor.matomo.param.c_p.empty |
docs |
c_t |
optional | It is the content target. Matomo documents `c_t` as the landing-page URL. Fix: Send an absolute landing URL in `c_t`, or drop the empty pair. | vendor.matomo.param.c_t.emptyvendor.matomo.param.c_t.invalid |
docs |
c_i |
optional | It is the content interaction, such as `click`. Matomo documents `c_i` together with `c_n`. Fix: Send the interaction name in `c_i`, such as `click`. | vendor.matomo.param.c_i.empty |
docs |
ec_items |
optional | It is the JSON array of cart or order rows. Matomo documents each row as sku, name, category, price, quantity. Fix: Send `ec_items` as a JSON array of item rows, such as `["sku","name","cat",11.11,2]`. | docs | |
ec_st |
optional | It is the ecommerce subtotal, excluding shipping. The official PHP float reader accepts signed decimal and exponent spellings. Fix: Send `ec_st` as a number, with no currency symbol. | vendor.matomo.param.ec_st.emptyvendor.matomo.param.ec_st.invalid |
docs |
ec_tx |
optional | It is the tax amount of the ecommerce order. The official PHP float reader accepts signed decimal and exponent spellings. Fix: Send `ec_tx` as a number, with no currency symbol. | vendor.matomo.param.ec_tx.emptyvendor.matomo.param.ec_tx.invalid |
docs |
ec_sh |
optional | It is the shipping cost of the ecommerce order. The official PHP float reader accepts signed decimal and exponent spellings. Fix: Send `ec_sh` as a number, with no currency symbol. | vendor.matomo.param.ec_sh.emptyvendor.matomo.param.ec_sh.invalid |
docs |
ec_dt |
optional | It is the discount offered on the ecommerce order. The official PHP float reader accepts signed decimal and exponent spellings. Fix: Send `ec_dt` as a number, with no currency symbol. | vendor.matomo.param.ec_dt.emptyvendor.matomo.param.ec_dt.invalid |
docs |
_pkc |
optional | It is the category of the product being viewed. Fix: Send the product category in `_pkc`, or drop the empty pair. | vendor.matomo.param._pkc.empty |
docs |
_pks |
optional | It is the SKU of the product being viewed. Fix: Send the product SKU in `_pks`, or drop the empty pair. | vendor.matomo.param._pks.empty |
docs |
_pkn |
optional | It is the name of the product being viewed. Fix: Send the product name in `_pkn`, or drop the empty pair. | vendor.matomo.param._pkn.empty |
docs |
_pkp |
optional | It is the price of the product being viewed. The official PHP float reader accepts signed decimal and exponent spellings. Fix: Send `_pkp` as a number, with no currency symbol. | vendor.matomo.param._pkp.emptyvendor.matomo.param._pkp.invalid |
docs |
pf_net… |
optional | It is a page-performance metric in milliseconds. Matomo documents `pf_net`, `pf_srv`, `pf_tfr`, `pf_dm1`, `pf_dm2`, and `pf_onl`. Fix: Send the timing in milliseconds as an integer, such as `142`. | vendor.matomo.param.pf_net.emptyvendor.matomo.param.pf_net.invalid |
docs |
link |
optional | It is an outlink URL. Matomo documents `link` for tracking outbound clicks. Fix: Send an absolute URL in `link`. Matomo also recommends repeating it in `url`. | vendor.matomo.param.link.emptyvendor.matomo.param.link.invalid |
docs |
download |
optional | It is the URL of a file the user downloaded. Fix: Send an absolute file URL in `download`. Matomo also recommends repeating it in `url`. | vendor.matomo.param.download.emptyvendor.matomo.param.download.invalid |
docs |
search_cat |
optional | It is the site-search category. Matomo documents `search_cat` as optional when `search` is specified. Fix: Send the search category in `search_cat`, or drop the empty pair. | vendor.matomo.param.search_cat.empty |
docs |
ua |
optional | It is an override for the User-Agent HTTP header. Matomo uses it to detect the operating system and browser. Fix: Send the full user-agent string in `ua`, or drop the empty pair. | vendor.matomo.param.ua.empty |
docs |
lang |
optional | It is an override for the Accept-Language HTTP header. Matomo uses it to detect country when GeoIP is not enabled. Fix: Send the Accept-Language value in `lang`, or drop the empty pair. | vendor.matomo.param.lang.empty |
docs |
cs |
optional | It is the charset of the page being tracked. Matomo defaults to `utf-8`. Fix: Send the page charset in `cs` when it is not `utf-8`, or drop the empty pair. | vendor.matomo.param.cs.empty |
docs |
ca |
optional | It marks a custom action that is not a page view. Matomo documents `ca=1` on events and on Crash Analytics hits. Fix: Send `ca=1` on a non-pageview hit, or omit the pair. Do not send it with `ping=1`. | vendor.matomo.param.ca.emptyvendor.matomo.param.ca.invalid |
docs |
_rcn |
optional | It is the campaign name used to attribute goal conversions, not visits. Fix: Send the campaign name in `_rcn`, or drop the empty pair. | vendor.matomo.param._rcn.empty |
docs |
_rck |
optional | It is the campaign keyword used to attribute goal conversions, not visits. Fix: Send the campaign keyword in `_rck`, or drop the empty pair. | vendor.matomo.param._rck.empty |
docs |
_cvar… |
optional | It is a JSON object. Matomo documents `_cvar` as visit-scope custom variables, `cvar` as page-scope custom variables, and `uadata` as Client Hints. Fix: Send a JSON object, such as `{"1":["OS","iphone 5.0"]}`. | docs | |
recMode |
optional | It selects visit vs bot tracking. Matomo documents `1` as bot only and `2` as auto. Omit it for visit-only tracking. Fix: Send `recMode=1` or `recMode=2`, or omit the pair for visit-only tracking. | vendor.matomo.param.recMode.emptyvendor.matomo.param.recMode.invalid |
docs |
bots |
optional | If set to `1`, Matomo tracks a detected bot as a normal visit. Matomo documents `bots=1` only when `recMode` is omitted. Fix: Send `bots=1` without `recMode`, or omit the pair. | vendor.matomo.param.bots.emptyvendor.matomo.param.bots.invalid |
docs |
http_status… |
optional | It is bot-tracking telemetry. Matomo documents `http_status` as the HTTP status code and `bw_bytes` as bytes transferred. Fix: Send `http_status` or `bw_bytes` as an integer. | vendor.matomo.param.http_status.emptyvendor.matomo.param.http_status.invalid |
docs |
source |
optional | It is a source label for a bot request, such as `Cloudflare`. Fix: Send a source label in `source`, or drop the empty pair. | vendor.matomo.param.source.empty |
docs |
cra |
optional | It is the crash error message. Matomo documents `cra` as required on a Crash Analytics hit. Fix: Send the error message in `cra`, and send `ca=1`. | vendor.matomo.param.cra.empty |
docs |
cra_st… |
optional | It is optional crash metadata. Matomo documents `cra_st` as the stack trace, `cra_ct` as the category, `cra_tp` as the error type, and `cra_ru` as the source-file URI. Fix: Fill the crash field, or drop the empty pair. | vendor.matomo.param.cra_st.empty |
docs |
cra_rl… |
optional | It is the source location of the crash. Matomo documents `cra_rl` as the line number and `cra_rc` as the column. Fix: Send `cra_rl` or `cra_rc` as an integer. | vendor.matomo.param.cra_rl.emptyvendor.matomo.param.cra_rl.invalid |
docs |
dimension1… |
optional | It is a custom dimension. Matomo documents `dimension1` through `dimension999`. Maximum decoded UTF-8 bytes: 255. Fix: Fill the custom dimension, or drop the empty pair. | vendor.matomo.param.dimension1.emptyvendor.matomo.param.dimension1.invalid |
docs |
_idts |
optional | The vendor documents `_idts` in the request contract. | vendor.matomo.param._idts.emptyvendor.matomo.param._idts.invalid |
docs |
_idvc |
optional | The vendor documents `_idvc` in the request contract. | vendor.matomo.param._idvc.emptyvendor.matomo.param._idvc.invalid |
docs |
_viewts |
optional | The vendor documents `_viewts` in the request contract. | vendor.matomo.param._viewts.emptyvendor.matomo.param._viewts.invalid |
docs |
_ects |
optional | The vendor documents `_ects` in the request contract. | vendor.matomo.param._ects.emptyvendor.matomo.param._ects.invalid |
docs |
_refts |
optional | The vendor documents `_refts` in the request contract. | vendor.matomo.param._refts.emptyvendor.matomo.param._refts.invalid |
docs |
pf_srv |
optional | The vendor documents `pf_srv` in the request contract. | vendor.matomo.param.pf_srv.emptyvendor.matomo.param.pf_srv.invalid |
docs |
pf_tfr |
optional | The vendor documents `pf_tfr` in the request contract. | vendor.matomo.param.pf_tfr.emptyvendor.matomo.param.pf_tfr.invalid |
docs |
pf_dm1 |
optional | The vendor documents `pf_dm1` in the request contract. | vendor.matomo.param.pf_dm1.emptyvendor.matomo.param.pf_dm1.invalid |
docs |
pf_dm2 |
optional | The vendor documents `pf_dm2` in the request contract. | vendor.matomo.param.pf_dm2.emptyvendor.matomo.param.pf_dm2.invalid |
docs |
pf_onl |
optional | The vendor documents `pf_onl` in the request contract. | vendor.matomo.param.pf_onl.emptyvendor.matomo.param.pf_onl.invalid |
docs |
pf_blr |
optional | The vendor documents `pf_blr` in the request contract. | vendor.matomo.param.pf_blr.emptyvendor.matomo.param.pf_blr.invalid |
docs |
bw_bytes |
optional | The vendor documents `bw_bytes` in the request contract. | vendor.matomo.param.bw_bytes.emptyvendor.matomo.param.bw_bytes.invalid |
docs |
cra_rc |
optional | The vendor documents `cra_rc` in the request contract. | vendor.matomo.param.cra_rc.emptyvendor.matomo.param.cra_rc.invalid |
docs |
ag |
optional | The vendor documents `ag` in the request contract. | vendor.matomo.param.ag.emptyvendor.matomo.param.ag.invalid |
docs |
gears |
optional | The vendor documents `gears` in the request contract. | vendor.matomo.param.gears.emptyvendor.matomo.param.gears.invalid |
docs |
java |
optional | The vendor documents `java` in the request contract. | vendor.matomo.param.java.emptyvendor.matomo.param.java.invalid |
docs |
fla |
optional | The vendor documents `fla` in the request contract. | vendor.matomo.param.fla.emptyvendor.matomo.param.fla.invalid |
docs |
qt |
optional | The vendor documents `qt` in the request contract. | vendor.matomo.param.qt.emptyvendor.matomo.param.qt.invalid |
docs |
realp |
optional | The vendor documents `realp` in the request contract. | vendor.matomo.param.realp.emptyvendor.matomo.param.realp.invalid |
docs |
wma |
optional | The vendor documents `wma` in the request contract. | vendor.matomo.param.wma.emptyvendor.matomo.param.wma.invalid |
docs |
dir |
optional | The vendor documents `dir` in the request contract. | vendor.matomo.param.dir.emptyvendor.matomo.param.dir.invalid |
docs |
send_image |
optional | The vendor documents `send_image` in the request contract. | vendor.matomo.param.send_image.emptyvendor.matomo.param.send_image.invalid |
docs |
queuedtracking |
optional | The vendor documents `queuedtracking` in the request contract. | vendor.matomo.param.queuedtracking.emptyvendor.matomo.param.queuedtracking.invalid |
docs |
country |
optional | The vendor documents `country` in the request contract. | vendor.matomo.param.country.emptyvendor.matomo.param.country.invalid |
docs |
region |
optional | The vendor documents `region` in the request contract. | vendor.matomo.param.region.empty |
docs |
city |
optional | The vendor documents `city` in the request contract. | vendor.matomo.param.city.empty |
docs |
token_auth |
optional | The vendor documents `token_auth` in the request contract. | vendor.matomo.param.token_auth.empty |
docs |
cra_ct |
optional | The vendor documents `cra_ct` in the request contract. | vendor.matomo.param.cra_ct.empty |
docs |
cra_tp |
optional | The vendor documents `cra_tp` in the request contract. | vendor.matomo.param.cra_tp.empty |
docs |
cra_ru |
optional | The vendor documents `cra_ru` in the request contract. | vendor.matomo.param.cra_ru.empty |
docs |
lat |
optional | The vendor documents `lat` in the request contract. Minimum numeric value: -90. Maximum numeric value: 90. | vendor.matomo.param.lat.emptyvendor.matomo.param.lat.invalid |
docs |
long |
optional | The vendor documents `long` in the request contract. Minimum numeric value: -180. Maximum numeric value: 180. | vendor.matomo.param.long.emptyvendor.matomo.param.long.invalid |
docs |
cip |
optional | The vendor documents `cip` in the request contract. | vendor.matomo.param.cip.empty |
docs |
cdt |
optional | The vendor documents `cdt` in the request contract. | vendor.matomo.param.cdt.empty |
docs |
cvar |
optional | Matomo documents this URL-encoded JSON parameter. | docs | |
uadata |
optional | Matomo documents this URL-encoded JSON parameter. | docs | |
ma_id |
optional | Presence diagnostic severity: error. Value diagnostic severity: error. | vendor.matomo.param.ma_id.empty |
docs |
ma_re |
optional | Presence diagnostic severity: error. Value diagnostic severity: error. | vendor.matomo.param.ma_re.emptyvendor.matomo.param.ma_re.invalid |
docs |
ma_mt |
optional | Presence diagnostic severity: error. Value diagnostic severity: error. | vendor.matomo.param.ma_mt.emptyvendor.matomo.param.ma_mt.invalid |
docs |
ma_ti |
optional | Presence diagnostic severity: error. Value diagnostic severity: error. | vendor.matomo.param.ma_ti.empty |
docs |
ma_pn |
optional | Presence diagnostic severity: error. Value diagnostic severity: error. | vendor.matomo.param.ma_pn.empty |
docs |
ma_st |
optional | Presence diagnostic severity: error. Value diagnostic severity: error. | vendor.matomo.param.ma_st.emptyvendor.matomo.param.ma_st.invalid |
docs |
ma_le |
optional | Presence diagnostic severity: error. Value diagnostic severity: error. | vendor.matomo.param.ma_le.emptyvendor.matomo.param.ma_le.invalid |
docs |
ma_ps |
optional | Presence diagnostic severity: error. Value diagnostic severity: error. | vendor.matomo.param.ma_ps.emptyvendor.matomo.param.ma_ps.invalid |
docs |
ma_ttp |
optional | Presence diagnostic severity: error. Value diagnostic severity: error. | vendor.matomo.param.ma_ttp.emptyvendor.matomo.param.ma_ttp.invalid |
docs |
ma_w |
optional | Presence diagnostic severity: error. Value diagnostic severity: error. | vendor.matomo.param.ma_w.emptyvendor.matomo.param.ma_w.invalid |
docs |
ma_h |
optional | Presence diagnostic severity: error. Value diagnostic severity: error. | vendor.matomo.param.ma_h.emptyvendor.matomo.param.ma_h.invalid |
docs |
ma_fs |
optional | Presence diagnostic severity: error. Value diagnostic severity: error. | vendor.matomo.param.ma_fs.emptyvendor.matomo.param.ma_fs.invalid |
docs |
ma_se |
optional | Presence diagnostic severity: error. Value diagnostic severity: error. | vendor.matomo.param.ma_se.emptyvendor.matomo.param.ma_se.invalid |
docs |
event_requires_action |
required | The hit sends an event category `e_c` without an event action `e_a`. Matomo documents both as required for event tracking. Fix: Set `e_a` to the event action, such as `Play`. | vendor.matomo.event_requires_action |
docs |
order_requires_revenue |
required | Matomo ecommerce orders require a grand total in revenue and idgoal=0. Fix: Set `revenue` to the order grand total, and set `idgoal=0`. | vendor.matomo.order_requires_revenue |
docs |
content_interaction_requires_name |
required | The hit sends a content interaction `c_i` without a content name `c_n`. Matomo documents both on a content interaction. Fix: Set `c_n` to the same content name as the impression, such as `Ad Foo Bar`. | vendor.matomo.content_interaction_requires_name |
docs |
ca_forbids_ping |
required | The hit sends `ca` with `ping=1`. Matomo documents custom action as incompatible with a heartbeat. Fix: Drop `ca` from a heartbeat, or drop `ping=1` from a custom action. | vendor.matomo.ca_forbids_ping |
docs |
bot_requires_ua |
required | The hit sets `recMode=1` without `ua`. Matomo documents the user-agent as required for bot-only tracking. Fix: Send the full user-agent string in `ua`. | vendor.matomo.bot_requires_ua |
docs |
bots_forbids_recMode |
required | The hit sends `bots=1` with `recMode`. Matomo documents `bots=1` only in visit-only mode, when `recMode` is omitted. Fix: Drop `bots`, or drop `recMode`. | vendor.matomo.bots_forbids_recMode |
docs |
crash_requires_ca |
required | The hit sends a crash message `cra` without `ca=1`. Matomo documents `ca=1` as required on a Crash Analytics hit. Fix: Send `ca=1` with `cra`. | vendor.matomo.crash_requires_ca |
docs |
override_ip_needs_auth |
required | The request does not satisfy the documented override ip needs auth requirement. | vendor.matomo.override_ip_needs_auth |
docs |
ec_id_ecommerce_goal |
required | Ecommerce orders and cart updates require idgoal=0. | vendor.matomo.ec_id_ecommerce_goal |
docs |
ec_items_ecommerce_goal |
required | Ecommerce orders and cart updates require idgoal=0. | vendor.matomo.ec_items_ecommerce_goal |
docs |
ecommerce_requires_goal |
required | Ecommerce orders and cart updates require idgoal=0. | vendor.matomo.ecommerce_requires_goal |
docs |
bot_requires_url |
required | Bot-only tracking requires a page URL or a download URL. | vendor.matomo.bot_requires_url |
docs |
media_requires_identity_resource_type |
required | Media Analytics tracking requires ma_id, ma_re and ma_mt. | vendor.matomo.media_requires_identity_resource_type |
docs |
cdt_timestamp_format |
required | cdt uses a UTC YYYY-MM-DD HH:MM:SS datetime or a Unix timestamp. | vendor.matomo.cdt_timestamp_format |
docs |
cdt_calendar |
required | cdt must be a valid calendar datetime. | vendor.matomo.cdt_calendar |
docs |
cdt_old_requires_auth |
required | cdt older than24hours requires token_auth. | vendor.matomo.cdt_old_requires_auth |
docs |
cdt_old_datetime_requires_auth |
required | cdt older than24hours requires token_auth. | vendor.matomo.cdt_old_datetime_requires_auth |
docs |
root |
optional | Decoded body source: _cvar. Encoding: json. Native JSON type: object. | vendor.matomo.body.root.invalid |
docs |
invalid_slots… |
forbidden | A custom variable slot uses a positive numeric index. The default slot count is configurable. Decoded body source: _cvar. Encoding: json. | vendor.matomo.body.invalid_slots.forbidden |
docs |
variable_slots… |
optional | Each custom variable slot is a two-element name/value array. Decoded body source: _cvar. Encoding: json. Native JSON type: array. Minimum array items: 2. Maximum array items: 2. | vendor.matomo.body.variable_slots.invalid |
docs |
*[] |
optional | Each custom variable name and value is a string of at most 200 characters. Empty strings can remove a variable. Decoded body source: _cvar. Encoding: json. Native JSON type: string. Maximum decoded characters: 200. | vendor.matomo.body.*[].invalid |
docs |
root |
optional | Decoded body source: cvar. Encoding: json. Native JSON type: object. | vendor.matomo.body.root.invalid |
docs |
invalid_slots… |
forbidden | A custom variable slot uses a positive numeric index. The default slot count is configurable. Decoded body source: cvar. Encoding: json. | vendor.matomo.body.invalid_slots.forbidden |
docs |
variable_slots… |
optional | Each custom variable slot is a two-element name/value array. Decoded body source: cvar. Encoding: json. Native JSON type: array. Minimum array items: 2. Maximum array items: 2. | vendor.matomo.body.variable_slots.invalid |
docs |
*[] |
optional | Each custom variable name and value is a string of at most 200 characters. Empty strings can remove a variable. Decoded body source: cvar. Encoding: json. Native JSON type: string. Maximum decoded characters: 200. | vendor.matomo.body.*[].invalid |
docs |
root |
optional | Decoded body source: ec_items. Encoding: json. Native JSON type: array. | vendor.matomo.body.root.invalid |
docs |
[] |
optional | Ecommerce items are positional arrays, with required SKU and up to four further fields. Decoded body source: ec_items. Encoding: json. Native JSON type: array. Minimum array items: 1. Maximum array items: 5. | vendor.matomo.body.[].invalid |
docs |
root |
optional | Matomo accepts JSON-encoded User-Agent Client Hints. Decoded body source: uadata. Encoding: json. Native JSON type: object. | vendor.matomo.body.root.invalid |
docs |
architecture |
optional | Decoded body source: uadata. Encoding: json. Native JSON type: string. | vendor.matomo.body.architecture.invalid |
docs |
bitness |
optional | Decoded body source: uadata. Encoding: json. Native JSON type: string. | vendor.matomo.body.bitness.invalid |
docs |
model |
optional | Decoded body source: uadata. Encoding: json. Native JSON type: string. | vendor.matomo.body.model.invalid |
docs |
platform |
optional | Decoded body source: uadata. Encoding: json. Native JSON type: string. | vendor.matomo.body.platform.invalid |
docs |
platformVersion |
optional | Decoded body source: uadata. Encoding: json. Native JSON type: string. | vendor.matomo.body.platformVersion.invalid |
docs |
uaFullVersion |
optional | Decoded body source: uadata. Encoding: json. Native JSON type: string. | vendor.matomo.body.uaFullVersion.invalid |
docs |
mobile |
optional | Decoded body source: uadata. Encoding: json. Native JSON type: boolean. | vendor.matomo.body.mobile.invalid |
docs |
wow64 |
optional | Decoded body source: uadata. Encoding: json. Native JSON type: boolean. | vendor.matomo.body.wow64.invalid |
docs |
brands |
optional | Decoded body source: uadata. Encoding: json. Native JSON type: array. | vendor.matomo.body.brands.invalid |
docs |
fullVersionList |
optional | Decoded body source: uadata. Encoding: json. Native JSON type: array. | vendor.matomo.body.fullVersionList.invalid |
docs |
formFactors |
optional | Decoded body source: uadata. Encoding: json. Native JSON type: array. | vendor.matomo.body.formFactors.invalid |
docs |
brands[] |
optional | Decoded body source: uadata. Encoding: json. Native JSON type: object. | vendor.matomo.body.brands[].invalid |
docs |
fullVersionList[] |
optional | Decoded body source: uadata. Encoding: json. Native JSON type: object. | vendor.matomo.body.fullVersionList[].invalid |
docs |
formFactors[] |
optional | Decoded body source: uadata. Encoding: json. Native JSON type: string. | vendor.matomo.body.formFactors[].invalid |
docs |
[0] |
required | SKU is required. The official tracker accepts string-like IDs and joins array-valued SKUs. Body scope: []. Decoded body source: ec_items. Encoding: json. Native JSON type: string or number or array. | vendor.matomo.body.[0].missingvendor.matomo.body.[0].emptyvendor.matomo.body.[0].invalid |
docs |
[1] |
optional | Body scope: []. Decoded body source: ec_items. Encoding: json. Native JSON type: string or number or array. | vendor.matomo.body.[1].invalid |
docs |
[2] |
optional | An item category can be a string or up to five categories. Body scope: []. Decoded body source: ec_items. Encoding: json. Native JSON type: string or array. Maximum array items: 5. | vendor.matomo.body.[2].invalid |
docs |
[2][] |
optional | Body scope: []. Decoded body source: ec_items. Encoding: json. Native JSON type: string. | vendor.matomo.body.[2][].invalid |
docs |
[3] |
optional | The official tracker accepts numeric item prices, including numeric strings. Body scope: []. Decoded body source: ec_items. Encoding: json. Native JSON type: number or string. | vendor.matomo.body.[3].emptyvendor.matomo.body.[3].invalid |
docs |
[4] |
optional | The official tracker accepts numeric quantities and converts them to an integer. Body scope: []. Decoded body source: ec_items. Encoding: json. Native JSON type: number or string. | vendor.matomo.body.[4].emptyvendor.matomo.body.[4].invalid |
docs |
root |
optional | Body scope: brands[]. Decoded body source: uadata. Encoding: json. Native JSON type: object. | vendor.matomo.body.root.invalid |
docs |
brand |
required | Body scope: brands[]. Decoded body source: uadata. Encoding: json. Native JSON type: string. | vendor.matomo.body.brand.missingvendor.matomo.body.brand.invalid |
docs |
version |
required | Body scope: brands[]. Decoded body source: uadata. Encoding: json. Native JSON type: string. | vendor.matomo.body.version.missingvendor.matomo.body.version.invalid |
docs |
root |
optional | Body scope: fullVersionList[]. Decoded body source: uadata. Encoding: json. Native JSON type: object. | vendor.matomo.body.root.invalid |
docs |
brand |
required | Body scope: fullVersionList[]. Decoded body source: uadata. Encoding: json. Native JSON type: string. | vendor.matomo.body.brand.missingvendor.matomo.body.brand.invalid |
docs |
version |
required | Body scope: fullVersionList[]. Decoded body source: uadata. Encoding: json. Native JSON type: string. | vendor.matomo.body.version.missingvendor.matomo.body.version.invalid |
docs |
method |
required | The Tracking HTTP API accepts GET or POST. Complete HTTP capture contract. | vendor.matomo.http.method.missingvendor.matomo.http.method.emptyvendor.matomo.http.method.invalid |
docs |
body_encoding |
optional | Complete HTTP capture contract. Applies when {"kind":"any","conditions":[{"kind":"present","param":"body.requests"},{"kind":"value_in","param":"body_encoding","values":["json"]}]}. | docs | |
bulk_method |
required | Bulk Tracking requires HTTP POST. Complete HTTP capture contract. Applies when {"kind":"any","conditions":[{"kind":"present","param":"body.requests"},{"kind":"value_in","param":"body_encoding","values":["json"]}]}. | vendor.matomo.http.bulk_method.missingvendor.matomo.http.bulk_method.emptyvendor.matomo.http.bulk_method.invalid |
docs |
body |
required | A bulk request uses a JSON object envelope. Complete HTTP capture contract. Applies when {"kind":"any","conditions":[{"kind":"present","param":"body.requests"},{"kind":"value_in","param":"body_encoding","values":["json"]}]}. Native JSON type: object. | vendor.matomo.http.body.missingvendor.matomo.http.body.invalid |
docs |
body.requests |
required | Published API examples use a JSON array. The pinned PHP8 parser decodes objects as associative arrays and iterates their members identically. Empty collections are accepted without an invented minimum count. Complete HTTP capture contract. Applies when {"kind":"any","conditions":[{"kind":"present","param":"body.requests"},{"kind":"value_in","param":"body_encoding","values":["json"]}]}. Native JSON type: array or object. | vendor.matomo.http.body.requests.missingvendor.matomo.http.body.requests.invalid |
docs |
body.token_auth |
optional | The outer bulk token uses the official PHP string reader. Empty, false, null and the PHP-empty string 0 permit per-item fallback. Permission checks remain external. Complete HTTP capture contract. Applies when {"kind":"any","conditions":[{"kind":"present","param":"body.requests"},{"kind":"value_in","param":"body_encoding","values":["json"]}]}. | docs | |
root |
optional | The pinned PHP8 server accepts query strings and native parameter maps. Non-array scalars become empty requests, and empty maps/arrays are ignored. Native fields use the opt-in source-backed reader; unknown plugin or precision-sensitive conversions remain explicit information findings. Complete HTTP capture contract. Capture scope: body.requests[]. Native JSON type: string or object or array or number or boolean or null. | vendor.matomo.http.root.invalid |
docs |
Validate a payload
pixellint validate url "$ARTIFACT" --rulepack vendor/matomo
Try this failing payload in the playground. Matomo Cloud hit missing idsite.
https://example.matomo.cloud/matomo.php?rec=1
cargo install pixellint
·
npm install pixellint