Statistics

On this page

You can pull your statistics through the API with a program, without opening the cabinet. For example, you can show the numbers on your own dashboard or check your expense against an ad network. The wm app has two functions for this. wm/stats returns daily totals: for the last week by default, or for any period you choose. wm/click puts the same numbers into any other slice: by offers, flows, countries, devices or campaign tags. The rows are the same in both: clicks, orders by phase and status, commission and traffic expense.

The request rules, the token and the response format are described on the General API rules page. For order phases and statuses, see the value reference. In the cabinet, the same numbers are in the “Statistics” section. To learn how to read its columns, see Metrics and formulas.

What you can get#

Find your task in the table. The two right columns show which function to use and what to pass to it.

Task Function What to pass
Daily totals for the last week wm/stats the token only
Daily totals for a given period wm/stats from and to together
Daily totals for one flow or offer wm/stats flow or offer
Which campaigns and creatives bring orders wm/click item=utmc or item=utmn
Which traffic source is best wm/click item=utms
Which subid tags pay off wm/click item=subid
Which countries and devices your traffic comes from wm/click item=geo, item=mobile, item=os, item=browser
Which hours your traffic converts best wm/click item=hour
Which offer, flow or landing is best wm/click item=offer, item=flow, item=site, item=space
Campaigns from one country or one flow only wm/click item=utmc and the geo or flow filter

Which function to use.

Statistics only counts the orders. The orders themselves, each with a status and a decline reason, come from leads/list. Flows and their settings come from wm/flows. Expense gets into statistics from wm/cost or from the cost per click macro in the flow URL.

Period and dates#

Both functions take the period in the from and to parameters. Write dates only as YYYY-MM-DD with hyphens, for example 2026-10-30. A day is taken whole, from 00:00:00 to 23:59:59 in network time. Without parameters you get statistics for seven days: from six days ago through today.

If the period is odd, the functions do not return an error. They adjust it by the rules in the table. So an empty response [] does not always mean “there is no data”.

What you pass Which period is counted
Nothing Seven days: from six days ago to today.
Only from From from to today.
Only to, not older than six days ago From six days ago to to.
Only to, older than six days ago Empty: the default start of the period turns out to be later than the end. Pass from too.
from later than to One day — to.
to in the future to is replaced with today.
A date written without hyphens: 20261030, 2026/10/30, 30.10.2026 The date is not recognized. Such a from is replaced with to, and such a to with today, so the period usually shrinks to one day.
from without a single digit: abc, yesterday The date becomes zero (00000000) and the period starts from the very beginning of the data. Instead of a week you get all days up to to (or up to today).
to without a single digit: abc, yesterday Empty: the end of the period turns out to be earlier than any day, and you get [].

How the functions choose the period.

Pass both dates

For statistics of the past, pass from and to together and write the dates with hyphens. Otherwise there is no error, but the report can come out empty, too short or too long. For example, from=abc returns the whole history.

Counting rules#

  • Both functions work only with your own data. There is no team mode here.
  • Money in the response is the affiliate's commission in the network's main currency at the current rate.
  • Row names come in the language of your cabinet. Where there is no name, the response uses “Not set”. The exception is grouping by flows: clicks and orders of a deleted flow go into a row with id 0 and name equal to false.
  • A click goes into a row by its time and its click tags. An order goes into a row by its creation time and the tags stored in the order itself. Your script or landing sends the order's tags along with the lead (leads/add). So a click and the order created from it can land in different rows: at a day or hour boundary, or when the order came without tags. An order without utm_campaign goes into the “Not set” row, while its clicks go into the row of their campaign.
  • Filters are combined with “and”: the more filters you set, the narrower the selection. A numeric filter turns on only with a nonzero number: 0, an empty value and text do not turn it on. Text filters match the whole value and are case-sensitive (utms=TGADS will not find tgads). There is no search by part of a value. The geo country code ignores case.
  • Click fields (clicks, unique, good and the rest) count every visit, including those cut off by traffic filters (bots, black lists, countries and others). The cabinet does the same by default (Target clicks only). Clean visits are the row with id 0 (“Valid visit”) in the item=filter report. The function has no filter by the filtering result.
  • For past days, the platform takes clicks from daily totals collected by date, offer and flow. Any other grouping and any other filter switches the calculation to the click log. The click log is kept for a limited time: about a year by default, and the Administrator sets the exact term. Orders are counted from the orders themselves and do not depend on how long clicks are kept.
  • The set of fields depends on the network settings. Click fields are in every row, but they are zero if the Administrator has turned off click metrics. The Statistics row section describes which fields come in a row. Read a missing field as zero.
  • Use the JSON format. In XML, the row key becomes the element name (and a numeric key becomes the function name). So a report by tags fails to build in XML if a tag value is empty or contains a space.

