Atvēršanas un klikšķu izsekošana
GET /tracking: vai ziņojums tika izlasīts un kam tika sekots.
Izpilda jebkuru no 6 izsaukumiem šajā lapā pret jūsu darbvietu, ar jūsu paša atslēgu.
Kas tiek reģistrēts
Divi neatkarīgi slēdži, abi ieslēgti, ja vien tie nav izslēgti adresei, no kuras ziņojums tiek sūtīts, vai visām adresēm (All addresses). opens pievieno 1×1 attēlu; clicks pārraksta saites jaunajā pamatteksta daļā. Citētā vēsture zem atbildes ir kāda cita ziņojums, un tā paliek neaiztikta. Sūtījums var nosaukt tracking: { opens, clicks }, lai izlemtu par vienu ziņojumu (abos virzienos, tāpēc false ir veids, kā programma atsakās no tā, kas adresei uzdots darīt), un izlaists lauks atgriežas pie tās adreses iestatījuma, no kuras sūta, pēc tam pie All addresses, nevis pie noklusējuma, ko šis API izvēlējies darbvietas vietā.
{ "from": "Acme Billing <[email protected]>", "to": ["[email protected]"], "subject": "Your September invoice", "html": "<p>Invoice attached.</p>", "tracking": { "opens": true, "clicks": true } }Vienā ziņojumā tiek pārrakstīti ne vairāk kā 100 galamērķi, katrs vienreiz. Viens un tas pats URL, uz ko norāda galvenes attēls, poga un kājene, ir viena rinda, jo tas ir viens jautājums, uzdots trīs reizes. Pēc ierobežojuma sasniegšanas atlikušās saites paliek tieši tādas, kādas tika uzrakstītas: neizsekota saite joprojām strādā, un ziņojums, kas klusi pazaudē savas pēdējās divsimt saites, ir daudz sliktāka kļūme nekā nepilnīga atskaite.
Pārrakstītās saites un pikselis pēc noklusējuma norāda uz OpenEmail API resursdatoru. Ja sūtītājdomēnam ir pielāgots izsekošanas domēns, kura tracking.status ir active, jaunais pasts no šī domēna izmanto https://<tracking host>/t/..., un iestatīt to var ar PATCH /domains/{id}.
Tam visam ir nepieciešams emails:read, un atsevišķa izsekošanas tvēruma nav. Šis tvērums jau nozīmē "lasīt nosūtītos ziņojumus un to piegādes statusu", un tas, vai kāds ziņojumu atvēra, ir pats burtiskākais iespējamais piegādes statuss.
Galapunkti
| Izsaukums | Atgriež |
|---|---|
| `GET /tracking` | Izsekotie ziņojumi, jaunākie pirmie. opened, clicked, days (1–365, noklusējums 30), limit (maks. 200). |
| `GET /tracking/stats` | Rādītāji par periodu. days (noklusējums 30) un offsetMinutes, lai dienas dalītos tur, kur dalās lasītāja diena. |
| `GET /tracking/{id}` | Viena atskaite. Pieņem tmsg_ izsekošanas id vai msg_ id, ko atgrieza sūtījums. |
| `GET /tracking/{id}/opens` | Atsevišķie pieprasījumi. includeMachine, limit (maks. 200). |
| `GET /tracking/{id}/clicks` | Tas pats, katrā rindā ar linkId un url. |
| `GET /emails/{id}/tracking` | Tā pati atskaite, no sūtījuma id, kas jums jau ir. |
Vaicājuma virknē būla vērtības raksta izvērsti: true, false, 1 vai 0, un viss cits tiek atteikts. Boolean("false") ir true, tāpēc piespiedu kārtā pārveidots ?opened=false atgrieztu tieši pretējo tam, kas prasīts.
Tas ir atsevišķs resurss, nevis daži lauki uz /emails, pārklājuma dēļ: tajā sarakstā ir sūtījumu ieraksti, bet redaktors, MCP rīki un asistents sūta, neveidojot nevienu no tiem. Uz tā balstīta atskaite būtu atskaite par jūsu API datplūsmu, nevis par pastkasti.
Atskaite
{ "object": "tracking", "id": "tmsg_9c1f7b2e4a5d40b8a3e61d2f", "sendId": "msg_c5f21cc6bfec4e848caf905b", "threadId": "thread_2f9b…", "messageId": "<2598…@acme.com>", "subject": "Your September invoice", "from": "[email protected]", "source": "api", "sentAt": "2026-08-29T08:19:08.000Z", "opens": true, "clicks": true, "opened": true, "clicked": true, "attributable": true, "openCount": 3, "openCountRaw": 7, "clickCount": 1, "clickCountRaw": 2, "firstOpenAt": "2026-08-29T09:04:11.000Z", "lastOpenAt": "2026-08-30T07:42:55.000Z", "firstClickAt": "2026-08-29T09:05:02.000Z", "lastClickAt": "2026-08-29T09:05:02.000Z", "recipients": [ { "email": "[email protected]", "kind": "to", "attributed": true, "openCount": 3, "clickCount": 1, "firstOpenAt": "2026-08-29T09:04:11.000Z", "lastOpenAt": "2026-08-30T07:42:55.000Z", "firstClickAt": "2026-08-29T09:05:02.000Z", "lastClickAt": "2026-08-29T09:05:02.000Z" } ], "links": [ { "id": "lnk_4f0a1c8d29b74e6fa3c05d17", "url": "https://acme.com/invoices/42", "label": "View invoice", "clickCount": 1, "clickCountRaw": 2 } ] }opens un clicks ir tas, kas tika PIEMĒROTS ziņojumam; opened un clicked ir tas, kas notika. openCount skaita lasījumus, bet openCountRaw — pieprasījumus. Starpība, šeit četri, ir skeneri un privātuma starpniekserveri; tā tiek saglabāta, lai atstarpe starp žurnālu un kopsummu būtu pārbaudāma, nevis neizskaidrota. attributable ir lauks, kas jāizlasa, pirms kādu nosaukt vārdā: false nozīmē, ka lasījums notika kopijai, kas aizgāja visam sarakstam, un katrs nākamais teikums par konkrētu saņēmēju ir minējums.
source nosauc virsmu, kas to nosūtīja: api — sūtījums caur šo API, composer — viss, ko nosūtīja pati lietotne. Otrajam veidam sendId ir null, un tieši tāpēc pastāv izsekošanas id.
Rinda ar null email un attributed: false ir vieta, kur nonāk lasījums, kuru nevarēja piesaistīt konkrētai personai, un atskaite to rāda tikai tad, kad lasījums patiešām ir noticis. Ziņojumam ar vienu saņēmēju tādas nav vispār, jo viens pamatteksts un viens adresāts ir viens un tas pats apgalvojums. Ziņojumam ar vairākiem tāda ir no pašas nosūtīšanas brīža, jo transports nav noteikts līdz izsūtīšanai, un tā paliek ārpus atskaites, līdz uz tās kaut kas atnāk: pastāvīgs “kāds: nav atvēris” blakus nosauktajiem saņēmējiem ir rinda, kuru var tikai pārprast. Tur, KUR tā ir, nosauktās rindas ir tās, kas stāv uz nulles, un attributable ir false. Lasījums ir īsts, lasītājs ir viens no ziņojuma cilvēkiem, un “kāds no šī ziņojuma” ir vienīgais atveidojums, ko dati atbalsta. Nekad neaizpildiet vārdu pēc saņēmēju saraksta.
Rādītāji par periodu
{ "object": "tracking_stats", "tracked": 128, "trackedForOpens": 128, "trackedForClicks": 47, "opened": 91, "clicked": 34, "openRate": 71.1, "clickRate": 72.3, "totalOpens": 240, "totalClicks": 52, "machineOpens": 173, "medianTimeToOpenSeconds": 2714, "byDay": [{ "day": "2026-08-27", "sent": 12, "opened": 9, "clicked": 3 }], "topLinks": [{ "url": "https://acme.com/pricing", "label": "See pricing", "clickCount": 18 }], "clients": [{ "client": "Gmail", "count": 96 }], "countries": [{ "country": "GB", "count": 71 }] }Rādītāji ir procenti no IZSEKOTAJIEM ziņojumiem, nevis no visa nosūtītā pasta: darbvietai, kas izseko vienu ziņojumu no desmit, ir atvēršanas rādītājs par tiem desmit, un dalīšana ar visu, kas jebkad nosūtīts, kristu ikreiz, kad kāds nosūtītu neizsekotu atbildi. Ziņojums, kas atvērts piecas reizes, ir VIENS atvērts ziņojums. Rādītāji skaita ziņojumus, bet kopsummas — trāpījumus, un šo divu sajaukšana ir tas, kā tiek publicēti atvēršanas rādītāji virs 100 %.
byDay ir rets: diena, kurā nekas netika izsekots, trūkst, nevis ir nulle, tāpēc pirms attēlošanas aizpildiet robus. Dienas tiek grupētas offsetMinutes uz austrumiem no UTC (−840 līdz 840), lai tās dalītos tur, kur dalās lasītāja diena. medianTimeToOpenSeconds ir mediāna, nevis vidējais, jo viens ziņojums, atvērts trīs nedēļas vēlāk, aizvelk vidējo turp, kur nav neviena ziņojuma.
Atsevišķie trāpījumi
{ "object": "list", "data": [ { "object": "open", "id": "opn_1a7c…", "trackedMessageId": "tmsg_9c1f7b2e4a5d40b8a3e61d2f", "recipient": "[email protected]", "kind": "machine", "counted": false, "client": "Apple Mail Privacy Protection", "device": "unknown", "os": "macOS", "country": "GB", "region": "England", "city": "London", "createdAt": "2026-08-29T08:19:11.000Z" } ] }kind ir human, proxy vai machine, un counted norāda, vai tas ietekmēja skaitļus. Mašīnu trāpījumi tiek izslēgti, ja vien nenorādāt includeMachine=true, un tas ir godīgs noklusējums: tie tiek reģistrēti tāpēc, ka to izmešana atstātu neizskaidrojamu robu, nevis tāpēc, ka tā būtu iesaiste.
Atrašanās vieta ir aptuvena, jo nekā cita nav. Nevienam trāpījumam netiek saglabāta IP adrese. Valsts, reģions un pilsēta ir tas, ko mala jau zināja, un vienīgais cits saglabātais identifikators ir jaucējvērtība, kuras sāls mainās katru dienu, tāpēc tā spēj atšķirt divus pieprasījumus vienas dienas ietvaros un nākamajā dienā ir inerta.
Ko skaitļi nevar pateikt
- Apple Mail Privacy Protection piegādes brīdī ielādē katru attēlu katrā ziņojumā neatkarīgi no tā, vai kāds tajā skatās. Tas tiek klasificēts pēc User-Agent un tīkla un reģistrēts kā
machine; tāpat arī viss, kas pienāk desmit sekunžu laikā pēc nosūtīšanas, jo nekas, ko dara cilvēks, nenotiek tik ātri. - Gmail attēlu starpniekserveris ir
proxy, nevismachine: kāds ziņojumu ir parādījis, tātad atvēršana ir īsta, taču ierīce, klients un atrašanās vieta nav zināmi. Starpniekserveris arī kešo, tāpēc otrs lasījums var mūs nemaz nesasniegt. Skaitļi caur Gmail ir apakšējā robeža, nekad kopsumma. - Divi vienas un tās pašas kopijas pieprasījumi trīsdesmit sekunžu laikā ir viens lasījums. Priekšskatījuma rūts pārzīmēšana vai ziņojums, kas atkal ieritināts skatā, attēlu ielādē no jauna; īsts otrs apmeklējums stundu vēlāk joprojām tiek ieskaitīts.
- Lai nosauktu saņēmēju, ziņojumam jābūt pietiekami mazam, lai to pārbūvētu katram cilvēkam atsevišķi: aplēstajam izmēram, reizinātam ar saņēmēju skaitu, jāiekļaujas zem 8 MB. Virs tā visiem aiziet viens pamatteksts, un katrs trāpījums uz tā ir nepiesaistāms.
- Ziņojums ar klikšķiem un bez atvēršanām noteikti ir izlasīts: attēli tiek bloķēti daudz biežāk, nekā saites paliek neuzklikšķinātas. Lasiet abus skaitītājus atsevišķi, nevis saskaitiet tos kopā.
- Klikšķu pieprasīšana pamattekstam bez saitēm nereģistrē pilnīgi neko: aizgājušie baiti ir identiski neizsekotam sūtījumam, un rinda, kas apgalvotu ko citu, nebūtu ne ar ko saskaņojama. Tas pats attiecas uz ziņojumu, kuram nav pamatteksta, ko pārrakstīt.
- OpenEmail izgriež 1×1 attēlus no pasta, ko lasa tā paša lietotāji, ieskaitot pikseli, ko tas pats sūta, un pats reģistrē atvēršanu, kad ziņojums tiek parādīts ar ieslēgtiem attēliem. Šis trāpījums ir
humanar klientuOpenEmail. Ar paslēptiem attēliem netiek reģistrēts nekas.
GET /tracking/{id} un GET /emails/{id}/tracking ziņojumam, kas nekad netika izsekots, atbild ar 404, nevis ar tukšu atskaiti. Frāzes "mēs neko nereģistrējām" un "neviens to neatvēra" ir dažādas atbildes, un tām nedrīkst būt kopīga atbilde. Saraksta galapunktā ir tikai izsekotie ziņojumi, tāpēc neizsekots tajā vienkārši nav, nevis ir ar nullēm.
Kad pasaka, nevis pašam jājautā
Ieskaitīta atvēršana izraisa email.opened, bet ieskaitīts klikšķis — email.clicked katrā abonētajā galapunktā, un abi tiek ierakstīti arī paša ziņojuma notikumu pēdās, ja tas gājis caur šo API. Neviens no tiem neizraisās skenerim vai privātuma starpniekserverim. To izsūtīšana piepildītu saņēmēja žurnālu tieši ar to datplūsmu, kuru klasifikators pastāv, lai neielaistu skaitļos.
Fails, kas aizgāja kā lejupielādes saite, tiek atskaitīts tāpat. Ieskaitīta lejupielāde izraisa email.downloaded un nonāk tajās pašās pēdās, un tas pats klasifikators neielaiž tur skenerus un saišu priekšskatītājus, tāpēc skaitlis ir cilvēki. Slodze nosauc failu (shareId, fileId, filename, mimeType, sizeBytes, url) ar downloadCount, first un downloadedAt blakus klienta un atrašanās vietas laukiem, ko nes klikšķis. recipient vienmēr ir null un attributed vienmēr false: lejupielādes saite ir viens URL visiem ziņojuma saņēmējiem, tāpēc lejupielādi nevar piesaistīt vienam no tiem.
No SDK
const report = await openemail.tracking.get('msg_c5f21cc6bfec…')const cold = await openemail.tracking.list({ days: 30, opened: false })const stats = await openemail.tracking.getStats({ days: 30, offsetMinutes: -new Date().getTimezoneOffset(),})Katrs izsaukums šeit ir vienkārša lasīšana, un klients katru no tiem atkārto atsevišķi. get izmet OpenEmailApiError, kura isNotFound ir true ziņojumam, kas nekad netika izsekots, un tieši šo atšķirību ir vērts saglabāt visur, kur to tālāk padodat.