Statistics row#

Both functions return rows of the same kind. Click fields are in every row. Order fields come only in rows that have at least one order (except empty hours in item=hour). An order counts in one status and one phase, so the phase counters do not overlap. You can check ct by adding up cw, ch, ca and cc.

Field Description
id Row ID: the value the report is grouped by (date, offer ID, country code, tag text). Matches the row key in the response.
name Row name.
space Number of clicks on prelandings.
suni Number of unique clicks on prelandings.
sgood Number of non-bounce clicks on prelandings.
stime Average time on the prelanding in five-second intervals: multiply by five to get seconds.
clicks Number of clicks on landings.
unique Number of unique clicks on landings.
good Number of non-bounce clicks on landings.
time Average time on the landing, also in five-second intervals.
cw Number of orders in the “Wait” phase.
ch Number of orders in the “Hold” phase.
ca Number of orders in the “Approve” phase.
cc Number of orders in the “Cancel” phase.
cx Number of orders in the “Trash” phase.
ct Number of orders without trash: the sum of the “Wait”, “Hold”, “Approve” and “Cancel” phases.
c2, c4, c5, c10, c12 Number of orders in the main statuses: “Processing” (2), “Hold” (4), “Cancelled” (5), “Completed” (10) and “Deleted” (12). The number in the c<code> field belongs to the status with that code.
mw Commission for orders in the “Wait” phase.
mh Commission for orders in the “Hold” phase.
ma Commission for orders in the “Approve” phase.
mc Commission for orders in the “Cancel” phase.
mx Commission for orders in the “Trash” phase.
mt Commission for orders without trash.
mi Receipts: amounts credited for orders in the “Approve” phase.
mo Expense: negative amounts for orders in the “Approve” phase — write-offs and adjustments. The number is negative.

Main fields of the statistics row.

Order phases for the affiliate are described in the reference.

A unique click is a visitor's first visit to this flow within a day. Repeat visits do not count as unique. A non-bounce click is a visit that lasted at least the bounce time set in the network settings (10 seconds by default). If the flow has no prelanding, the fields space, suni, sgood and stime are zero.

Extra fields#

These fields come together with the main ones. They are filled only in networks that track traffic expense, turn on additional order statuses, and count customer invoices and cost price. In other networks they are zero. The order fields (c1, c3, c6–c9, c11, bills, bill, cost, goal-<code>) are only in rows with orders (except empty hours in item=hour). cpv and cpc are in every row.

Field Description
cpv Number of clicks that have a price set.
cpc Total expense on these clicks in the network's main currency. This is the total, so calculate the cost per click yourself.
c1, c3, c6–c9, c11 Number of orders in the additional statuses: “New order” (1), “Callback” (3), “Packing” (6), “Sending” (7), “Transfer” (8), “Arrived” (9) and “Return” (11). These are detailed steps of order calling and delivery. Not every network uses them.
bills Number of orders that reached the delivery stages: statuses 6 through 11.
bill Total of the customers' invoices for these orders in the network's main currency.
cost Cost price of these orders in the network's main currency.
goal-<code> Breakdown of the row by goal: an object with the fields cw, ch, ca, cc, cx, ma and mh, with the same meaning as in the row itself. It comes when the network has extra statistics by goals set up. <code> is the code of those statistics.

Extra fields of the statistics row.

In the cabinet, the same metrics are in the “Invoice” and “Traffic” column groups: Metrics and formulas.

What to calculate yourself#

The response has no ready-made percentages, so calculate them from the row fields. The network calculates them in its tables like this (base is the larger of suni and unique). If the denominator is zero, the metric is zero.

  • conversion (CR): ct / base * 100
  • average income per click (EPC): (ma + mh) / base
  • approve: (ca + ch) / ct * 100
  • approve including trash: (ca + ch) / (ct + cx) * 100
  • bounce rate on landings: (clicks - good) / clicks * 100
  • bounce rate on prelandings: (space - sgood) / space * 100
  • transitions from prelanding to landing: unique / suni * 100

For the extra fields:

  • average cost per click: cpc / cpv
  • profit on clicks: ma + mh - cpc
  • ROI: (ma + mh) / cpc * 100
  • average invoice: bill / bills
  • profit on invoices: bill - cost
  • buyout: c10 / (c6 + c7 + c8 + c9 + c10 + c11) * 100

The cabinet shows rounded values. It rounds CR and EPC to two decimal places. It shows approve, bounce rate and prelanding transitions as whole numbers and drops the fraction (an approve of 66.7% shows as 66%). The API response holds raw values, so your calculation by the formulas may differ slightly from the cabinet.

wm/statsDaily totals#

GETPOSThttps://lk.dalead.pro/api/wm/stats.json?id={token}

Returns daily totals for a period: clicks, orders by phase and status, commission and expense for each day. There is one grouping, by date. wm/click builds the other slices. The response has the same contents as wm/click with item=date. Only the set of filters and the flow check differ.

To set the period and to see what happens with a wrong date, read Period and dates. Token errors (key, ban) are described in the general rules.

Parameters

ParameterTypeReq.Description
fromdate—Start of the period, YYYY-MM-DD. The day is taken whole, from 00:00:00. Six days ago by default, so with neither date you get statistics for a week.
todate—End of the period, YYYY-MM-DD. The day is taken whole, up to 23:59:59. Today by default. A future date is replaced with today. A start later than the end is replaced with the end. A lone to older than six days ago gives an empty response: pass it together with from.
offerint—Offer ID. Names and IDs are in offer/names.
flowint—Flow ID. Your flows are in wm/flows. The flow must be yours, otherwise the response is access.

Request

Offer statistics for a week
https://lk.dalead.pro/api/wm/stats.json?id={token}&from=2026-10-24&to=2026-10-30&offer=31

Response

JSON
{
  "20261030": {
    "space": 0,
    "suni": 0,
    "sgood": 0,
    "stime": 0,
    "clicks": 13,
    "unique": 0,
    "good": 0,
    "time": 0,
    "cpc": 0,
    "cpv": 0,
    "c1": 0,
    "c2": 12,
    "c3": 0,
    "c4": 0,
    "c5": 0,
    "c6": 0,
    "c7": 0,
    "c8": 0,
    "c9": 0,
    "c10": 0,
    "c11": 0,
    "c12": 0,
    "ca": 0,
    "cw": 12,
    "ch": 0,
    "cc": 0,
    "cx": 0,
    "ct": 12,
    "ma": 0,
    "mw": 144,
    "mh": 0,
    "mc": 0,
    "mx": 0,
    "mt": 144,
    "mi": 0,
    "mo": 0,
    "bill": 0,
    "bills": 0,
    "cost": 0,
    "goal-reg": {
      "cw": 12,
      "ch": 0,
      "ca": 0,
      "cc": 0,
      "cx": 0,
      "ma": 0,
      "mh": 0
    },
    "goal-dep": {
      "cw": 0,
      "ch": 0,
      "ca": 0,
      "cc": 0,
      "cx": 0,
      "ma": 0,
      "mh": 0
    },
    "id": 20261030,
    "name": "2026-10-30"
  }
}
Nothing found
[]
Error: a flow that is not yours or was deleted
{
  "status": "error",
  "error": "access"
}

The response has no status envelope. You get the report itself: an object where the row key is the date as YYYYMMDD. The row fields are described in Statistics row and Extra fields. Rows go from newest to oldest. Days without clicks and orders do not appear in the response, so there may be fewer rows than days in the period. There is no total row, so add up the metrics you need yourself. If nothing matches the filters, you get an empty array [].

Errors come in the usual envelope with a status.

Errors

CodeWhat happenedWhat to do
accessThe flow from the flow filter does not belong to you or does not exist.Take the flow ID from wm/flows.

wm/clickStatistics with grouping#

GETPOSThttps://lk.dalead.pro/api/wm/click.json?id={token}

Returns the same statistics as the daily totals, but groups them by the slice in the item parameter and accepts the full set of filters: offer, flow, landing, prelanding, country, hour and traffic source tags. Use it to build reports by campaign, creative and GEO.

The item parameter is required. Its value is case-sensitive, so write it in lowercase. Without item, or with an unknown value, there is no error and you get an empty array [].

Tags in this function have short names: utms, utmc, utmn, utmt, utmm. The long names such as utm_source, which leads/list accepts, do not work here. The function has no filters by device, browser, operating system, traffic source, domain, customer tag, subid or filtering result. These slices are available only as a grouping. There is no grouping by sub1–sub5. For your own breakdowns, use subid or utm_*.

Period rules are in Period and dates and filter rules are in Counting rules.

Parameters

ParameterTypeReq.Description
itemstringyesThe slice the statistics are grouped by (see the table below).
fromdate—Start of the period, YYYY-MM-DD. The day is taken whole. Six days ago by default.
todate—End of the period, YYYY-MM-DD. Today by default. A future date is replaced with today. A lone to older than six days ago gives an empty response: pass it together with from.
offerint—Offer ID. Names and IDs are in offer/names.
flowint—Flow ID. Your flows are in wm/flows. A flow that is not yours or does not exist causes no error: no record matches the filter, and you get [].
siteint—Landing ID. An offer's landings are in offer/sites.
spaceint—Prelanding ID.
geostring—Two-letter country code, for example ru. Case does not matter. For clicks it is the country by IP address, for orders it is the order's country.
hourint—Hour of the day in network time, a number from 1 to 23. You cannot filter by hour zero. To see it separately, group the statistics by hour.
utmsstring—Value of the utm_source tag.
utmcstring—Value of the utm_campaign tag.
utmnstring—Value of the utm_content tag.
utmtstring—Value of the utm_term tag.
utmmstring—Value of the utm_medium tag.
extustring—Agency only: the order ID on the agency's side.
extsstring—Agency only: the traffic source ID on the agency's side.

What comes in the id and name of a row depends on item. An empty tag value goes into one row: id is empty and name is “Not set”.

item Grouping Row
date Date. id is YYYYMMDD, name is YYYY-MM-DD. Rows go from newest to oldest.
hour Hour of the day in network time. id is a number from 0 to 23, name is an interval like 14:00-14:59. All 24 hours come, including empty ones.
offer Offer. id is the offer ID, name is its name.
flow Flow. id is the flow ID, name is its name. For a deleted flow, id is 0 and name is false: “Not set” is not filled in here.
site Landing. id is the landing ID, name is its address without http://. In a landing row, space is the clicks on the prelandings that led to it.
space Prelanding. id is the prelanding ID, name is its address. In a prelanding row, clicks is the clicks on the landings it led to.
geo Country. id is the two-letter code (zz means an unknown country), name is the country name.
src Traffic source from the network's directory. id is the source ID, name is its name, 0 is “Not set”.
mobile Device type. 0 is “Desktop”, 1 is “Mobile”.
os Operating system. name is Windows, MacOS, Linux, iOS, Android, Windows Mobile, Symbian, BlackBerry or Other.
browser Browser. name is Chrome, Firefox, MSIE, Safari, Opera, Edge, Facebook, Instagram, Tik-Tok, WebView, Bot or Other.
filter Traffic filtering result. 0 is “Valid visit”, 1–8 is the reason the visit was cut off: “Ban: filters”, “Ban: bot”, “Ban: blacklist”, “Ban: country”, “Ban: language”, “Ban: ad click ID”, “Ban: device”, “Ban: trafback”.
subid The subid tag. id and name are the tag value.
utms The utm_source tag. id and name are the tag value.
utmc The utm_campaign tag. id and name are the tag value.
utmn The utm_content tag. id and name are the tag value.
utmt The utm_term tag. id and name are the tag value.
utmm The utm_medium tag. id and name are the tag value.
utmd Link domain: the utm_domain tag, or if there is none, the domain the click went through. id and name are the domain.
utmu Customer tag: the customer (or utm_user) parameter in the link. id and name are the tag value.
extu Agency only: the order ID on the agency's side. id and name are the ID.
exts Agency only: the traffic source ID on the agency's side. id and name are the ID.

Values of the item parameter.

Request

Offer campaigns for a week
https://lk.dalead.pro/api/wm/click.json?id={token}&item=utmc&from=2026-10-24&to=2026-10-30&offer=31
Offer device types
https://lk.dalead.pro/api/wm/click.json?id={token}&item=mobile&offer=31

Response

JSON
{
  "": {
    "space": 0,
    "suni": 0,
    "sgood": 0,
    "stime": 0,
    "clicks": 0,
    "unique": 0,
    "good": 0,
    "time": 0,
    "cpc": 0,
    "cpv": 0,
    "c2": 8,
    "ca": 0,
    "cw": 8,
    "ch": 0,
    "cc": 0,
    "cx": 0,
    "ct": 8,
    "ma": 0,
    "mw": 96,
    "mh": 0,
    "mc": 0,
    "mx": 0,
    "mt": 96,
    "mi": 0,
    "mo": 0,
    "bill": 0,
    "bills": 0,
    "cost": 0,
    "id": "",
    "name": "Not set"
  },
  "cathulhu-ru-01": {
    "space": 0,
    "suni": 0,
    "sgood": 0,
    "stime": 0,
    "clicks": 8,
    "unique": 0,
    "good": 0,
    "time": 0,
    "cpc": 0,
    "cpv": 0,
    "c2": 3,
    "ca": 0,
    "cw": 3,
    "ch": 0,
    "cc": 0,
    "cx": 0,
    "ct": 3,
    "ma": 0,
    "mw": 36,
    "mh": 0,
    "mc": 0,
    "mx": 0,
    "mt": 36,
    "mi": 0,
    "mo": 0,
    "bill": 0,
    "bills": 0,
    "cost": 0,
    "id": "cathulhu-ru-01",
    "name": "cathulhu-ru-01"
  },
  "purr-us-02": {
    "space": 0,
    "suni": 0,
    "sgood": 0,
    "stime": 0,
    "clicks": 5,
    "unique": 0,
    "good": 0,
    "time": 0,
    "cpc": 0,
    "cpv": 0,
    "c2": 1,
    "ca": 0,
    "cw": 1,
    "ch": 0,
    "cc": 0,
    "cx": 0,
    "ct": 1,
    "ma": 0,
    "mw": 12,
    "mh": 0,
    "mc": 0,
    "mx": 0,
    "mt": 12,
    "mi": 0,
    "mo": 0,
    "bill": 0,
    "bills": 0,
    "cost": 0,
    "id": "purr-us-02",
    "name": "purr-us-02"
  }
}
Array of rows: item=mobile
[
  {
    "space": 0,
    "suni": 0,
    "sgood": 0,
    "stime": 0,
    "clicks": 7,
    "unique": 0,
    "good": 0,
    "time": 0,
    "cpc": 0,
    "cpv": 0,
    "c2": 11,
    "ca": 0,
    "cw": 11,
    "ch": 0,
    "cc": 0,
    "cx": 0,
    "ct": 11,
    "ma": 0,
    "mw": 132,
    "mh": 0,
    "mc": 0,
    "mx": 0,
    "mt": 132,
    "mi": 0,
    "mo": 0,
    "bill": 0,
    "bills": 0,
    "cost": 0,
    "id": 0,
    "name": "Desktop"
  },
  {
    "space": 0,
    "suni": 0,
    "sgood": 0,
    "stime": 0,
    "clicks": 6,
    "unique": 0,
    "good": 0,
    "time": 0,
    "cpc": 0,
    "cpv": 0,
    "c2": 1,
    "ca": 0,
    "cw": 1,
    "ch": 0,
    "cc": 0,
    "cx": 0,
    "ct": 1,
    "ma": 0,
    "mw": 12,
    "mh": 0,
    "mc": 0,
    "mx": 0,
    "mt": 12,
    "mi": 0,
    "mo": 0,
    "bill": 0,
    "bills": 0,
    "cost": 0,
    "id": 1,
    "name": "Mobile"
  }
]

The row contents, the formulas and the rules for phases and statuses are the same as in the daily totals: the fields are described in Statistics row and Extra fields. For brevity, the examples omit the zero fields c1, c3–c12 and goal-…. The names “Desktop”, “Mobile” and “Not set” in the examples come from a cabinet set to English. Your names come in the language of your cabinet. In the campaign report, the row with an empty id collects orders without utm_campaign and clicks without this tag. The clicks of such orders are recorded in the rows of their campaigns, so if all clicks came with tags, this row has no clicks. The row itself appears when orders or clicks without a tag come in. There are four differences from the daily totals.

  • The row key and the id and name fields depend on item (the table above).
  • Rows are sorted by name in natural order. There are two exceptions. By date, rows go from newest to oldest. By hour, you always get all 24 hours in order, including hours without clicks and orders. In an hour with no clicks and no orders, the order fields come as zeros, and goal-… is present. In an hour with clicks only, there are no order fields, as in any other row without orders.
  • If the row IDs run in sequence starting from zero, the report comes as an array of rows without keys, not as an object. This happens when you group by hour, device type or filtering result, and also when the report has one row with id equal to 0. Take the value from the id field inside the row. Do not rely on the row key.
  • The function has no error codes of its own. An offer, flow or landing in the filters that is not yours or does not exist causes no error: no record matches, and you get an empty result []. Token errors (key, ban) are described in the general rules.