@koda-sl/baker-cli 0.512.0 → 0.514.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -3
- package/dist/account-D6LEVVWT.js +82 -0
- package/dist/account-D6LEVVWT.js.map +1 -0
- package/dist/account-SGK3IJ6N.js +82 -0
- package/dist/account-SGK3IJ6N.js.map +1 -0
- package/dist/account-assets-J5Z4URLQ.js +290 -0
- package/dist/account-level-4SBYYHRS.js +611 -0
- package/dist/account-level-4SBYYHRS.js.map +1 -0
- package/dist/account-reads-2MSUVG46.js +219 -0
- package/dist/account-users-MHC7AD6K.js +64 -0
- package/dist/account-users-MHC7AD6K.js.map +1 -0
- package/dist/account-writes-QQQC54WC.js +68 -0
- package/dist/account-writes-QQQC54WC.js.map +1 -0
- package/dist/accounts-2O6I7YBN.js +80 -0
- package/dist/accounts-2O6I7YBN.js.map +1 -0
- package/dist/accounts-QNE5QWBG.js +701 -0
- package/dist/accounts-QNE5QWBG.js.map +1 -0
- package/dist/actions-D7OWCP36.js +55 -0
- package/dist/activecampaign-LBS4M4C4.js +938 -0
- package/dist/activecampaign-LBS4M4C4.js.map +1 -0
- package/dist/ad-group-writes-CJTTUUIT.js +172 -0
- package/dist/ad-group-writes-CJTTUUIT.js.map +1 -0
- package/dist/ad-groups-HLGSVH74.js +70 -0
- package/dist/ad-groups-HLGSVH74.js.map +1 -0
- package/dist/ad-writes-3UE3U7VE.js +176 -0
- package/dist/ad-writes-3UE3U7VE.js.map +1 -0
- package/dist/add-HFQB2NTU.js +107 -0
- package/dist/add-HFQB2NTU.js.map +1 -0
- package/dist/add-IUYE5H6A.js +305 -0
- package/dist/add-IUYE5H6A.js.map +1 -0
- package/dist/ads-HLUJB5SQ.js +48 -0
- package/dist/ads-MAOI7S6V.js +115 -0
- package/dist/ads-PYNDMHUD.js +79 -0
- package/dist/ads-PYNDMHUD.js.map +1 -0
- package/dist/adsets-QRKICEFD.js +182 -0
- package/dist/advertisers-XXM6POO5.js +123 -0
- package/dist/advertisers-XXM6POO5.js.map +1 -0
- package/dist/analytics-AULKYNNT.js +447 -0
- package/dist/analytics-AULKYNNT.js.map +1 -0
- package/dist/analytics-DNDTC643.js +2437 -0
- package/dist/analytics-DNDTC643.js.map +1 -0
- package/dist/asset-writes-JLVUAVUZ.js +50 -0
- package/dist/assign-2GQVQKKO.js +80 -0
- package/dist/assign-2GQVQKKO.js.map +1 -0
- package/dist/audience-size-C3YHQPZB.js +76 -0
- package/dist/audience-size-C3YHQPZB.js.map +1 -0
- package/dist/audience-writes-CDKQB3SM.js +327 -0
- package/dist/audience-writes-CDKQB3SM.js.map +1 -0
- package/dist/audiences-CDDI5HR5.js +86 -0
- package/dist/audiences-M3A3QK52.js +280 -0
- package/dist/audiences-M3A3QK52.js.map +1 -0
- package/dist/audit-FLPJ7GTE.js +154 -0
- package/dist/audit-FLPJ7GTE.js.map +1 -0
- package/dist/autocomplete-ZYMHHV7E.js +114 -0
- package/dist/autocomplete-ZYMHHV7E.js.map +1 -0
- package/dist/avatars-WZ2JDMHH.js +38 -0
- package/dist/bid-pricing-H3M63PTW.js +103 -0
- package/dist/bid-pricing-H3M63PTW.js.map +1 -0
- package/dist/brand-IZTTBZII.js +22 -0
- package/dist/brief-OPQ7ICOY.js +543 -0
- package/dist/brief-OPQ7ICOY.js.map +1 -0
- package/dist/campaign-groups-IQSDKOVI.js +99 -0
- package/dist/campaign-groups-IQSDKOVI.js.map +1 -0
- package/dist/campaign-writes-APAAV4ZU.js +168 -0
- package/dist/campaign-writes-APAAV4ZU.js.map +1 -0
- package/dist/campaign-writes-BN4PZP4Z.js +176 -0
- package/dist/campaign-writes-BN4PZP4Z.js.map +1 -0
- package/dist/campaigns-4Y3JQC2U.js +111 -0
- package/dist/campaigns-GA34MEN2.js +78 -0
- package/dist/campaigns-GA34MEN2.js.map +1 -0
- package/dist/campaigns-HES5MDUG.js +130 -0
- package/dist/campaigns-K2FVD3XW.js +113 -0
- package/dist/campaigns-K2FVD3XW.js.map +1 -0
- package/dist/canvas-IQ753Q2O.js +46 -0
- package/dist/capabilities-ZITW4RF7.js +147 -0
- package/dist/capabilities-ZITW4RF7.js.map +1 -0
- package/dist/catalogs-TGLSJEK5.js +781 -0
- package/dist/catalogs-TGLSJEK5.js.map +1 -0
- package/dist/catalogs-ZR7DECMG.js +130 -0
- package/dist/catalogs-ZR7DECMG.js.map +1 -0
- package/dist/changes-VWKTM27U.js +135 -0
- package/dist/chatgpt-OPOD2WHB.js +47 -0
- package/dist/chats-AL2SYBJO.js +279 -0
- package/dist/chats-AL2SYBJO.js.map +1 -0
- package/dist/check-U2YLRD6H.js +107 -0
- package/dist/check-U2YLRD6H.js.map +1 -0
- package/dist/chunk-2GYCWRF3.js +170 -0
- package/dist/chunk-2L7F7KR4.js +61 -0
- package/dist/chunk-44ZRCSR7.js +228 -0
- package/dist/chunk-46YLDIQG.js +4254 -0
- package/dist/chunk-4EDWXZ3I.js +363 -0
- package/dist/chunk-4FFBGR5L.js +66 -0
- package/dist/chunk-4UQRXKYJ.js +219 -0
- package/dist/chunk-4UZUUSVL.js +592 -0
- package/dist/chunk-4XHCEYHI.js +831 -0
- package/dist/chunk-4Z6PVR3M.js +479 -0
- package/dist/chunk-5Y5FZV2W.js +122 -0
- package/dist/chunk-6HJXLGDV.js +392 -0
- package/dist/chunk-6S5CWGDA.js +429 -0
- package/dist/chunk-6VYROVWO.js +494 -0
- package/dist/chunk-7BUIOP36.js +287 -0
- package/dist/chunk-AQRXXC6E.js +319 -0
- package/dist/chunk-ARBXT73X.js +387 -0
- package/dist/chunk-BEZHQIEI.js +97 -0
- package/dist/chunk-BFURWHVR.js +547 -0
- package/dist/chunk-BX6B25KK.js +358 -0
- package/dist/chunk-BX6B25KK.js.map +1 -0
- package/dist/chunk-DSCEXBDR.js +676 -0
- package/dist/chunk-FLWDFPXE.js +23 -0
- package/dist/chunk-FRNBRN2C.js +1646 -0
- package/dist/chunk-G4FG5EQO.js +110 -0
- package/dist/chunk-G4FG5EQO.js.map +1 -0
- package/dist/chunk-GE3VT3CA.js +51 -0
- package/dist/chunk-GW2WRZZA.js +24026 -0
- package/dist/chunk-GW2WRZZA.js.map +1 -0
- package/dist/chunk-HGBJQGO5.js +142 -0
- package/dist/chunk-I7AYMJZA.js +783 -0
- package/dist/chunk-IRM273C7.js +207 -0
- package/dist/chunk-IWKD56AY.js +156 -0
- package/dist/chunk-JLAQWMVF.js +3868 -0
- package/dist/chunk-JOE42ZW6.js +2984 -0
- package/dist/chunk-JOE42ZW6.js.map +1 -0
- package/dist/chunk-K6NULQN7.js +57 -0
- package/dist/chunk-L2BRAC2J.js +19 -0
- package/dist/chunk-LGMI4LSY.js +455 -0
- package/dist/chunk-NB2FU6EZ.js +179 -0
- package/dist/chunk-NKQWDEB7.js +115 -0
- package/dist/chunk-NKQWDEB7.js.map +1 -0
- package/dist/chunk-NWF2LRKO.js +188 -0
- package/dist/chunk-OG47L5GG.js +275 -0
- package/dist/chunk-OR6KVLI5.js +169 -0
- package/dist/chunk-PC3FJEZH.js +7211 -0
- package/dist/chunk-PC3FJEZH.js.map +1 -0
- package/dist/chunk-Q3GSVLE5.js +4274 -0
- package/dist/chunk-Q3GSVLE5.js.map +1 -0
- package/dist/chunk-QDQZ62FL.js +207 -0
- package/dist/chunk-QIOFOD4K.js +344 -0
- package/dist/chunk-R2SYF5FC.js +249 -0
- package/dist/chunk-RTH2I55B.js +942 -0
- package/dist/chunk-S6VFDNSQ.js +63 -0
- package/dist/chunk-SG2TDQEE.js +150 -0
- package/dist/chunk-SOPVIIUW.js +68 -0
- package/dist/chunk-SOPVIIUW.js.map +1 -0
- package/dist/chunk-T3P6O2VU.js +89 -0
- package/dist/chunk-TXDE2QJ3.js +604 -0
- package/dist/chunk-UDIEKCIR.js +203 -0
- package/dist/chunk-USCADMM3.js +163 -0
- package/dist/chunk-UUGISMNE.js +910 -0
- package/dist/chunk-VDPOCAQ2.js +197 -0
- package/dist/chunk-VEJ3QX6M.js +103 -0
- package/dist/chunk-VFJB7OG6.js +91 -0
- package/dist/chunk-VRIPVLE7.js +8954 -0
- package/dist/chunk-WFY7KSHB.js +274 -0
- package/dist/chunk-WLESMH4J.js +45 -0
- package/dist/chunk-XHQYFNNK.js +846 -0
- package/dist/chunk-XOQNM7I4.js +396 -0
- package/dist/chunk-XOQNM7I4.js.map +1 -0
- package/dist/chunk-YILZR3XI.js +224 -0
- package/dist/chunk-YJFLXOH4.js +191 -0
- package/dist/chunk-YWHZYR6S.js +297 -0
- package/dist/claim-GOLUTAJ3.js +200 -0
- package/dist/claim-GOLUTAJ3.js.map +1 -0
- package/dist/cli.js +30 -30
- package/dist/companies-4AJJGTMC.js +198 -0
- package/dist/companies-4AJJGTMC.js.map +1 -0
- package/dist/company-MOSPLRZJ.js +308 -0
- package/dist/company-MOSPLRZJ.js.map +1 -0
- package/dist/complete-777BDV45.js +84 -0
- package/dist/complete-777BDV45.js.map +1 -0
- package/dist/connect-3YY7MF3I.js +45 -0
- package/dist/conversation-KROMHDHK.js +96 -0
- package/dist/conversation-KROMHDHK.js.map +1 -0
- package/dist/conversion-report-JZHI2IHY.js +127 -0
- package/dist/conversion-report-JZHI2IHY.js.map +1 -0
- package/dist/conversion-upload-command-7RSZ5ZQU.js +439 -0
- package/dist/conversion-writes-SNCLQDXQ.js +122 -0
- package/dist/conversion-writes-SNCLQDXQ.js.map +1 -0
- package/dist/conversions-43EYP2W2.js +140 -0
- package/dist/conversions-43EYP2W2.js.map +1 -0
- package/dist/conversions-EUOWILCQ.js +78 -0
- package/dist/conversions-EUOWILCQ.js.map +1 -0
- package/dist/copy-writes-CIHIFLY6.js +170 -0
- package/dist/copy-writes-CIHIFLY6.js.map +1 -0
- package/dist/create-3WOZO2XT.js +239 -0
- package/dist/create-3WOZO2XT.js.map +1 -0
- package/dist/create-7IFYLX7P.js +210 -0
- package/dist/create-7IFYLX7P.js.map +1 -0
- package/dist/create-FOHIQC3E.js +62 -0
- package/dist/create-FOHIQC3E.js.map +1 -0
- package/dist/create-UWQSQTK6.js +135 -0
- package/dist/create-UWQSQTK6.js.map +1 -0
- package/dist/creatives-2DR3QHJW.js +58 -0
- package/dist/creatives-BB6S2OF6.js +89 -0
- package/dist/creatives-KUO67WYA.js +223 -0
- package/dist/creatives-KUO67WYA.js.map +1 -0
- package/dist/credentials-IP4L37XP.js +290 -0
- package/dist/credentials-IP4L37XP.js.map +1 -0
- package/dist/critique-LGDNMLBL.js +232 -0
- package/dist/critique-LGDNMLBL.js.map +1 -0
- package/dist/critique-LJMFAURK.js +1451 -0
- package/dist/critique-LJMFAURK.js.map +1 -0
- package/dist/crm-BNYW7PF7.js +323 -0
- package/dist/crm-BNYW7PF7.js.map +1 -0
- package/dist/crm-J53V2QTN.js +227 -0
- package/dist/crm-J53V2QTN.js.map +1 -0
- package/dist/currency-X7Y6TSLF.js +88 -0
- package/dist/custom-conversions-HAGG72LF.js +128 -0
- package/dist/customers-663K2OCP.js +59 -0
- package/dist/delete-5W3YVA4L.js +67 -0
- package/dist/delete-5W3YVA4L.js.map +1 -0
- package/dist/delete-6U7E6YUW.js +57 -0
- package/dist/delete-6U7E6YUW.js.map +1 -0
- package/dist/delete-G4NY6ZG6.js +69 -0
- package/dist/delete-G4NY6ZG6.js.map +1 -0
- package/dist/demographics-4Y5LTCU4.js +141 -0
- package/dist/demographics-4Y5LTCU4.js.map +1 -0
- package/dist/discard-RKCZNKMN.js +69 -0
- package/dist/discard-RKCZNKMN.js.map +1 -0
- package/dist/discover-6DORQWXY.js +172 -0
- package/dist/domain-PLA2O4FW.js +101 -0
- package/dist/domain-PLA2O4FW.js.map +1 -0
- package/dist/download-4EFLVSA4.js +172 -0
- package/dist/download-4EFLVSA4.js.map +1 -0
- package/dist/draft-4V7W5DV2.js +310 -0
- package/dist/draft-4V7W5DV2.js.map +1 -0
- package/dist/draft-HY3U2GHU.js +283 -0
- package/dist/draft-HY3U2GHU.js.map +1 -0
- package/dist/draft-JMNAGW7C.js +220 -0
- package/dist/draft-JMNAGW7C.js.map +1 -0
- package/dist/draft-R6EKORNS.js +308 -0
- package/dist/draft-TRPQCJ4B.js +335 -0
- package/dist/draft-TRPQCJ4B.js.map +1 -0
- package/dist/experiments-4V242DG2.js +236 -0
- package/dist/experiments-4V242DG2.js.map +1 -0
- package/dist/facets-WXJ2MCU6.js +117 -0
- package/dist/facets-WXJ2MCU6.js.map +1 -0
- package/dist/feedback-IRSRPXV6.js +111 -0
- package/dist/feedback-IRSRPXV6.js.map +1 -0
- package/dist/feedback-record-DT3R4NA3.js +265 -0
- package/dist/feedback-record-DT3R4NA3.js.map +1 -0
- package/dist/fetch-YLQP5VQL.js +179 -0
- package/dist/fetch-YLQP5VQL.js.map +1 -0
- package/dist/fit-BEFCY2B4.js +65 -0
- package/dist/flows-FDMF3F3P.js +250 -0
- package/dist/flows-FDMF3F3P.js.map +1 -0
- package/dist/fonts-C6XN5667.js +39 -0
- package/dist/forecast-BTPIXEQ5.js +169 -0
- package/dist/forecast-ZTXZD3HD.js +121 -0
- package/dist/forecast-ZTXZD3HD.js.map +1 -0
- package/dist/funnel-7KOEX7YM.js +397 -0
- package/dist/funnel-7KOEX7YM.js.map +1 -0
- package/dist/get-KBSKPTAV.js +59 -0
- package/dist/get-KBSKPTAV.js.map +1 -0
- package/dist/get-OSVQVMP6.js +82 -0
- package/dist/get-OSVQVMP6.js.map +1 -0
- package/dist/google-M6BJ22UL.js +3267 -0
- package/dist/google-ads-XCJVAXWF.js +198 -0
- package/dist/google-ads-XCJVAXWF.js.map +1 -0
- package/dist/history-3NTM5SFN.js +69 -0
- package/dist/history-3NTM5SFN.js.map +1 -0
- package/dist/history-4TN2A6BL.js +136 -0
- package/dist/history-4TN2A6BL.js.map +1 -0
- package/dist/history-5IWW2X33.js +102 -0
- package/dist/history-5IWW2X33.js.map +1 -0
- package/dist/hubspot-HMVSRJQZ.js +782 -0
- package/dist/hubspot-HMVSRJQZ.js.map +1 -0
- package/dist/ideas-M66FU45H.js +45 -0
- package/dist/images-MM5OPUKV.js +92 -0
- package/dist/ingest-GU3WEBN3.js +110 -0
- package/dist/ingest-GU3WEBN3.js.map +1 -0
- package/dist/ingest-KMLYCFF4.js +26 -0
- package/dist/insights-CQCWOCIT.js +132 -0
- package/dist/insights-CQCWOCIT.js.map +1 -0
- package/dist/insights-XZL2EM53.js +439 -0
- package/dist/insights-XZL2EM53.js.map +1 -0
- package/dist/inspect-4JO2J3D6.js +192 -0
- package/dist/inspect-4JO2J3D6.js.map +1 -0
- package/dist/instant-experiences-RM4MLJTL.js +260 -0
- package/dist/instant-experiences-RM4MLJTL.js.map +1 -0
- package/dist/intent-YCQCUCV3.js +95 -0
- package/dist/keyword-gap-PUSF7EKY.js +130 -0
- package/dist/keyword-metrics-JXBM22ZD.js +200 -0
- package/dist/keyword-metrics-JXBM22ZD.js.map +1 -0
- package/dist/keywords-for-site-OAYA7KP7.js +131 -0
- package/dist/keywords-for-site-OAYA7KP7.js.map +1 -0
- package/dist/landing-OZU5RRFV.js +28 -0
- package/dist/languages-SLFV73GE.js +40 -0
- package/dist/leads-Q7APIJRQ.js +115 -0
- package/dist/leads-Q7APIJRQ.js.map +1 -0
- package/dist/leads-ULYHTG22.js +540 -0
- package/dist/leads-ULYHTG22.js.map +1 -0
- package/dist/learn-NBBJRMVZ.js +207 -0
- package/dist/learn-NBBJRMVZ.js.map +1 -0
- package/dist/line-item-writes-X3L5NQEH.js +211 -0
- package/dist/line-item-writes-X3L5NQEH.js.map +1 -0
- package/dist/line-items-NJMEPEF5.js +107 -0
- package/dist/link-WZSNUQQ2.js +67 -0
- package/dist/link-WZSNUQQ2.js.map +1 -0
- package/dist/linkedin-55PAID62.js +1316 -0
- package/dist/linkedin-55PAID62.js.map +1 -0
- package/dist/linkedin-person-MVRI7LLC.js +139 -0
- package/dist/linkedin-person-MVRI7LLC.js.map +1 -0
- package/dist/list-6S54IAUX.js +67 -0
- package/dist/list-6S54IAUX.js.map +1 -0
- package/dist/list-QRJ4E3SC.js +154 -0
- package/dist/list-QRJ4E3SC.js.map +1 -0
- package/dist/list-RZUDFLJN.js +306 -0
- package/dist/list-RZUDFLJN.js.map +1 -0
- package/dist/locations-T2OMP6QN.js +40 -0
- package/dist/locations-W3VOYBWL.js +69 -0
- package/dist/locations-W3VOYBWL.js.map +1 -0
- package/dist/log-53SAPZZ3.js +95 -0
- package/dist/log-53SAPZZ3.js.map +1 -0
- package/dist/lookup-S5VG7AWH.js +23 -0
- package/dist/make-ZF3YIMKW.js +1370 -0
- package/dist/make-ZF3YIMKW.js.map +1 -0
- package/dist/map-J37QFJSV.js +436 -0
- package/dist/map-J37QFJSV.js.map +1 -0
- package/dist/mcp-YRIFPYNU.js +717 -0
- package/dist/mcp-YRIFPYNU.js.map +1 -0
- package/dist/media-P4T4ZBNS.js +18 -0
- package/dist/media-sources-EQI3U4TC.js +35 -0
- package/dist/members-GYVMSCKL.js +47 -0
- package/dist/members-GYVMSCKL.js.map +1 -0
- package/dist/meta-IPLWNYC7.js +122 -0
- package/dist/metrics-4YVJHYRI.js +152 -0
- package/dist/normalize-MFN3WCH5.js +144 -0
- package/dist/normalize-MFN3WCH5.js.map +1 -0
- package/dist/options-DLHDHO7H.js +125 -0
- package/dist/options-DLHDHO7H.js.map +1 -0
- package/dist/organization-C2VOA2SD.js +949 -0
- package/dist/organization-C2VOA2SD.js.map +1 -0
- package/dist/page-photos-OQ5QATQH.js +118 -0
- package/dist/page-photos-OQ5QATQH.js.map +1 -0
- package/dist/performance-NIF3CESZ.js +27 -0
- package/dist/performance-T6TBVHVU.js +5541 -0
- package/dist/performance-T6TBVHVU.js.map +1 -0
- package/dist/pixels-LQAJOZIM.js +62 -0
- package/dist/pixels-LQAJOZIM.js.map +1 -0
- package/dist/plan-7UF76Q6U.js +208 -0
- package/dist/plan-7UF76Q6U.js.map +1 -0
- package/dist/preview-LRJOQ7LM.js +218 -0
- package/dist/preview-LRJOQ7LM.js.map +1 -0
- package/dist/promoted-tweet-writes-Y6BBOWDL.js +183 -0
- package/dist/promoted-tweet-writes-Y6BBOWDL.js.map +1 -0
- package/dist/promoted-tweets-RJT53DRM.js +119 -0
- package/dist/publish-IOTMJCCY.js +344 -0
- package/dist/publish-IOTMJCCY.js.map +1 -0
- package/dist/query-XZMDGRO5.js +62 -0
- package/dist/questionnaire-DWEH5II4.js +94 -0
- package/dist/questionnaire-DWEH5II4.js.map +1 -0
- package/dist/reddit-JIHMAKAQ.js +29 -0
- package/dist/refresh-OQZ263CS.js +97 -0
- package/dist/refresh-OQZ263CS.js.map +1 -0
- package/dist/release-4CHFURO3.js +63 -0
- package/dist/release-4CHFURO3.js.map +1 -0
- package/dist/relevant-pages-FS7GBVXK.js +99 -0
- package/dist/remove-IJQPHPDI.js +53 -0
- package/dist/remove-IJQPHPDI.js.map +1 -0
- package/dist/reopen-YTLPVKUR.js +66 -0
- package/dist/reopen-YTLPVKUR.js.map +1 -0
- package/dist/rerun-C7NB7B35.js +95 -0
- package/dist/rerun-C7NB7B35.js.map +1 -0
- package/dist/research-PNBACCCP.js +72 -0
- package/dist/research-TLHNPK3O.js +265 -0
- package/dist/research-TLHNPK3O.js.map +1 -0
- package/dist/reset-JVLW7HA2.js +57 -0
- package/dist/reset-JVLW7HA2.js.map +1 -0
- package/dist/reset-Y6FXLAQE.js +57 -0
- package/dist/reset-Y6FXLAQE.js.map +1 -0
- package/dist/resolve-YLRESES5.js +124 -0
- package/dist/resolve-YLRESES5.js.map +1 -0
- package/dist/retry-3V3IGDRR.js +65 -0
- package/dist/retry-3V3IGDRR.js.map +1 -0
- package/dist/retry-AEKQLQMP.js +63 -0
- package/dist/retry-AEKQLQMP.js.map +1 -0
- package/dist/revenue-E4GQIOUY.js +91 -0
- package/dist/revenue-E4GQIOUY.js.map +1 -0
- package/dist/rule-writes-UAVWT4XS.js +525 -0
- package/dist/rule-writes-UAVWT4XS.js.map +1 -0
- package/dist/rules-34BQAWU3.js +99 -0
- package/dist/rules-34BQAWU3.js.map +1 -0
- package/dist/rules-ZVS2MWED.js +217 -0
- package/dist/rules-add-CM5XUYNS.js +465 -0
- package/dist/rules-add-CM5XUYNS.js.map +1 -0
- package/dist/run-MD64RDHZ.js +69 -0
- package/dist/run-MD64RDHZ.js.map +1 -0
- package/dist/run-QCNRR3CA.js +70 -0
- package/dist/scaffold-ad-NADPY3CB.js +1516 -0
- package/dist/scaffold-ad-NADPY3CB.js.map +1 -0
- package/dist/scaffold-static-ad-5YEYYVYH.js +1015 -0
- package/dist/scaffold-static-ad-5YEYYVYH.js.map +1 -0
- package/dist/scaffold-video-W7DF2CBJ.js +888 -0
- package/dist/scaffold-video-W7DF2CBJ.js.map +1 -0
- package/dist/schedule-CTRRF6TS.js +64 -0
- package/dist/schedule-CTRRF6TS.js.map +1 -0
- package/dist/scheduled-agents-OXYAVSIE.js +55 -0
- package/dist/schema-BEUYOGSW.js +135 -0
- package/dist/schema-BEUYOGSW.js.map +1 -0
- package/dist/search-GFJKWPKN.js +177 -0
- package/dist/search-GFJKWPKN.js.map +1 -0
- package/dist/select-S72CCL57.js +106 -0
- package/dist/select-S72CCL57.js.map +1 -0
- package/dist/sends-LAY5C74B.js +349 -0
- package/dist/sends-LAY5C74B.js.map +1 -0
- package/dist/set-prompt-YYFDRXRI.js +198 -0
- package/dist/set-prompt-YYFDRXRI.js.map +1 -0
- package/dist/setup-links-D4JJLESN.js +144 -0
- package/dist/setup-links-D4JJLESN.js.map +1 -0
- package/dist/shopify-T4UWFIQC.js +3958 -0
- package/dist/shopify-T4UWFIQC.js.map +1 -0
- package/dist/site-BBZAUZA3.js +180 -0
- package/dist/site-BBZAUZA3.js.map +1 -0
- package/dist/sources-BUPV7H7F.js +457 -0
- package/dist/sources-BUPV7H7F.js.map +1 -0
- package/dist/sources-FLUGHSVP.js +30 -0
- package/dist/stale-HP54JS5X.js +76 -0
- package/dist/stale-HP54JS5X.js.map +1 -0
- package/dist/status-CLSWQFCQ.js +65 -0
- package/dist/status-CLSWQFCQ.js.map +1 -0
- package/dist/studies-EPO2AM4M.js +250 -0
- package/dist/study-writes-7FP443QQ.js +470 -0
- package/dist/study-writes-7FP443QQ.js.map +1 -0
- package/dist/sync-4YTVVEVC.js +57 -0
- package/dist/sync-4YTVVEVC.js.map +1 -0
- package/dist/sync-definition-OGQ5XTQE.js +69 -0
- package/dist/tags-CZTRQNXV.js +26 -0
- package/dist/tags-FDQXWTCQ.js +23 -0
- package/dist/tags-FDQXWTCQ.js.map +1 -0
- package/dist/tags-R67DKRZ6.js +23 -0
- package/dist/tags-R67DKRZ6.js.map +1 -0
- package/dist/tags-SA2LU6AW.js +227 -0
- package/dist/tags-SA2LU6AW.js.map +1 -0
- package/dist/tags-ZOXX6VRE.js +23 -0
- package/dist/tags-ZOXX6VRE.js.map +1 -0
- package/dist/targeting-NKZFEZD7.js +762 -0
- package/dist/targeting-NKZFEZD7.js.map +1 -0
- package/dist/targeting-criteria-AQYXVSGN.js +113 -0
- package/dist/targets-UUVCEG3F.js +106 -0
- package/dist/targets-UUVCEG3F.js.map +1 -0
- package/dist/testimonials-G3OCNPBY.js +32 -0
- package/dist/themes-FEVYZZCW.js +95 -0
- package/dist/top-companies-BQGWKYUK.js +111 -0
- package/dist/top-companies-BQGWKYUK.js.map +1 -0
- package/dist/transcript-U46AEOEI.js +165 -0
- package/dist/transcript-U46AEOEI.js.map +1 -0
- package/dist/translate-AS7JVKYM.js +609 -0
- package/dist/translate-AS7JVKYM.js.map +1 -0
- package/dist/triggers-ECRBPYYF.js +144 -0
- package/dist/triggers-ECRBPYYF.js.map +1 -0
- package/dist/unlink-VDNCSRJV.js +70 -0
- package/dist/unlink-VDNCSRJV.js.map +1 -0
- package/dist/unstage-ATDXUYP2.js +88 -0
- package/dist/unstage-ATDXUYP2.js.map +1 -0
- package/dist/unstage-ZA3WQBEA.js +96 -0
- package/dist/unstage-ZA3WQBEA.js.map +1 -0
- package/dist/update-FJ6TBV3E.js +101 -0
- package/dist/update-FJ6TBV3E.js.map +1 -0
- package/dist/update-HDBJCSTI.js +66 -0
- package/dist/update-HDBJCSTI.js.map +1 -0
- package/dist/update-U43DJRGV.js +155 -0
- package/dist/update-U43DJRGV.js.map +1 -0
- package/dist/update-Z7TIUBMJ.js +192 -0
- package/dist/update-Z7TIUBMJ.js.map +1 -0
- package/dist/upload-LXCFSRIU.js +129 -0
- package/dist/upload-LXCFSRIU.js.map +1 -0
- package/dist/url-options-Z4BQBEMI.js +131 -0
- package/dist/url-options-Z4BQBEMI.js.map +1 -0
- package/dist/url-params-J7RKP5RB.js +101 -0
- package/dist/url-params-J7RKP5RB.js.map +1 -0
- package/dist/validate-VR3HEOMJ.js +122 -0
- package/dist/validate-VR3HEOMJ.js.map +1 -0
- package/dist/videos-36AXDUGZ.js +41 -0
- package/dist/viewer-check-6HL4OUQY.js +83 -0
- package/dist/web-7BRJRQX7.js +143 -0
- package/dist/web-7BRJRQX7.js.map +1 -0
- package/dist/winning-ads-GMM5W2O4.js +86 -0
- package/dist/write-commands-IM5DPG3R.js +1502 -0
- package/dist/write-commands-IM5DPG3R.js.map +1 -0
- package/dist/write-commands-OGVDWWBV.js +1172 -0
- package/dist/write-commands-OGVDWWBV.js.map +1 -0
- package/dist/x-HGFAL3NY.js +47 -0
- package/package.json +1 -1
- package/dist/account-C635ATVM.js +0 -80
- package/dist/account-C635ATVM.js.map +0 -1
- package/dist/account-WLQBAQMD.js +0 -80
- package/dist/account-WLQBAQMD.js.map +0 -1
- package/dist/account-assets-O7IA37RE.js +0 -290
- package/dist/account-level-EU7BWCO7.js +0 -609
- package/dist/account-level-EU7BWCO7.js.map +0 -1
- package/dist/account-reads-SNOWDHHF.js +0 -219
- package/dist/account-users-XYYENK6X.js +0 -62
- package/dist/account-users-XYYENK6X.js.map +0 -1
- package/dist/account-writes-TU3WJRSI.js +0 -66
- package/dist/account-writes-TU3WJRSI.js.map +0 -1
- package/dist/accounts-A2FBLZ5H.js +0 -78
- package/dist/accounts-A2FBLZ5H.js.map +0 -1
- package/dist/accounts-V2IZZ5KU.js +0 -699
- package/dist/accounts-V2IZZ5KU.js.map +0 -1
- package/dist/actions-Y4SULW2E.js +0 -55
- package/dist/activecampaign-63XG6CLL.js +0 -936
- package/dist/activecampaign-63XG6CLL.js.map +0 -1
- package/dist/ad-group-writes-HLBWN4E4.js +0 -170
- package/dist/ad-group-writes-HLBWN4E4.js.map +0 -1
- package/dist/ad-groups-33NZD6J3.js +0 -68
- package/dist/ad-groups-33NZD6J3.js.map +0 -1
- package/dist/ad-writes-7ZDNDZ2E.js +0 -174
- package/dist/ad-writes-7ZDNDZ2E.js.map +0 -1
- package/dist/add-FOLFVGQO.js +0 -303
- package/dist/add-FOLFVGQO.js.map +0 -1
- package/dist/add-RYB4JSYC.js +0 -105
- package/dist/add-RYB4JSYC.js.map +0 -1
- package/dist/ads-2TVWICGM.js +0 -48
- package/dist/ads-KBE5JXCH.js +0 -115
- package/dist/ads-X3AM6M7L.js +0 -77
- package/dist/ads-X3AM6M7L.js.map +0 -1
- package/dist/adsets-YWBJFPAZ.js +0 -182
- package/dist/advertisers-IGUMSK5Q.js +0 -121
- package/dist/advertisers-IGUMSK5Q.js.map +0 -1
- package/dist/analytics-3DKM7J43.js +0 -445
- package/dist/analytics-3DKM7J43.js.map +0 -1
- package/dist/analytics-R3QDSX2K.js +0 -2435
- package/dist/analytics-R3QDSX2K.js.map +0 -1
- package/dist/asset-writes-72DEVXGO.js +0 -48
- package/dist/assign-EKCGLNZB.js +0 -78
- package/dist/assign-EKCGLNZB.js.map +0 -1
- package/dist/audience-size-IKXK32HU.js +0 -74
- package/dist/audience-size-IKXK32HU.js.map +0 -1
- package/dist/audience-writes-KCHLNFSI.js +0 -325
- package/dist/audience-writes-KCHLNFSI.js.map +0 -1
- package/dist/audiences-QAH42HIM.js +0 -86
- package/dist/audiences-WCDWN64L.js +0 -268
- package/dist/audiences-WCDWN64L.js.map +0 -1
- package/dist/audit-CY76S4V7.js +0 -152
- package/dist/audit-CY76S4V7.js.map +0 -1
- package/dist/autocomplete-G2S5HNUS.js +0 -112
- package/dist/autocomplete-G2S5HNUS.js.map +0 -1
- package/dist/avatars-P4UPNZM4.js +0 -38
- package/dist/bid-pricing-AJT4QU2C.js +0 -101
- package/dist/bid-pricing-AJT4QU2C.js.map +0 -1
- package/dist/brand-HALQWZWB.js +0 -22
- package/dist/brief-NW7TGG2Q.js +0 -541
- package/dist/brief-NW7TGG2Q.js.map +0 -1
- package/dist/campaign-groups-I43KMAJP.js +0 -97
- package/dist/campaign-groups-I43KMAJP.js.map +0 -1
- package/dist/campaign-writes-DLLPFAGG.js +0 -166
- package/dist/campaign-writes-DLLPFAGG.js.map +0 -1
- package/dist/campaign-writes-XO74BALZ.js +0 -174
- package/dist/campaign-writes-XO74BALZ.js.map +0 -1
- package/dist/campaigns-LS65QM6W.js +0 -76
- package/dist/campaigns-LS65QM6W.js.map +0 -1
- package/dist/campaigns-UIYSYCF3.js +0 -111
- package/dist/campaigns-UIYSYCF3.js.map +0 -1
- package/dist/campaigns-XZOQ2VTK.js +0 -130
- package/dist/campaigns-YMM5TQVO.js +0 -111
- package/dist/canvas-IJS7H3VE.js +0 -46
- package/dist/capabilities-XMQPM3UL.js +0 -145
- package/dist/capabilities-XMQPM3UL.js.map +0 -1
- package/dist/catalogs-JLCSFZYC.js +0 -779
- package/dist/catalogs-JLCSFZYC.js.map +0 -1
- package/dist/catalogs-T23RKYFC.js +0 -128
- package/dist/catalogs-T23RKYFC.js.map +0 -1
- package/dist/changes-36C754R4.js +0 -135
- package/dist/chatgpt-3WFOPURY.js +0 -47
- package/dist/chats-ZI6EYDAF.js +0 -277
- package/dist/chats-ZI6EYDAF.js.map +0 -1
- package/dist/check-CHJ2OLAU.js +0 -105
- package/dist/check-CHJ2OLAU.js.map +0 -1
- package/dist/chunk-2TOIY2WN.js +0 -4254
- package/dist/chunk-4GAEB6NK.js +0 -228
- package/dist/chunk-5RVQK3SP.js +0 -494
- package/dist/chunk-5SRUAGTG.js +0 -547
- package/dist/chunk-5XTGG4PV.js +0 -274
- package/dist/chunk-6Z7Y4KQB.js +0 -275
- package/dist/chunk-7J3NZBPV.js +0 -2982
- package/dist/chunk-7J3NZBPV.js.map +0 -1
- package/dist/chunk-AIRD6T4W.js +0 -169
- package/dist/chunk-AQOFQNKQ.js +0 -57
- package/dist/chunk-ARUXGKZO.js +0 -91
- package/dist/chunk-AYPBARKP.js +0 -156
- package/dist/chunk-BRLZX3VP.js +0 -207
- package/dist/chunk-BTJSGJNQ.js +0 -604
- package/dist/chunk-C7QQQVBS.js +0 -51
- package/dist/chunk-CCEDZTP7.js +0 -391
- package/dist/chunk-CCEDZTP7.js.map +0 -1
- package/dist/chunk-D3KLDIPQ.js +0 -45
- package/dist/chunk-DUR7PEJI.js +0 -170
- package/dist/chunk-EDLZGTGN.js +0 -216
- package/dist/chunk-EDLZGTGN.js.map +0 -1
- package/dist/chunk-FFFJBNHA.js +0 -63
- package/dist/chunk-FPWQA7TK.js +0 -344
- package/dist/chunk-G5Y7OIPL.js +0 -392
- package/dist/chunk-GACSA5A6.js +0 -1646
- package/dist/chunk-GMHCHHAA.js +0 -19
- package/dist/chunk-H4NNQGG6.js +0 -66
- package/dist/chunk-HSQRITKG.js +0 -203
- package/dist/chunk-I47BEKYK.js +0 -831
- package/dist/chunk-JND6XSGZ.js +0 -7192
- package/dist/chunk-JND6XSGZ.js.map +0 -1
- package/dist/chunk-KBRJSPIM.js +0 -676
- package/dist/chunk-KQTNUDKD.js +0 -97
- package/dist/chunk-M7HD42M6.js +0 -24017
- package/dist/chunk-M7HD42M6.js.map +0 -1
- package/dist/chunk-MBSFEVOG.js +0 -163
- package/dist/chunk-MGYC2IRC.js +0 -783
- package/dist/chunk-MUXKYSTI.js +0 -297
- package/dist/chunk-MZCTX37B.js +0 -3868
- package/dist/chunk-N7M2TWR5.js +0 -592
- package/dist/chunk-NDFS3APP.js +0 -319
- package/dist/chunk-OBJCNGZL.js +0 -207
- package/dist/chunk-OJGYYH6K.js +0 -179
- package/dist/chunk-P6BKKUSX.js +0 -142
- package/dist/chunk-PLAOK4AK.js +0 -103
- package/dist/chunk-PLBITHV6.js +0 -846
- package/dist/chunk-PNKIOTCK.js +0 -349
- package/dist/chunk-PNKIOTCK.js.map +0 -1
- package/dist/chunk-QBRPM3DQ.js +0 -61
- package/dist/chunk-QMDMTZAW.js +0 -224
- package/dist/chunk-QW6HL7D6.js +0 -429
- package/dist/chunk-R53XMPDO.js +0 -363
- package/dist/chunk-RFIUOQLN.js +0 -89
- package/dist/chunk-RVEY7BTT.js +0 -8954
- package/dist/chunk-SCL7PM6P.js +0 -479
- package/dist/chunk-SM7G7RUA.js +0 -910
- package/dist/chunk-SVBJ56T7.js +0 -455
- package/dist/chunk-TVAIOC77.js +0 -287
- package/dist/chunk-TVTSA4EN.js +0 -188
- package/dist/chunk-VIPKDXGU.js +0 -4229
- package/dist/chunk-VIPKDXGU.js.map +0 -1
- package/dist/chunk-W574NV67.js +0 -191
- package/dist/chunk-XGPU2VDU.js +0 -219
- package/dist/chunk-XQXZJ5IR.js +0 -249
- package/dist/chunk-YMF2RG4Z.js +0 -942
- package/dist/chunk-Z2DRGXBB.js +0 -197
- package/dist/chunk-Z7YMSHRZ.js +0 -23
- package/dist/chunk-ZEC46NWW.js +0 -122
- package/dist/chunk-ZFC562TP.js +0 -387
- package/dist/chunk-ZNRGH4NS.js +0 -150
- package/dist/claim-OUYHVGB4.js +0 -198
- package/dist/claim-OUYHVGB4.js.map +0 -1
- package/dist/companies-XDNSG7ME.js +0 -196
- package/dist/companies-XDNSG7ME.js.map +0 -1
- package/dist/company-4FAYYPEJ.js +0 -306
- package/dist/company-4FAYYPEJ.js.map +0 -1
- package/dist/complete-M2PAUMDP.js +0 -82
- package/dist/complete-M2PAUMDP.js.map +0 -1
- package/dist/connect-PP6Z3F7Y.js +0 -43
- package/dist/conversation-B5NPTLFQ.js +0 -94
- package/dist/conversation-B5NPTLFQ.js.map +0 -1
- package/dist/conversion-report-DKXFHLLX.js +0 -125
- package/dist/conversion-report-DKXFHLLX.js.map +0 -1
- package/dist/conversion-upload-command-KTYAY7IG.js +0 -439
- package/dist/conversion-writes-7ODJDAUP.js +0 -120
- package/dist/conversion-writes-7ODJDAUP.js.map +0 -1
- package/dist/conversions-BKVGNNC6.js +0 -76
- package/dist/conversions-BKVGNNC6.js.map +0 -1
- package/dist/conversions-QRJL6JIO.js +0 -138
- package/dist/conversions-QRJL6JIO.js.map +0 -1
- package/dist/copy-writes-P4WK6OPM.js +0 -168
- package/dist/copy-writes-P4WK6OPM.js.map +0 -1
- package/dist/create-4DWCJ2UA.js +0 -208
- package/dist/create-4DWCJ2UA.js.map +0 -1
- package/dist/create-OYV33CQ6.js +0 -60
- package/dist/create-OYV33CQ6.js.map +0 -1
- package/dist/create-U6JVIYFY.js +0 -237
- package/dist/create-U6JVIYFY.js.map +0 -1
- package/dist/create-V4FNRO63.js +0 -133
- package/dist/create-V4FNRO63.js.map +0 -1
- package/dist/creatives-64FKWEGL.js +0 -221
- package/dist/creatives-64FKWEGL.js.map +0 -1
- package/dist/creatives-JPKA2RHU.js +0 -89
- package/dist/creatives-UJDPD4CI.js +0 -58
- package/dist/credentials-EIPEZ2C2.js +0 -288
- package/dist/credentials-EIPEZ2C2.js.map +0 -1
- package/dist/critique-BADMZAZP.js +0 -230
- package/dist/critique-BADMZAZP.js.map +0 -1
- package/dist/critique-M3DEVEDA.js +0 -1449
- package/dist/critique-M3DEVEDA.js.map +0 -1
- package/dist/crm-GIYSLLY7.js +0 -321
- package/dist/crm-GIYSLLY7.js.map +0 -1
- package/dist/crm-HXKSJRY3.js +0 -225
- package/dist/crm-HXKSJRY3.js.map +0 -1
- package/dist/currency-R4ORE2U3.js +0 -88
- package/dist/custom-conversions-5HJBB5XL.js +0 -128
- package/dist/customers-7J3QGSOJ.js +0 -57
- package/dist/delete-EDWJQMMV.js +0 -65
- package/dist/delete-EDWJQMMV.js.map +0 -1
- package/dist/delete-O24CVQMJ.js +0 -67
- package/dist/delete-O24CVQMJ.js.map +0 -1
- package/dist/delete-QN2OYUCS.js +0 -55
- package/dist/delete-QN2OYUCS.js.map +0 -1
- package/dist/demographics-MPYYF2OI.js +0 -139
- package/dist/demographics-MPYYF2OI.js.map +0 -1
- package/dist/discard-FJCFB6SA.js +0 -67
- package/dist/discard-FJCFB6SA.js.map +0 -1
- package/dist/discover-GSJRZUOC.js +0 -172
- package/dist/domain-UILPSEA5.js +0 -99
- package/dist/domain-UILPSEA5.js.map +0 -1
- package/dist/download-ZMAI7QSG.js +0 -170
- package/dist/download-ZMAI7QSG.js.map +0 -1
- package/dist/draft-5OQT3APG.js +0 -308
- package/dist/draft-5OQT3APG.js.map +0 -1
- package/dist/draft-LPVK6YHI.js +0 -281
- package/dist/draft-LPVK6YHI.js.map +0 -1
- package/dist/draft-MSESA5UE.js +0 -333
- package/dist/draft-MSESA5UE.js.map +0 -1
- package/dist/draft-WYDMLNYA.js +0 -308
- package/dist/draft-XOOSEVY5.js +0 -218
- package/dist/draft-XOOSEVY5.js.map +0 -1
- package/dist/experiments-PVOQUL47.js +0 -234
- package/dist/experiments-PVOQUL47.js.map +0 -1
- package/dist/facets-5RW4Z3D3.js +0 -115
- package/dist/facets-5RW4Z3D3.js.map +0 -1
- package/dist/feedback-GC56R2EJ.js +0 -109
- package/dist/feedback-GC56R2EJ.js.map +0 -1
- package/dist/feedback-record-JX7ZU6J7.js +0 -263
- package/dist/feedback-record-JX7ZU6J7.js.map +0 -1
- package/dist/fetch-WUTXAPBL.js +0 -177
- package/dist/fetch-WUTXAPBL.js.map +0 -1
- package/dist/fit-N7WDGWYZ.js +0 -63
- package/dist/flows-ULZACISF.js +0 -248
- package/dist/flows-ULZACISF.js.map +0 -1
- package/dist/fonts-TTUAP7HS.js +0 -37
- package/dist/forecast-4AG5F7YC.js +0 -169
- package/dist/forecast-RQJJRN5D.js +0 -119
- package/dist/forecast-RQJJRN5D.js.map +0 -1
- package/dist/funnel-QPWJIXWK.js +0 -395
- package/dist/funnel-QPWJIXWK.js.map +0 -1
- package/dist/get-35D7YHWJ.js +0 -57
- package/dist/get-35D7YHWJ.js.map +0 -1
- package/dist/get-GIETDPF4.js +0 -80
- package/dist/get-GIETDPF4.js.map +0 -1
- package/dist/google-NAA4BASO.js +0 -3267
- package/dist/google-ads-2IZFZO4C.js +0 -196
- package/dist/google-ads-2IZFZO4C.js.map +0 -1
- package/dist/history-5MRLNTCI.js +0 -67
- package/dist/history-5MRLNTCI.js.map +0 -1
- package/dist/history-RPLWWPLQ.js +0 -134
- package/dist/history-RPLWWPLQ.js.map +0 -1
- package/dist/history-TQYLUYVU.js +0 -100
- package/dist/history-TQYLUYVU.js.map +0 -1
- package/dist/hubspot-EPK43X4C.js +0 -780
- package/dist/hubspot-EPK43X4C.js.map +0 -1
- package/dist/ideas-SUXKKZC7.js +0 -43
- package/dist/images-VKVZ3DWG.js +0 -92
- package/dist/ingest-BBBFT6FZ.js +0 -24
- package/dist/ingest-EM2UY42Z.js +0 -108
- package/dist/ingest-EM2UY42Z.js.map +0 -1
- package/dist/insights-M3CYB22P.js +0 -437
- package/dist/insights-M3CYB22P.js.map +0 -1
- package/dist/insights-XCT3ONC7.js +0 -130
- package/dist/insights-XCT3ONC7.js.map +0 -1
- package/dist/inspect-ZPOVOENK.js +0 -190
- package/dist/inspect-ZPOVOENK.js.map +0 -1
- package/dist/instant-experiences-HT3HB4QZ.js +0 -258
- package/dist/instant-experiences-HT3HB4QZ.js.map +0 -1
- package/dist/intent-NSHW7EJT.js +0 -95
- package/dist/keyword-gap-ITTWKBWZ.js +0 -130
- package/dist/keyword-metrics-7DPR264W.js +0 -198
- package/dist/keyword-metrics-7DPR264W.js.map +0 -1
- package/dist/keywords-for-site-IXL22UKQ.js +0 -129
- package/dist/keywords-for-site-IXL22UKQ.js.map +0 -1
- package/dist/landing-KZ4OSHHR.js +0 -28
- package/dist/languages-MEFQQBJ2.js +0 -40
- package/dist/leads-DNQTRYIR.js +0 -113
- package/dist/leads-DNQTRYIR.js.map +0 -1
- package/dist/leads-SZOGCQFK.js +0 -538
- package/dist/leads-SZOGCQFK.js.map +0 -1
- package/dist/learn-Q7WZG7FA.js +0 -205
- package/dist/learn-Q7WZG7FA.js.map +0 -1
- package/dist/line-item-writes-3K7FT5GO.js +0 -209
- package/dist/line-item-writes-3K7FT5GO.js.map +0 -1
- package/dist/line-items-G5YJG25N.js +0 -107
- package/dist/link-2QVSIZJT.js +0 -65
- package/dist/link-2QVSIZJT.js.map +0 -1
- package/dist/linkedin-VAFPZNWZ.js +0 -1314
- package/dist/linkedin-VAFPZNWZ.js.map +0 -1
- package/dist/linkedin-person-EHTYVNZY.js +0 -137
- package/dist/linkedin-person-EHTYVNZY.js.map +0 -1
- package/dist/list-5TS2VPQZ.js +0 -152
- package/dist/list-5TS2VPQZ.js.map +0 -1
- package/dist/list-PSSQXQRJ.js +0 -65
- package/dist/list-PSSQXQRJ.js.map +0 -1
- package/dist/list-UMVIFQ3X.js +0 -304
- package/dist/list-UMVIFQ3X.js.map +0 -1
- package/dist/locations-RLWAS6AC.js +0 -40
- package/dist/locations-UKBOT6SB.js +0 -67
- package/dist/locations-UKBOT6SB.js.map +0 -1
- package/dist/log-ZZK3QMZB.js +0 -93
- package/dist/log-ZZK3QMZB.js.map +0 -1
- package/dist/lookup-ZJIP2M4X.js +0 -22
- package/dist/make-DB2BDVB3.js +0 -1368
- package/dist/make-DB2BDVB3.js.map +0 -1
- package/dist/map-UJ23GKRH.js +0 -434
- package/dist/map-UJ23GKRH.js.map +0 -1
- package/dist/mcp-SS2ALFRJ.js +0 -715
- package/dist/mcp-SS2ALFRJ.js.map +0 -1
- package/dist/media-ZWN7E777.js +0 -18
- package/dist/media-sources-GKSEDSE3.js +0 -35
- package/dist/members-KD2XRYPZ.js +0 -45
- package/dist/members-KD2XRYPZ.js.map +0 -1
- package/dist/meta-EHKXH257.js +0 -122
- package/dist/metrics-K6FDCMK7.js +0 -152
- package/dist/normalize-ZNTXNX6D.js +0 -142
- package/dist/normalize-ZNTXNX6D.js.map +0 -1
- package/dist/options-TBIFJF3E.js +0 -123
- package/dist/options-TBIFJF3E.js.map +0 -1
- package/dist/organization-26J2ZIKM.js +0 -947
- package/dist/organization-26J2ZIKM.js.map +0 -1
- package/dist/page-photos-HWKQOSCU.js +0 -116
- package/dist/page-photos-HWKQOSCU.js.map +0 -1
- package/dist/performance-6TPJGM6A.js +0 -25
- package/dist/performance-O5BXZGS6.js +0 -5539
- package/dist/performance-O5BXZGS6.js.map +0 -1
- package/dist/pixels-Z7ZGXAGB.js +0 -60
- package/dist/pixels-Z7ZGXAGB.js.map +0 -1
- package/dist/plan-TVQSEKYL.js +0 -207
- package/dist/plan-TVQSEKYL.js.map +0 -1
- package/dist/preview-CWRGDFCP.js +0 -216
- package/dist/preview-CWRGDFCP.js.map +0 -1
- package/dist/promoted-tweet-writes-SZN74JHY.js +0 -181
- package/dist/promoted-tweet-writes-SZN74JHY.js.map +0 -1
- package/dist/promoted-tweets-7P4TSQU7.js +0 -119
- package/dist/publish-3DUERLGT.js +0 -342
- package/dist/publish-3DUERLGT.js.map +0 -1
- package/dist/query-QM7MBQD7.js +0 -62
- package/dist/questionnaire-LEZJLMAV.js +0 -93
- package/dist/questionnaire-LEZJLMAV.js.map +0 -1
- package/dist/reddit-SN5CESF4.js +0 -27
- package/dist/refresh-2ICQBTK4.js +0 -95
- package/dist/refresh-2ICQBTK4.js.map +0 -1
- package/dist/release-JSZ4JXYJ.js +0 -61
- package/dist/release-JSZ4JXYJ.js.map +0 -1
- package/dist/relevant-pages-VOICMQ7U.js +0 -99
- package/dist/remove-TFUAVRFM.js +0 -51
- package/dist/remove-TFUAVRFM.js.map +0 -1
- package/dist/reopen-5T2PE7MU.js +0 -64
- package/dist/reopen-5T2PE7MU.js.map +0 -1
- package/dist/rerun-EZJ4MLYG.js +0 -93
- package/dist/rerun-EZJ4MLYG.js.map +0 -1
- package/dist/research-BKYSU2C6.js +0 -263
- package/dist/research-BKYSU2C6.js.map +0 -1
- package/dist/research-QU63CJB5.js +0 -72
- package/dist/reset-DKTKZF7G.js +0 -55
- package/dist/reset-DKTKZF7G.js.map +0 -1
- package/dist/reset-SXABIVP6.js +0 -55
- package/dist/reset-SXABIVP6.js.map +0 -1
- package/dist/resolve-L47U2T77.js +0 -122
- package/dist/resolve-L47U2T77.js.map +0 -1
- package/dist/retry-JEWPK2B5.js +0 -63
- package/dist/retry-JEWPK2B5.js.map +0 -1
- package/dist/retry-SXFVLT3W.js +0 -61
- package/dist/retry-SXFVLT3W.js.map +0 -1
- package/dist/revenue-2MAYTXRM.js +0 -89
- package/dist/revenue-2MAYTXRM.js.map +0 -1
- package/dist/rule-writes-S3RN47OG.js +0 -523
- package/dist/rule-writes-S3RN47OG.js.map +0 -1
- package/dist/rules-CHWTFASP.js +0 -97
- package/dist/rules-CHWTFASP.js.map +0 -1
- package/dist/rules-KTJ2ZZ62.js +0 -217
- package/dist/rules-add-3M5TALWN.js +0 -463
- package/dist/rules-add-3M5TALWN.js.map +0 -1
- package/dist/run-2DLA6YO4.js +0 -68
- package/dist/run-JCGH2NHD.js +0 -67
- package/dist/run-JCGH2NHD.js.map +0 -1
- package/dist/scaffold-ad-VEW7JDY7.js +0 -1514
- package/dist/scaffold-ad-VEW7JDY7.js.map +0 -1
- package/dist/scaffold-static-ad-DYRL7DOS.js +0 -1013
- package/dist/scaffold-static-ad-DYRL7DOS.js.map +0 -1
- package/dist/scaffold-video-YRAVVKUH.js +0 -886
- package/dist/scaffold-video-YRAVVKUH.js.map +0 -1
- package/dist/schedule-WYIC6VNW.js +0 -62
- package/dist/schedule-WYIC6VNW.js.map +0 -1
- package/dist/scheduled-agents-FRBF4EOK.js +0 -55
- package/dist/schema-TC2O3FYY.js +0 -133
- package/dist/schema-TC2O3FYY.js.map +0 -1
- package/dist/search-VDW242BN.js +0 -175
- package/dist/search-VDW242BN.js.map +0 -1
- package/dist/select-O5HSSC36.js +0 -104
- package/dist/select-O5HSSC36.js.map +0 -1
- package/dist/sends-6FI7WELX.js +0 -348
- package/dist/sends-6FI7WELX.js.map +0 -1
- package/dist/set-prompt-TI7N64PJ.js +0 -196
- package/dist/set-prompt-TI7N64PJ.js.map +0 -1
- package/dist/setup-links-BM2FTXUZ.js +0 -142
- package/dist/setup-links-BM2FTXUZ.js.map +0 -1
- package/dist/shopify-FIHG5PYP.js +0 -3956
- package/dist/shopify-FIHG5PYP.js.map +0 -1
- package/dist/site-S3IGBMVC.js +0 -178
- package/dist/site-S3IGBMVC.js.map +0 -1
- package/dist/sources-77WLFY4Y.js +0 -30
- package/dist/sources-A4B3R5JC.js +0 -455
- package/dist/sources-A4B3R5JC.js.map +0 -1
- package/dist/stale-YIRCXDOK.js +0 -74
- package/dist/stale-YIRCXDOK.js.map +0 -1
- package/dist/status-6YNR647D.js +0 -63
- package/dist/status-6YNR647D.js.map +0 -1
- package/dist/studies-ZOEUY6YP.js +0 -250
- package/dist/study-writes-DTGMCNFP.js +0 -468
- package/dist/study-writes-DTGMCNFP.js.map +0 -1
- package/dist/sync-FFVWHGLE.js +0 -55
- package/dist/sync-FFVWHGLE.js.map +0 -1
- package/dist/sync-definition-K4XOAG2B.js +0 -67
- package/dist/tags-5KIOGEKN.js +0 -21
- package/dist/tags-5KIOGEKN.js.map +0 -1
- package/dist/tags-BKAN5EAJ.js +0 -21
- package/dist/tags-BKAN5EAJ.js.map +0 -1
- package/dist/tags-ETOOYQ57.js +0 -26
- package/dist/tags-RPNK7TMO.js +0 -225
- package/dist/tags-RPNK7TMO.js.map +0 -1
- package/dist/tags-UM4QO46J.js +0 -21
- package/dist/tags-UM4QO46J.js.map +0 -1
- package/dist/targeting-VBQY3HUN.js +0 -760
- package/dist/targeting-VBQY3HUN.js.map +0 -1
- package/dist/targeting-criteria-L4DYIJZI.js +0 -113
- package/dist/targets-S6N7327Q.js +0 -104
- package/dist/targets-S6N7327Q.js.map +0 -1
- package/dist/testimonials-65N7IYN7.js +0 -32
- package/dist/themes-B4LCQUXB.js +0 -95
- package/dist/top-companies-SJKND75M.js +0 -109
- package/dist/top-companies-SJKND75M.js.map +0 -1
- package/dist/transcript-5I7I6DWL.js +0 -163
- package/dist/transcript-5I7I6DWL.js.map +0 -1
- package/dist/translate-SH6IG5Y7.js +0 -607
- package/dist/translate-SH6IG5Y7.js.map +0 -1
- package/dist/triggers-YRY3HTYU.js +0 -142
- package/dist/triggers-YRY3HTYU.js.map +0 -1
- package/dist/unlink-4B4YTQE4.js +0 -68
- package/dist/unlink-4B4YTQE4.js.map +0 -1
- package/dist/unstage-H5NTDJ6A.js +0 -86
- package/dist/unstage-H5NTDJ6A.js.map +0 -1
- package/dist/unstage-MDSSPUKV.js +0 -95
- package/dist/unstage-MDSSPUKV.js.map +0 -1
- package/dist/update-DI52JJGB.js +0 -99
- package/dist/update-DI52JJGB.js.map +0 -1
- package/dist/update-DMPDLMMV.js +0 -64
- package/dist/update-DMPDLMMV.js.map +0 -1
- package/dist/update-TUS4PJIG.js +0 -190
- package/dist/update-TUS4PJIG.js.map +0 -1
- package/dist/update-Z66LMXNS.js +0 -153
- package/dist/update-Z66LMXNS.js.map +0 -1
- package/dist/upload-7KQYZ7T7.js +0 -127
- package/dist/upload-7KQYZ7T7.js.map +0 -1
- package/dist/url-options-IHL4OU4C.js +0 -130
- package/dist/url-options-IHL4OU4C.js.map +0 -1
- package/dist/url-params-SDA2MWB5.js +0 -99
- package/dist/url-params-SDA2MWB5.js.map +0 -1
- package/dist/validate-ZABZNCSB.js +0 -120
- package/dist/validate-ZABZNCSB.js.map +0 -1
- package/dist/videos-BKVCCKIH.js +0 -41
- package/dist/viewer-check-B5O7ZY3Q.js +0 -81
- package/dist/web-KN3BTVG4.js +0 -141
- package/dist/web-KN3BTVG4.js.map +0 -1
- package/dist/winning-ads-JIDPISKM.js +0 -86
- package/dist/write-commands-K6M3RTVK.js +0 -1170
- package/dist/write-commands-K6M3RTVK.js.map +0 -1
- package/dist/write-commands-RVHLLLDR.js +0 -1498
- package/dist/write-commands-RVHLLLDR.js.map +0 -1
- package/dist/x-NLGWZCGX.js +0 -47
- /package/dist/{account-assets-O7IA37RE.js.map → account-assets-J5Z4URLQ.js.map} +0 -0
- /package/dist/{account-reads-SNOWDHHF.js.map → account-reads-2MSUVG46.js.map} +0 -0
- /package/dist/{actions-Y4SULW2E.js.map → actions-D7OWCP36.js.map} +0 -0
- /package/dist/{ads-2TVWICGM.js.map → ads-HLUJB5SQ.js.map} +0 -0
- /package/dist/{ads-KBE5JXCH.js.map → ads-MAOI7S6V.js.map} +0 -0
- /package/dist/{adsets-YWBJFPAZ.js.map → adsets-QRKICEFD.js.map} +0 -0
- /package/dist/{asset-writes-72DEVXGO.js.map → asset-writes-JLVUAVUZ.js.map} +0 -0
- /package/dist/{audiences-QAH42HIM.js.map → audiences-CDDI5HR5.js.map} +0 -0
- /package/dist/{avatars-P4UPNZM4.js.map → avatars-WZ2JDMHH.js.map} +0 -0
- /package/dist/{brand-HALQWZWB.js.map → brand-IZTTBZII.js.map} +0 -0
- /package/dist/{campaigns-YMM5TQVO.js.map → campaigns-4Y3JQC2U.js.map} +0 -0
- /package/dist/{campaigns-XZOQ2VTK.js.map → campaigns-HES5MDUG.js.map} +0 -0
- /package/dist/{canvas-IJS7H3VE.js.map → canvas-IQ753Q2O.js.map} +0 -0
- /package/dist/{changes-36C754R4.js.map → changes-VWKTM27U.js.map} +0 -0
- /package/dist/{chatgpt-3WFOPURY.js.map → chatgpt-OPOD2WHB.js.map} +0 -0
- /package/dist/{chunk-DUR7PEJI.js.map → chunk-2GYCWRF3.js.map} +0 -0
- /package/dist/{chunk-QBRPM3DQ.js.map → chunk-2L7F7KR4.js.map} +0 -0
- /package/dist/{chunk-4GAEB6NK.js.map → chunk-44ZRCSR7.js.map} +0 -0
- /package/dist/{chunk-2TOIY2WN.js.map → chunk-46YLDIQG.js.map} +0 -0
- /package/dist/{chunk-R53XMPDO.js.map → chunk-4EDWXZ3I.js.map} +0 -0
- /package/dist/{chunk-H4NNQGG6.js.map → chunk-4FFBGR5L.js.map} +0 -0
- /package/dist/{chunk-XGPU2VDU.js.map → chunk-4UQRXKYJ.js.map} +0 -0
- /package/dist/{chunk-N7M2TWR5.js.map → chunk-4UZUUSVL.js.map} +0 -0
- /package/dist/{chunk-I47BEKYK.js.map → chunk-4XHCEYHI.js.map} +0 -0
- /package/dist/{chunk-SCL7PM6P.js.map → chunk-4Z6PVR3M.js.map} +0 -0
- /package/dist/{chunk-ZEC46NWW.js.map → chunk-5Y5FZV2W.js.map} +0 -0
- /package/dist/{chunk-G5Y7OIPL.js.map → chunk-6HJXLGDV.js.map} +0 -0
- /package/dist/{chunk-QW6HL7D6.js.map → chunk-6S5CWGDA.js.map} +0 -0
- /package/dist/{chunk-5RVQK3SP.js.map → chunk-6VYROVWO.js.map} +0 -0
- /package/dist/{chunk-TVAIOC77.js.map → chunk-7BUIOP36.js.map} +0 -0
- /package/dist/{chunk-NDFS3APP.js.map → chunk-AQRXXC6E.js.map} +0 -0
- /package/dist/{chunk-ZFC562TP.js.map → chunk-ARBXT73X.js.map} +0 -0
- /package/dist/{chunk-KQTNUDKD.js.map → chunk-BEZHQIEI.js.map} +0 -0
- /package/dist/{chunk-5SRUAGTG.js.map → chunk-BFURWHVR.js.map} +0 -0
- /package/dist/{chunk-KBRJSPIM.js.map → chunk-DSCEXBDR.js.map} +0 -0
- /package/dist/{chunk-Z7YMSHRZ.js.map → chunk-FLWDFPXE.js.map} +0 -0
- /package/dist/{chunk-GACSA5A6.js.map → chunk-FRNBRN2C.js.map} +0 -0
- /package/dist/{chunk-C7QQQVBS.js.map → chunk-GE3VT3CA.js.map} +0 -0
- /package/dist/{chunk-P6BKKUSX.js.map → chunk-HGBJQGO5.js.map} +0 -0
- /package/dist/{chunk-MGYC2IRC.js.map → chunk-I7AYMJZA.js.map} +0 -0
- /package/dist/{chunk-BRLZX3VP.js.map → chunk-IRM273C7.js.map} +0 -0
- /package/dist/{chunk-AYPBARKP.js.map → chunk-IWKD56AY.js.map} +0 -0
- /package/dist/{chunk-MZCTX37B.js.map → chunk-JLAQWMVF.js.map} +0 -0
- /package/dist/{chunk-AQOFQNKQ.js.map → chunk-K6NULQN7.js.map} +0 -0
- /package/dist/{chunk-GMHCHHAA.js.map → chunk-L2BRAC2J.js.map} +0 -0
- /package/dist/{chunk-SVBJ56T7.js.map → chunk-LGMI4LSY.js.map} +0 -0
- /package/dist/{chunk-OJGYYH6K.js.map → chunk-NB2FU6EZ.js.map} +0 -0
- /package/dist/{chunk-TVTSA4EN.js.map → chunk-NWF2LRKO.js.map} +0 -0
- /package/dist/{chunk-6Z7Y4KQB.js.map → chunk-OG47L5GG.js.map} +0 -0
- /package/dist/{chunk-AIRD6T4W.js.map → chunk-OR6KVLI5.js.map} +0 -0
- /package/dist/{chunk-OBJCNGZL.js.map → chunk-QDQZ62FL.js.map} +0 -0
- /package/dist/{chunk-FPWQA7TK.js.map → chunk-QIOFOD4K.js.map} +0 -0
- /package/dist/{chunk-XQXZJ5IR.js.map → chunk-R2SYF5FC.js.map} +0 -0
- /package/dist/{chunk-YMF2RG4Z.js.map → chunk-RTH2I55B.js.map} +0 -0
- /package/dist/{chunk-FFFJBNHA.js.map → chunk-S6VFDNSQ.js.map} +0 -0
- /package/dist/{chunk-ZNRGH4NS.js.map → chunk-SG2TDQEE.js.map} +0 -0
- /package/dist/{chunk-RFIUOQLN.js.map → chunk-T3P6O2VU.js.map} +0 -0
- /package/dist/{chunk-BTJSGJNQ.js.map → chunk-TXDE2QJ3.js.map} +0 -0
- /package/dist/{chunk-HSQRITKG.js.map → chunk-UDIEKCIR.js.map} +0 -0
- /package/dist/{chunk-MBSFEVOG.js.map → chunk-USCADMM3.js.map} +0 -0
- /package/dist/{chunk-SM7G7RUA.js.map → chunk-UUGISMNE.js.map} +0 -0
- /package/dist/{chunk-Z2DRGXBB.js.map → chunk-VDPOCAQ2.js.map} +0 -0
- /package/dist/{chunk-PLAOK4AK.js.map → chunk-VEJ3QX6M.js.map} +0 -0
- /package/dist/{chunk-ARUXGKZO.js.map → chunk-VFJB7OG6.js.map} +0 -0
- /package/dist/{chunk-RVEY7BTT.js.map → chunk-VRIPVLE7.js.map} +0 -0
- /package/dist/{chunk-5XTGG4PV.js.map → chunk-WFY7KSHB.js.map} +0 -0
- /package/dist/{chunk-D3KLDIPQ.js.map → chunk-WLESMH4J.js.map} +0 -0
- /package/dist/{chunk-PLBITHV6.js.map → chunk-XHQYFNNK.js.map} +0 -0
- /package/dist/{chunk-QMDMTZAW.js.map → chunk-YILZR3XI.js.map} +0 -0
- /package/dist/{chunk-W574NV67.js.map → chunk-YJFLXOH4.js.map} +0 -0
- /package/dist/{chunk-MUXKYSTI.js.map → chunk-YWHZYR6S.js.map} +0 -0
- /package/dist/{connect-PP6Z3F7Y.js.map → connect-3YY7MF3I.js.map} +0 -0
- /package/dist/{conversion-upload-command-KTYAY7IG.js.map → conversion-upload-command-7RSZ5ZQU.js.map} +0 -0
- /package/dist/{creatives-UJDPD4CI.js.map → creatives-2DR3QHJW.js.map} +0 -0
- /package/dist/{creatives-JPKA2RHU.js.map → creatives-BB6S2OF6.js.map} +0 -0
- /package/dist/{currency-R4ORE2U3.js.map → currency-X7Y6TSLF.js.map} +0 -0
- /package/dist/{custom-conversions-5HJBB5XL.js.map → custom-conversions-HAGG72LF.js.map} +0 -0
- /package/dist/{customers-7J3QGSOJ.js.map → customers-663K2OCP.js.map} +0 -0
- /package/dist/{discover-GSJRZUOC.js.map → discover-6DORQWXY.js.map} +0 -0
- /package/dist/{draft-WYDMLNYA.js.map → draft-R6EKORNS.js.map} +0 -0
- /package/dist/{fit-N7WDGWYZ.js.map → fit-BEFCY2B4.js.map} +0 -0
- /package/dist/{fonts-TTUAP7HS.js.map → fonts-C6XN5667.js.map} +0 -0
- /package/dist/{forecast-4AG5F7YC.js.map → forecast-BTPIXEQ5.js.map} +0 -0
- /package/dist/{google-NAA4BASO.js.map → google-M6BJ22UL.js.map} +0 -0
- /package/dist/{ideas-SUXKKZC7.js.map → ideas-M66FU45H.js.map} +0 -0
- /package/dist/{images-VKVZ3DWG.js.map → images-MM5OPUKV.js.map} +0 -0
- /package/dist/{ingest-BBBFT6FZ.js.map → ingest-KMLYCFF4.js.map} +0 -0
- /package/dist/{intent-NSHW7EJT.js.map → intent-YCQCUCV3.js.map} +0 -0
- /package/dist/{keyword-gap-ITTWKBWZ.js.map → keyword-gap-PUSF7EKY.js.map} +0 -0
- /package/dist/{landing-KZ4OSHHR.js.map → landing-OZU5RRFV.js.map} +0 -0
- /package/dist/{languages-MEFQQBJ2.js.map → languages-SLFV73GE.js.map} +0 -0
- /package/dist/{line-items-G5YJG25N.js.map → line-items-NJMEPEF5.js.map} +0 -0
- /package/dist/{locations-RLWAS6AC.js.map → locations-T2OMP6QN.js.map} +0 -0
- /package/dist/{lookup-ZJIP2M4X.js.map → lookup-S5VG7AWH.js.map} +0 -0
- /package/dist/{media-ZWN7E777.js.map → media-P4T4ZBNS.js.map} +0 -0
- /package/dist/{media-sources-GKSEDSE3.js.map → media-sources-EQI3U4TC.js.map} +0 -0
- /package/dist/{meta-EHKXH257.js.map → meta-IPLWNYC7.js.map} +0 -0
- /package/dist/{metrics-K6FDCMK7.js.map → metrics-4YVJHYRI.js.map} +0 -0
- /package/dist/{performance-6TPJGM6A.js.map → performance-NIF3CESZ.js.map} +0 -0
- /package/dist/{promoted-tweets-7P4TSQU7.js.map → promoted-tweets-RJT53DRM.js.map} +0 -0
- /package/dist/{query-QM7MBQD7.js.map → query-XZMDGRO5.js.map} +0 -0
- /package/dist/{reddit-SN5CESF4.js.map → reddit-JIHMAKAQ.js.map} +0 -0
- /package/dist/{relevant-pages-VOICMQ7U.js.map → relevant-pages-FS7GBVXK.js.map} +0 -0
- /package/dist/{research-QU63CJB5.js.map → research-PNBACCCP.js.map} +0 -0
- /package/dist/{rules-KTJ2ZZ62.js.map → rules-ZVS2MWED.js.map} +0 -0
- /package/dist/{run-2DLA6YO4.js.map → run-QCNRR3CA.js.map} +0 -0
- /package/dist/{scheduled-agents-FRBF4EOK.js.map → scheduled-agents-OXYAVSIE.js.map} +0 -0
- /package/dist/{sources-77WLFY4Y.js.map → sources-FLUGHSVP.js.map} +0 -0
- /package/dist/{studies-ZOEUY6YP.js.map → studies-EPO2AM4M.js.map} +0 -0
- /package/dist/{sync-definition-K4XOAG2B.js.map → sync-definition-OGQ5XTQE.js.map} +0 -0
- /package/dist/{tags-ETOOYQ57.js.map → tags-CZTRQNXV.js.map} +0 -0
- /package/dist/{targeting-criteria-L4DYIJZI.js.map → targeting-criteria-AQYXVSGN.js.map} +0 -0
- /package/dist/{testimonials-65N7IYN7.js.map → testimonials-G3OCNPBY.js.map} +0 -0
- /package/dist/{themes-B4LCQUXB.js.map → themes-FEVYZZCW.js.map} +0 -0
- /package/dist/{videos-BKVCCKIH.js.map → videos-36AXDUGZ.js.map} +0 -0
- /package/dist/{viewer-check-B5O7ZY3Q.js.map → viewer-check-6HL4OUQY.js.map} +0 -0
- /package/dist/{winning-ads-JIDPISKM.js.map → winning-ads-GMM5W2O4.js.map} +0 -0
- /package/dist/{x-NLGWZCGX.js.map → x-HGFAL3NY.js.map} +0 -0
package/dist/chunk-7J3NZBPV.js
DELETED
|
@@ -1,2982 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
INGEST_CLICK_ID_PARAMS,
|
|
3
|
-
MATCH_COOKIES,
|
|
4
|
-
isSha256Hex,
|
|
5
|
-
normalizeIdentity,
|
|
6
|
-
templateMentions
|
|
7
|
-
} from "./chunk-EDLZGTGN.js";
|
|
8
|
-
|
|
9
|
-
// ../api/src/analytics/adParams.ts
|
|
10
|
-
var AD_PARAM_ROLES = [
|
|
11
|
-
"campaign_id",
|
|
12
|
-
"campaign_name",
|
|
13
|
-
"adgroup_id",
|
|
14
|
-
"adgroup_name",
|
|
15
|
-
"ad_id",
|
|
16
|
-
"ad_name",
|
|
17
|
-
"keyword",
|
|
18
|
-
"match_type",
|
|
19
|
-
"search_query",
|
|
20
|
-
"audience",
|
|
21
|
-
"placement",
|
|
22
|
-
"network",
|
|
23
|
-
"site_source",
|
|
24
|
-
"device",
|
|
25
|
-
"product_id",
|
|
26
|
-
"account_name",
|
|
27
|
-
"other",
|
|
28
|
-
"ignore"
|
|
29
|
-
];
|
|
30
|
-
var AD_PARAM_ROLE_SPECS = {
|
|
31
|
-
campaign_id: { role: "campaign_id", label: "Campaign ID", description: "The top level of this account's structure." },
|
|
32
|
-
campaign_name: { role: "campaign_name", label: "Campaign name", description: "The campaign's name." },
|
|
33
|
-
adgroup_id: { role: "adgroup_id", label: "Ad group ID", description: "The targeting container inside a campaign." },
|
|
34
|
-
adgroup_name: { role: "adgroup_name", label: "Ad group name", description: "The ad group's name." },
|
|
35
|
-
ad_id: { role: "ad_id", label: "Ad ID", description: "The individual ad that was clicked." },
|
|
36
|
-
ad_name: { role: "ad_name", label: "Ad name", description: "The individual ad's name." },
|
|
37
|
-
keyword: {
|
|
38
|
-
role: "keyword",
|
|
39
|
-
label: "Keyword",
|
|
40
|
-
description: "The keyword that matched, as it is written in the account \u2014 not what the visitor typed."
|
|
41
|
-
},
|
|
42
|
-
match_type: {
|
|
43
|
-
role: "match_type",
|
|
44
|
-
label: "Match type",
|
|
45
|
-
description: "How loosely the keyword matched: broad, phrase or exact."
|
|
46
|
-
},
|
|
47
|
-
search_query: { role: "search_query", label: "Search query", description: "What the visitor actually typed." },
|
|
48
|
-
audience: {
|
|
49
|
-
role: "audience",
|
|
50
|
-
label: "Audience",
|
|
51
|
-
description: "The remarketing list or interest segment the visitor was in."
|
|
52
|
-
},
|
|
53
|
-
placement: {
|
|
54
|
-
role: "placement",
|
|
55
|
-
label: "Placement",
|
|
56
|
-
description: "Where the ad appeared \u2014 a feed, a story, a site on the display network."
|
|
57
|
-
},
|
|
58
|
-
network: {
|
|
59
|
-
role: "network",
|
|
60
|
-
label: "Network",
|
|
61
|
-
description: "Which network served it: search, a search partner, display, or a video surface."
|
|
62
|
-
},
|
|
63
|
-
site_source: {
|
|
64
|
-
role: "site_source",
|
|
65
|
-
label: "App",
|
|
66
|
-
description: "Which app the click came from, on platforms that span several."
|
|
67
|
-
},
|
|
68
|
-
device: { role: "device", label: "Device", description: "Mobile, tablet or desktop, as the platform saw it." },
|
|
69
|
-
product_id: { role: "product_id", label: "Product ID", description: "The shopping item that was clicked." },
|
|
70
|
-
account_name: {
|
|
71
|
-
role: "account_name",
|
|
72
|
-
label: "Account name",
|
|
73
|
-
description: "Which ad account paid for the click, where an agency runs several."
|
|
74
|
-
},
|
|
75
|
-
other: {
|
|
76
|
-
role: "other",
|
|
77
|
-
label: "Something else",
|
|
78
|
-
description: "Keep the values and let me filter by this name, without saying what it means."
|
|
79
|
-
},
|
|
80
|
-
ignore: {
|
|
81
|
-
role: "ignore",
|
|
82
|
-
label: "Ignore it",
|
|
83
|
-
description: "Not campaign information. Baker stops storing it and stops asking about it."
|
|
84
|
-
}
|
|
85
|
-
};
|
|
86
|
-
var RESERVED_PARAM_NAMES = [
|
|
87
|
-
"utm_source",
|
|
88
|
-
"utm_medium",
|
|
89
|
-
"utm_campaign",
|
|
90
|
-
"utm_content",
|
|
91
|
-
"utm_term",
|
|
92
|
-
"utm_id"
|
|
93
|
-
];
|
|
94
|
-
var AD_PLATFORMS = [
|
|
95
|
-
"google",
|
|
96
|
-
"meta",
|
|
97
|
-
"microsoft",
|
|
98
|
-
"linkedin",
|
|
99
|
-
"tiktok",
|
|
100
|
-
"reddit",
|
|
101
|
-
"pinterest",
|
|
102
|
-
"snapchat",
|
|
103
|
-
"chatgpt"
|
|
104
|
-
];
|
|
105
|
-
function isAdPlatform(value) {
|
|
106
|
-
return AD_PLATFORMS.includes(value);
|
|
107
|
-
}
|
|
108
|
-
var GOOGLE = {
|
|
109
|
-
platform: "google",
|
|
110
|
-
label: "Google Ads",
|
|
111
|
-
docs: "https://developers.google.com/google-ads/api/docs/reporting/valuetrack-mapping",
|
|
112
|
-
dimensions: [
|
|
113
|
-
{ role: "campaign_id", macro: "{campaignid}", names: ["campaign_id", "campaignid", "gad_campaignid"] },
|
|
114
|
-
{ role: "adgroup_id", macro: "{adgroupid}", names: ["adgroup_id", "adgroupid"] },
|
|
115
|
-
{
|
|
116
|
-
role: "ad_id",
|
|
117
|
-
macro: "{creative}",
|
|
118
|
-
names: ["ad_id", "creative", "adid"],
|
|
119
|
-
note: "ValueTrack calls the ad id {creative}."
|
|
120
|
-
},
|
|
121
|
-
{ role: "keyword", macro: "{keyword}", names: ["keyword", "kw"] },
|
|
122
|
-
{
|
|
123
|
-
role: "match_type",
|
|
124
|
-
macro: "{matchtype}",
|
|
125
|
-
names: ["match_type", "matchtype", "mt"],
|
|
126
|
-
note: "b broad, p phrase, e exact, a AI Max."
|
|
127
|
-
},
|
|
128
|
-
{
|
|
129
|
-
role: "network",
|
|
130
|
-
macro: "{network}",
|
|
131
|
-
names: ["network", "gad_source"],
|
|
132
|
-
note: "g search, s partner, d display, ytv YouTube."
|
|
133
|
-
},
|
|
134
|
-
{ role: "device", macro: "{device}", names: ["device"] },
|
|
135
|
-
{ role: "placement", macro: "{placement}", names: ["placement"] },
|
|
136
|
-
{ role: "product_id", macro: "{product_id}", names: ["product_id"], note: "Shopping campaigns only." }
|
|
137
|
-
]
|
|
138
|
-
};
|
|
139
|
-
var META = {
|
|
140
|
-
platform: "meta",
|
|
141
|
-
label: "Meta Ads",
|
|
142
|
-
docs: "https://www.facebook.com/business/help/2360940870872492",
|
|
143
|
-
dimensions: [
|
|
144
|
-
{ role: "campaign_id", macro: "{{campaign.id}}", names: ["campaign_id", "campaignid"] },
|
|
145
|
-
{ role: "campaign_name", macro: "{{campaign.name}}", names: ["campaign_name", "campaignname"] },
|
|
146
|
-
{
|
|
147
|
-
role: "adgroup_id",
|
|
148
|
-
macro: "{{adset.id}}",
|
|
149
|
-
names: ["adset_id", "adgroup_id", "adsetid"],
|
|
150
|
-
note: "Meta calls an ad group an ad set."
|
|
151
|
-
},
|
|
152
|
-
{ role: "adgroup_name", macro: "{{adset.name}}", names: ["adset_name", "adgroup_name"] },
|
|
153
|
-
{ role: "ad_id", macro: "{{ad.id}}", names: ["ad_id", "adid"] },
|
|
154
|
-
{ role: "ad_name", macro: "{{ad.name}}", names: ["ad_name", "adname"] },
|
|
155
|
-
{
|
|
156
|
-
role: "placement",
|
|
157
|
-
macro: "{{placement}}",
|
|
158
|
-
names: ["placement", "placement_id"],
|
|
159
|
-
note: "feed, story, reels and the rest."
|
|
160
|
-
},
|
|
161
|
-
{
|
|
162
|
-
role: "site_source",
|
|
163
|
-
macro: "{{site_source_name}}",
|
|
164
|
-
names: ["site_source", "site_source_name"],
|
|
165
|
-
note: "fb, ig, an or msg."
|
|
166
|
-
}
|
|
167
|
-
]
|
|
168
|
-
};
|
|
169
|
-
var MICROSOFT = {
|
|
170
|
-
platform: "microsoft",
|
|
171
|
-
label: "Microsoft Advertising",
|
|
172
|
-
docs: "https://learn.microsoft.com/en-us/advertising/guides/url-tracking-upgraded-urls",
|
|
173
|
-
dimensions: [
|
|
174
|
-
{ role: "campaign_id", macro: "{CampaignId}", names: ["campaign_id", "campaignid"] },
|
|
175
|
-
{ role: "campaign_name", macro: "{Campaign}", names: ["campaign_name", "campaignname"] },
|
|
176
|
-
{ role: "adgroup_id", macro: "{AdGroupId}", names: ["adgroup_id", "adgroupid"] },
|
|
177
|
-
{ role: "adgroup_name", macro: "{AdGroup}", names: ["adgroup_name", "adgroupname"] },
|
|
178
|
-
{ role: "ad_id", macro: "{AdId}", names: ["ad_id", "adid"] },
|
|
179
|
-
{ role: "keyword", macro: "{Keyword}", names: ["keyword", "kw"] },
|
|
180
|
-
{ role: "match_type", macro: "{MatchType}", names: ["match_type", "matchtype", "mt"] },
|
|
181
|
-
{
|
|
182
|
-
role: "search_query",
|
|
183
|
-
macro: "{QueryString}",
|
|
184
|
-
names: ["search_query", "querystring"],
|
|
185
|
-
note: "What the visitor typed. Google has no equivalent."
|
|
186
|
-
},
|
|
187
|
-
{ role: "network", macro: "{Network}", names: ["network"] },
|
|
188
|
-
{ role: "device", macro: "{Device}", names: ["device"] }
|
|
189
|
-
]
|
|
190
|
-
};
|
|
191
|
-
var LINKEDIN = {
|
|
192
|
-
platform: "linkedin",
|
|
193
|
-
label: "LinkedIn Ads",
|
|
194
|
-
docs: "https://learn.microsoft.com/en-us/linkedin/marketing/integrations/ads-reporting/dynamic-utm-tracking",
|
|
195
|
-
dimensions: [
|
|
196
|
-
{ role: "account_name", macro: "{{ACCOUNT_NAME}}", names: ["account_name"] },
|
|
197
|
-
{
|
|
198
|
-
role: "campaign_id",
|
|
199
|
-
macro: "{{CAMPAIGN_GROUP_ID}}",
|
|
200
|
-
names: ["campaign_group_id", "campaign_id"],
|
|
201
|
-
note: "LinkedIn's campaign group is the level other platforms call a campaign."
|
|
202
|
-
},
|
|
203
|
-
{ role: "campaign_name", macro: "{{CAMPAIGN_GROUP_NAME}}", names: ["campaign_group_name", "campaign_name"] },
|
|
204
|
-
{
|
|
205
|
-
role: "adgroup_id",
|
|
206
|
-
macro: "{{CAMPAIGN_ID}}",
|
|
207
|
-
names: ["adgroup_id"],
|
|
208
|
-
note: "LinkedIn's campaign is the level other platforms call an ad group."
|
|
209
|
-
},
|
|
210
|
-
{ role: "adgroup_name", macro: "{{CAMPAIGN_NAME}}", names: ["adgroup_name"] },
|
|
211
|
-
{ role: "ad_id", macro: "{{CREATIVE_ID}}", names: ["creative_id", "ad_id"] },
|
|
212
|
-
{ role: "ad_name", macro: "{{CREATIVE_NAME}}", names: ["creative_name", "ad_name"] }
|
|
213
|
-
]
|
|
214
|
-
};
|
|
215
|
-
var TIKTOK = {
|
|
216
|
-
platform: "tiktok",
|
|
217
|
-
label: "TikTok Ads",
|
|
218
|
-
docs: "https://ads.tiktok.com/help/article/track-offsite-web-events-with-utm-parameters",
|
|
219
|
-
dimensions: [
|
|
220
|
-
{ role: "campaign_id", macro: "__CAMPAIGN_ID__", names: ["campaign_id", "campaignid"] },
|
|
221
|
-
{ role: "campaign_name", macro: "__CAMPAIGN_NAME__", names: ["campaign_name", "campaignname"] },
|
|
222
|
-
{
|
|
223
|
-
role: "adgroup_id",
|
|
224
|
-
macro: "__AID__",
|
|
225
|
-
names: ["adgroup_id", "aid"],
|
|
226
|
-
note: "__AID__ is the ad GROUP id, not the ad id."
|
|
227
|
-
},
|
|
228
|
-
{ role: "adgroup_name", macro: "__AID_NAME__", names: ["adgroup_name"] },
|
|
229
|
-
{
|
|
230
|
-
role: "ad_id",
|
|
231
|
-
macro: "__CID__",
|
|
232
|
-
names: ["ad_id", "cid"],
|
|
233
|
-
note: "__CID__ is the creative id, not the campaign id."
|
|
234
|
-
},
|
|
235
|
-
{ role: "ad_name", macro: "__CID_NAME__", names: ["ad_name"] },
|
|
236
|
-
{ role: "placement", macro: "__PLACEMENT__", names: ["placement"], note: "TikTok or TikTok Pangle." }
|
|
237
|
-
]
|
|
238
|
-
};
|
|
239
|
-
var REDDIT = {
|
|
240
|
-
platform: "reddit",
|
|
241
|
-
label: "Reddit Ads",
|
|
242
|
-
docs: "https://business.reddithelp.com/s/article/URL-Parameters",
|
|
243
|
-
dimensions: [
|
|
244
|
-
{ role: "campaign_id", macro: "{{CAMPAIGN_ID}}", names: ["campaign_id", "campaignid"] },
|
|
245
|
-
{ role: "campaign_name", macro: "{{CAMPAIGN_NAME}}", names: ["campaign_name"] },
|
|
246
|
-
{ role: "adgroup_id", macro: "{{ADGROUP_ID}}", names: ["adgroup_id", "ad_group_id"] },
|
|
247
|
-
{ role: "adgroup_name", macro: "{{ADGROUP_NAME}}", names: ["adgroup_name", "ad_group_name"] },
|
|
248
|
-
{ role: "ad_id", macro: "{{AD_ID}}", names: ["ad_id", "adid"] },
|
|
249
|
-
{ role: "ad_name", macro: "{{AD_NAME}}", names: ["ad_name"] },
|
|
250
|
-
{ role: "device", macro: "{{DEVICE_GROUP}}", names: ["device", "device_group"] }
|
|
251
|
-
]
|
|
252
|
-
};
|
|
253
|
-
var PINTEREST = {
|
|
254
|
-
platform: "pinterest",
|
|
255
|
-
label: "Pinterest Ads",
|
|
256
|
-
docs: "https://help.pinterest.com/en/business/article/third-party-and-dynamic-tracking",
|
|
257
|
-
dimensions: [
|
|
258
|
-
{ role: "campaign_id", macro: "{campaignid}", names: ["campaign_id", "campaignid"] },
|
|
259
|
-
{ role: "campaign_name", macro: "{campaign_name}", names: ["campaign_name", "campaignname"] },
|
|
260
|
-
{ role: "adgroup_id", macro: "{adgroupid}", names: ["adgroup_id", "adgroupid"] },
|
|
261
|
-
{ role: "adgroup_name", macro: "{ad_group_name}", names: ["adgroup_name", "adgroupname"] },
|
|
262
|
-
{
|
|
263
|
-
role: "ad_id",
|
|
264
|
-
macro: "{adid}",
|
|
265
|
-
names: ["ad_id", "adid", "creative_id"],
|
|
266
|
-
note: "The promoted Pin, not the Pin itself."
|
|
267
|
-
},
|
|
268
|
-
{ role: "device", macro: "{device}", names: ["device"], note: "c computer, m mobile, t tablet." },
|
|
269
|
-
{ role: "product_id", macro: "{product_id}", names: ["product_id"], note: "Shopping campaigns only." }
|
|
270
|
-
]
|
|
271
|
-
};
|
|
272
|
-
var SNAPCHAT = {
|
|
273
|
-
platform: "snapchat",
|
|
274
|
-
label: "Snapchat Ads",
|
|
275
|
-
docs: "https://businesshelp.snapchat.com/s/article/url-parameters",
|
|
276
|
-
dimensions: [
|
|
277
|
-
{ role: "campaign_id", macro: "{{campaign.id}}", names: ["campaign_id", "campaignid"] },
|
|
278
|
-
{ role: "campaign_name", macro: "{{campaign.name}}", names: ["campaign_name"] },
|
|
279
|
-
{
|
|
280
|
-
role: "adgroup_id",
|
|
281
|
-
macro: "{{adSet.id}}",
|
|
282
|
-
names: ["adset_id", "adgroup_id"],
|
|
283
|
-
note: "Case-sensitive: {{adset.id}} does not resolve."
|
|
284
|
-
},
|
|
285
|
-
{ role: "adgroup_name", macro: "{{adSet.name}}", names: ["adset_name", "adgroup_name"] },
|
|
286
|
-
{ role: "ad_id", macro: "{{ad.id}}", names: ["ad_id", "adid"] },
|
|
287
|
-
{ role: "ad_name", macro: "{{creative.name}}", names: ["ad_name", "creative_name"] }
|
|
288
|
-
]
|
|
289
|
-
};
|
|
290
|
-
var CHATGPT = {
|
|
291
|
-
platform: "chatgpt",
|
|
292
|
-
label: "ChatGPT Ads",
|
|
293
|
-
docs: "https://help.openai.com/en/articles/20001212-create-ads-for-chatgpt",
|
|
294
|
-
dimensions: [
|
|
295
|
-
{ role: "campaign_id", macro: "{campaign_id}", names: ["campaign_id", "campaignid"] },
|
|
296
|
-
{ role: "adgroup_id", macro: "{ad_group_id}", names: ["ad_group_id", "adgroup_id"] },
|
|
297
|
-
{ role: "ad_id", macro: "{ad_id}", names: ["ad_id", "adid"] }
|
|
298
|
-
]
|
|
299
|
-
};
|
|
300
|
-
var AD_PLATFORM_DEFINITIONS = {
|
|
301
|
-
google: GOOGLE,
|
|
302
|
-
meta: META,
|
|
303
|
-
microsoft: MICROSOFT,
|
|
304
|
-
linkedin: LINKEDIN,
|
|
305
|
-
tiktok: TIKTOK,
|
|
306
|
-
reddit: REDDIT,
|
|
307
|
-
pinterest: PINTEREST,
|
|
308
|
-
snapchat: SNAPCHAT,
|
|
309
|
-
chatgpt: CHATGPT
|
|
310
|
-
};
|
|
311
|
-
var ESSENTIAL_ROLES = ["campaign_id", "adgroup_id", "ad_id", "keyword", "match_type"];
|
|
312
|
-
function essentialAdDimensions(platform) {
|
|
313
|
-
return AD_PLATFORM_DEFINITIONS[platform].dimensions.filter((entry) => ESSENTIAL_ROLES.includes(entry.role));
|
|
314
|
-
}
|
|
315
|
-
function normalizeAdParamName(raw) {
|
|
316
|
-
return raw.trim().toLowerCase().slice(0, 64);
|
|
317
|
-
}
|
|
318
|
-
function builtinFor(platform) {
|
|
319
|
-
const mapping = {};
|
|
320
|
-
for (const dimension of AD_PLATFORM_DEFINITIONS[platform].dimensions) {
|
|
321
|
-
for (const name of dimension.names) mapping[normalizeAdParamName(name)] = dimension.role;
|
|
322
|
-
}
|
|
323
|
-
return mapping;
|
|
324
|
-
}
|
|
325
|
-
var BUILTIN = Object.fromEntries(
|
|
326
|
-
AD_PLATFORMS.map((platform) => [platform, builtinFor(platform)])
|
|
327
|
-
);
|
|
328
|
-
function builtinAdParamMapping(platform) {
|
|
329
|
-
return BUILTIN[platform];
|
|
330
|
-
}
|
|
331
|
-
var EVERY_BUILTIN_AD_PARAM_NAME = [
|
|
332
|
-
...new Set(AD_PLATFORMS.flatMap((platform) => Object.keys(BUILTIN[platform])))
|
|
333
|
-
].sort();
|
|
334
|
-
var CAPTURED_WITHOUT_ROLE = [
|
|
335
|
-
"account_id",
|
|
336
|
-
"audience",
|
|
337
|
-
"device_model",
|
|
338
|
-
"devicemodel",
|
|
339
|
-
"experiment",
|
|
340
|
-
"extensionid",
|
|
341
|
-
"feed_item_id",
|
|
342
|
-
"feeditemid",
|
|
343
|
-
"loc_interest_ms",
|
|
344
|
-
"loc_physical_ms",
|
|
345
|
-
"location_interest",
|
|
346
|
-
"location_physical",
|
|
347
|
-
"target_id",
|
|
348
|
-
"targetid"
|
|
349
|
-
].sort();
|
|
350
|
-
|
|
351
|
-
// ../api/src/analytics/eventKey.ts
|
|
352
|
-
var SEP = ":";
|
|
353
|
-
function formEventKey(flowSlug, nodeId, triggerId) {
|
|
354
|
-
return ["form", flowSlug, nodeId, triggerId].join(SEP);
|
|
355
|
-
}
|
|
356
|
-
var STORE_PURCHASE_KEY = "page:purchase";
|
|
357
|
-
var CHECKOUT_RECORD_KEY = "page:purchase_observed";
|
|
358
|
-
function isCheckoutRecordKey(key) {
|
|
359
|
-
return key.trim() === CHECKOUT_RECORD_KEY;
|
|
360
|
-
}
|
|
361
|
-
var CHECKOUT_RECORD_REFUSAL = {
|
|
362
|
-
message: `"${CHECKOUT_RECORD_KEY}" is the shopper's browser reporting a store order that "${STORE_PURCHASE_KEY}" already counts from the store itself, so counting it would count every sale twice.`,
|
|
363
|
-
fix: `Count the store's sales with "${STORE_PURCHASE_KEY}" instead (e.g. --event ${STORE_PURCHASE_KEY} --name 'Store purchase'). If it is already counted, nothing more is needed.`
|
|
364
|
-
};
|
|
365
|
-
function isLandingViewKey(key) {
|
|
366
|
-
return parseEventKey(key)?.family === "view";
|
|
367
|
-
}
|
|
368
|
-
function parseEventKey(key) {
|
|
369
|
-
const cut = key.indexOf(SEP);
|
|
370
|
-
if (cut <= 0) return null;
|
|
371
|
-
const family = key.slice(0, cut);
|
|
372
|
-
const rest = key.slice(cut + 1);
|
|
373
|
-
if (rest === "") return null;
|
|
374
|
-
switch (family) {
|
|
375
|
-
case "form": {
|
|
376
|
-
const [flowSlug, nodeId, ...triggerParts] = rest.split(SEP);
|
|
377
|
-
const triggerId = triggerParts.join(SEP);
|
|
378
|
-
if (!flowSlug || !nodeId || triggerId === "") return null;
|
|
379
|
-
return { family: "form", flowSlug, nodeId, triggerId };
|
|
380
|
-
}
|
|
381
|
-
case "submit":
|
|
382
|
-
return { family: "submit", flowSlug: rest };
|
|
383
|
-
case "page":
|
|
384
|
-
return { family: "page", eventName: rest };
|
|
385
|
-
case "exit":
|
|
386
|
-
return { family: "exit", host: rest };
|
|
387
|
-
case "view":
|
|
388
|
-
return { family: "view", landingId: rest };
|
|
389
|
-
default:
|
|
390
|
-
return null;
|
|
391
|
-
}
|
|
392
|
-
}
|
|
393
|
-
|
|
394
|
-
// ../api/src/analytics/sends.ts
|
|
395
|
-
var SEND_PLATFORMS = [
|
|
396
|
-
"meta",
|
|
397
|
-
"chatgptAds",
|
|
398
|
-
"googleAds",
|
|
399
|
-
"linkedinInsightTag",
|
|
400
|
-
"twitterAds",
|
|
401
|
-
"googleAnalytics"
|
|
402
|
-
];
|
|
403
|
-
function isSendPlatform(value) {
|
|
404
|
-
return SEND_PLATFORMS.includes(value);
|
|
405
|
-
}
|
|
406
|
-
var SEND_PLATFORM_SPECS = {
|
|
407
|
-
meta: {
|
|
408
|
-
title: "Meta",
|
|
409
|
-
eventMeans: "A Meta event name \u2014 Lead, Purchase, Schedule, or one of your own",
|
|
410
|
-
eventKind: "name",
|
|
411
|
-
credentialFields: ["accessToken"],
|
|
412
|
-
setupHint: "Add the Conversions API access token to the Meta pixel in Tracking"
|
|
413
|
-
},
|
|
414
|
-
chatgptAds: {
|
|
415
|
-
title: "ChatGPT Ads",
|
|
416
|
-
eventMeans: "A ChatGPT Ads event \u2014 lead_created, order_created, or a custom name",
|
|
417
|
-
eventKind: "name",
|
|
418
|
-
credentialFields: ["apiKey"],
|
|
419
|
-
setupHint: "Add the Conversions API key to the ChatGPT Ads pixel in Tracking"
|
|
420
|
-
},
|
|
421
|
-
googleAds: {
|
|
422
|
-
title: "Google Ads",
|
|
423
|
-
eventMeans: "One of the account's conversion actions, picked from its list",
|
|
424
|
-
eventKind: "id",
|
|
425
|
-
credentialFields: ["oauthProviderId"],
|
|
426
|
-
setupHint: "Connect the Google Ads conversion tag to a Google Ads account in Tracking"
|
|
427
|
-
},
|
|
428
|
-
linkedinInsightTag: {
|
|
429
|
-
title: "LinkedIn",
|
|
430
|
-
eventMeans: "The id of a conversion rule in LinkedIn Campaign Manager",
|
|
431
|
-
eventKind: "id",
|
|
432
|
-
credentialFields: ["oauthProviderId"],
|
|
433
|
-
setupHint: "Connect the LinkedIn Insight Tag to a LinkedIn account in Tracking"
|
|
434
|
-
},
|
|
435
|
-
twitterAds: {
|
|
436
|
-
title: "X",
|
|
437
|
-
eventMeans: "The event tag id from X Events Manager, like tw-oka17-abc12",
|
|
438
|
-
eventKind: "id",
|
|
439
|
-
credentialFields: ["oauthProviderId"],
|
|
440
|
-
setupHint: "Connect the X pixel to an X Ads account in Tracking"
|
|
441
|
-
},
|
|
442
|
-
googleAnalytics: {
|
|
443
|
-
title: "Google Analytics",
|
|
444
|
-
eventMeans: "A GA4 event name \u2014 generate_lead, purchase, or one of your own",
|
|
445
|
-
eventKind: "name",
|
|
446
|
-
credentialFields: ["apiSecret"],
|
|
447
|
-
setupHint: "Add the Measurement Protocol API secret to the Google Analytics tag in Tracking"
|
|
448
|
-
}
|
|
449
|
-
};
|
|
450
|
-
var SEND_ORIGINS = ["server", "website", "any"];
|
|
451
|
-
var MAX_SEND_ID = 64;
|
|
452
|
-
var MAX_SEND_EVENT_KEY = 320;
|
|
453
|
-
function sendEventIsTemplated(event) {
|
|
454
|
-
return templateMentions(event).length > 0;
|
|
455
|
-
}
|
|
456
|
-
function sendEventProblem(platform, event) {
|
|
457
|
-
if (!isSendPlatform(platform)) return null;
|
|
458
|
-
if (!sendEventIsTemplated(event)) return null;
|
|
459
|
-
const spec = SEND_PLATFORM_SPECS[platform];
|
|
460
|
-
if (spec.eventKind === "name") return null;
|
|
461
|
-
return `${spec.title} identifies a conversion by an id it issued, so it cannot be written from the event. Paste the id; pass what varies as an extra parameter instead.`;
|
|
462
|
-
}
|
|
463
|
-
|
|
464
|
-
// ../api/src/analytics/peopleSearch.ts
|
|
465
|
-
import { z } from "zod";
|
|
466
|
-
var PEOPLE_SEARCH_MAX_TERMS = 50;
|
|
467
|
-
var VERBATIM_KINDS = [
|
|
468
|
-
"browser",
|
|
469
|
-
"gclid",
|
|
470
|
-
"wbraid",
|
|
471
|
-
"gbraid",
|
|
472
|
-
"dclid",
|
|
473
|
-
"fbclid",
|
|
474
|
-
"ttclid",
|
|
475
|
-
"twclid",
|
|
476
|
-
"li_fat_id",
|
|
477
|
-
"msclkid",
|
|
478
|
-
"rdt_cid",
|
|
479
|
-
"epik",
|
|
480
|
-
"sccid",
|
|
481
|
-
"oppref",
|
|
482
|
-
"fbp",
|
|
483
|
-
"fbc"
|
|
484
|
-
];
|
|
485
|
-
var PREFIXES = {
|
|
486
|
-
email: "email",
|
|
487
|
-
mail: "email",
|
|
488
|
-
phone: "phone",
|
|
489
|
-
tel: "phone",
|
|
490
|
-
external: "external",
|
|
491
|
-
contact: "external",
|
|
492
|
-
hubspot: "external",
|
|
493
|
-
id: "external",
|
|
494
|
-
deal: "deal",
|
|
495
|
-
digest: "digest",
|
|
496
|
-
hash: "digest",
|
|
497
|
-
browser: "browser",
|
|
498
|
-
anon: "browser",
|
|
499
|
-
...Object.fromEntries(VERBATIM_KINDS.map((kind) => [kind, kind]))
|
|
500
|
-
};
|
|
501
|
-
var TERM_SEPARATORS = /[\n\r\t,;]+/;
|
|
502
|
-
var EMAIL_SHAPE = /^[^\s@]+@[^\s@]+$/;
|
|
503
|
-
var DIGITS = /^\d+$/;
|
|
504
|
-
var INTERNATIONAL_PHONE = /^(\+|00)[\d\s().-]{7,}$/;
|
|
505
|
-
var META_COOKIE = /^fb\.\d\./;
|
|
506
|
-
function kindOf(value) {
|
|
507
|
-
if (EMAIL_SHAPE.test(value)) return "email";
|
|
508
|
-
if (isSha256Hex(value)) return "digest";
|
|
509
|
-
if (INTERNATIONAL_PHONE.test(value)) return "phone";
|
|
510
|
-
if (DIGITS.test(value)) return "number";
|
|
511
|
-
if (META_COOKIE.test(value)) return "fbc";
|
|
512
|
-
return "key";
|
|
513
|
-
}
|
|
514
|
-
function readTerm(input) {
|
|
515
|
-
const colon = input.indexOf(":");
|
|
516
|
-
if (colon > 0) {
|
|
517
|
-
const kind = PREFIXES[input.slice(0, colon).trim().toLowerCase()];
|
|
518
|
-
const value = input.slice(colon + 1).trim();
|
|
519
|
-
if (kind !== void 0 && value !== "") return { input, kind, value };
|
|
520
|
-
}
|
|
521
|
-
return { input, kind: kindOf(input), value: input };
|
|
522
|
-
}
|
|
523
|
-
function sameness(term) {
|
|
524
|
-
switch (term.kind) {
|
|
525
|
-
case "email":
|
|
526
|
-
case "phone":
|
|
527
|
-
return `${term.kind}|${normalizeIdentity({ kind: term.kind, value: term.value }, 1)?.value ?? term.value}`;
|
|
528
|
-
case "external":
|
|
529
|
-
case "digest":
|
|
530
|
-
return `${term.kind}|${term.value.toLowerCase()}`;
|
|
531
|
-
default:
|
|
532
|
-
return `${term.kind}|${term.value}`;
|
|
533
|
-
}
|
|
534
|
-
}
|
|
535
|
-
function parsePeopleQuery(text) {
|
|
536
|
-
const inputs = (typeof text === "string" ? [text] : text).flatMap((part) => part.split(TERM_SEPARATORS));
|
|
537
|
-
const seen = /* @__PURE__ */ new Set();
|
|
538
|
-
const terms = [];
|
|
539
|
-
for (const raw of inputs) {
|
|
540
|
-
const input = raw.trim();
|
|
541
|
-
if (input === "") continue;
|
|
542
|
-
const term = readTerm(input);
|
|
543
|
-
const identity = sameness(term);
|
|
544
|
-
if (seen.has(identity)) continue;
|
|
545
|
-
seen.add(identity);
|
|
546
|
-
terms.push(term);
|
|
547
|
-
}
|
|
548
|
-
return {
|
|
549
|
-
terms: terms.slice(0, PEOPLE_SEARCH_MAX_TERMS),
|
|
550
|
-
dropped: Math.max(0, terms.length - PEOPLE_SEARCH_MAX_TERMS)
|
|
551
|
-
};
|
|
552
|
-
}
|
|
553
|
-
var personTermInputSchema = z.string().trim().min(1).max(320);
|
|
554
|
-
var peopleSearchInputSchema = z.array(personTermInputSchema).min(1).max(PEOPLE_SEARCH_MAX_TERMS * 4);
|
|
555
|
-
var peopleLookupRequestSchema = z.object({ people: peopleSearchInputSchema });
|
|
556
|
-
var peopleSearchTermSchema = z.object({
|
|
557
|
-
/** Position in the search; what `personTerms` on a feed row points at. */
|
|
558
|
-
term: z.number().int(),
|
|
559
|
-
input: z.string(),
|
|
560
|
-
kind: z.string(),
|
|
561
|
-
/**
|
|
562
|
-
* Why this line could not be looked up as asked, in the reader's words — a
|
|
563
|
-
* deal HubSpot does not know, HubSpot not connected. Empty when it was.
|
|
564
|
-
*/
|
|
565
|
-
problem: z.string().default(""),
|
|
566
|
-
/** A deal's contacts, as found in the CRM. Empty for every other kind. */
|
|
567
|
-
contacts: z.array(z.string()).default([])
|
|
568
|
-
});
|
|
569
|
-
var peopleLookupRowSchema = peopleSearchTermSchema.extend({
|
|
570
|
-
found: z.boolean(),
|
|
571
|
-
events: z.number(),
|
|
572
|
-
firstSeen: z.string(),
|
|
573
|
-
lastSeen: z.string(),
|
|
574
|
-
pageViews: z.number(),
|
|
575
|
-
landings: z.number(),
|
|
576
|
-
visits: z.number(),
|
|
577
|
-
formSubmits: z.number(),
|
|
578
|
-
/** What the company's own systems reported about them, by event name — CRM stages, orders. */
|
|
579
|
-
systemEvents: z.array(z.string()),
|
|
580
|
-
pageEvents: z.array(z.string()),
|
|
581
|
-
uploads: z.number(),
|
|
582
|
-
uploadedTo: z.array(z.string()),
|
|
583
|
-
googleClick: z.boolean(),
|
|
584
|
-
metaClick: z.boolean(),
|
|
585
|
-
/** `utm_source`, else the referrer, of the first visit Baker saw. Empty when it saw none. */
|
|
586
|
-
firstSource: z.string(),
|
|
587
|
-
/** Every kind of key they are linked by: `email`, `phone`, `external`, `browser`, a click id. */
|
|
588
|
-
knownBy: z.array(z.string())
|
|
589
|
-
});
|
|
590
|
-
var peopleLookupDataSchema = z.object({
|
|
591
|
-
people: z.array(peopleLookupRowSchema),
|
|
592
|
-
/** Lines past the limit, not looked up. */
|
|
593
|
-
dropped: z.number()
|
|
594
|
-
});
|
|
595
|
-
|
|
596
|
-
// ../api/src/analytics/sendsWire.ts
|
|
597
|
-
import { z as z2 } from "zod";
|
|
598
|
-
var conversionSendSchema = z2.object({
|
|
599
|
-
/** Stable within the company. `s1`, `s2` — something a person can type. */
|
|
600
|
-
id: z2.string().min(1).max(MAX_SEND_ID),
|
|
601
|
-
/** The event it sends, by key — `page:<name>`, from `events[]` of a plain read. */
|
|
602
|
-
eventKey: z2.string().min(1).max(MAX_SEND_EVENT_KEY),
|
|
603
|
-
/** `website` for an event Baker's pixel raised on the company's own site; absent (or `server`) for the API and integrations. */
|
|
604
|
-
origin: z2.enum(SEND_ORIGINS).optional(),
|
|
605
|
-
platform: z2.enum(SEND_PLATFORMS),
|
|
606
|
-
/** The tag's id on Tracking. Must be one of this company's tags of the platform's type, with its server credential set. */
|
|
607
|
-
tagId: z2.string().min(1).max(120),
|
|
608
|
-
/** A Meta or GA4 event name; a Google Ads conversion action id; a LinkedIn conversion rule id; an X event tag id. */
|
|
609
|
-
event: z2.string().min(1).max(255),
|
|
610
|
-
/** The LinkedIn ad account the conversion rule belongs to. */
|
|
611
|
-
account: z2.string().max(120).optional(),
|
|
612
|
-
/** Extra platform parameters: name → template over the event. See `SEND_PARAMETERS[platform]`. */
|
|
613
|
-
parameters: z2.record(z2.string().min(1).max(64), z2.string().min(1).max(500)).optional()
|
|
614
|
-
});
|
|
615
|
-
var sendUploadSchema = z2.object({
|
|
616
|
-
sendId: z2.string(),
|
|
617
|
-
eventUid: z2.string(),
|
|
618
|
-
/** The event's own name, as it was counted. Empty for a Form's submit, which has none. */
|
|
619
|
-
eventName: z2.string(),
|
|
620
|
-
/** The event's key, as `conversions` spells it — what names a Form's submit. */
|
|
621
|
-
eventKey: z2.string(),
|
|
622
|
-
/** The Form it happened in, for a `form:` or `submit:` key. */
|
|
623
|
-
flowSlug: z2.string(),
|
|
624
|
-
/** ISO instant of the event itself. */
|
|
625
|
-
eventAt: z2.string(),
|
|
626
|
-
/** ISO instant of the upload. */
|
|
627
|
-
dispatchedAt: z2.string(),
|
|
628
|
-
/** `skipped`: never uploaded, because the event carried nothing the platform can match a person by. */
|
|
629
|
-
outcome: z2.enum(["success", "failed", "pending", "skipped"]),
|
|
630
|
-
/** The platform's refusal in its own words, or why it was skipped. Empty otherwise. */
|
|
631
|
-
error: z2.string(),
|
|
632
|
-
sessionId: z2.string(),
|
|
633
|
-
anonId: z2.string()
|
|
634
|
-
});
|
|
635
|
-
var MAX_SENDS_PER_REQUEST = 40;
|
|
636
|
-
var sendsRequestSchema = z2.object({
|
|
637
|
-
set: z2.array(conversionSendSchema).max(MAX_SENDS_PER_REQUEST).optional(),
|
|
638
|
-
remove: z2.array(z2.string().min(1).max(MAX_SEND_ID)).max(MAX_SENDS_PER_REQUEST).optional(),
|
|
639
|
-
/** How many days the outcomes beside each send cover. Default 30. */
|
|
640
|
-
days: z2.number().int().min(1).max(400).optional(),
|
|
641
|
-
/** List one send's uploads over the window, newest first, by the send's id. */
|
|
642
|
-
uploads: z2.string().min(1).max(MAX_SEND_ID).optional(),
|
|
643
|
-
/** With `uploads`: only the ones the platform refused. */
|
|
644
|
-
failedOnly: z2.boolean().optional(),
|
|
645
|
-
/** With `uploads`: only the events skipped, with what each was missing. */
|
|
646
|
-
skippedOnly: z2.boolean().optional(),
|
|
647
|
-
/** Also say when each live send was set up, and when an integration named after its event was removed. */
|
|
648
|
-
history: z2.boolean().optional()
|
|
649
|
-
});
|
|
650
|
-
var sendOutcomeSchema = z2.object({
|
|
651
|
-
sendId: z2.string(),
|
|
652
|
-
dispatched: z2.number(),
|
|
653
|
-
succeeded: z2.number(),
|
|
654
|
-
failed: z2.number(),
|
|
655
|
-
pending: z2.number(),
|
|
656
|
-
lastError: z2.string(),
|
|
657
|
-
lastAt: z2.string(),
|
|
658
|
-
/** Events not uploaded: they carried nothing this platform can match a person by. */
|
|
659
|
-
skipped: z2.number().optional(),
|
|
660
|
-
lastSkipReason: z2.string().optional()
|
|
661
|
-
});
|
|
662
|
-
var sendsResponseSchema = z2.object({
|
|
663
|
-
ok: z2.literal(true),
|
|
664
|
-
data: z2.object({
|
|
665
|
-
/** The company's sends, as they are live. */
|
|
666
|
-
sends: z2.array(conversionSendSchema.extend({ outcome: sendOutcomeSchema.optional() })),
|
|
667
|
-
/** The ops this chat has staged and not yet published. Absent outside a chat. */
|
|
668
|
-
staged: z2.object({
|
|
669
|
-
set: z2.array(conversionSendSchema),
|
|
670
|
-
remove: z2.array(z2.string())
|
|
671
|
-
}).optional(),
|
|
672
|
-
/** The platforms, what `event` means on each, what a tag needs on Tracking to send, and the tags that can. */
|
|
673
|
-
platforms: z2.array(
|
|
674
|
-
z2.object({
|
|
675
|
-
platform: z2.string(),
|
|
676
|
-
title: z2.string(),
|
|
677
|
-
eventMeans: z2.string(),
|
|
678
|
-
setupHint: z2.string(),
|
|
679
|
-
tags: z2.array(z2.object({ tagId: z2.string(), label: z2.string() })),
|
|
680
|
-
/**
|
|
681
|
-
* The conversions the platform already holds, by the id a send's `event`
|
|
682
|
-
* takes and the name the person gave them. Google Ads only: its `event`
|
|
683
|
-
* is an id Google issued, and an id the account does not hold is
|
|
684
|
-
* accepted and files against nothing. `label` is the conversion label
|
|
685
|
-
* the account's tag setup shows (`AW-…/<label>`) — how the person knows it.
|
|
686
|
-
*/
|
|
687
|
-
conversionActions: z2.array(
|
|
688
|
-
z2.object({ id: z2.string(), name: z2.string(), primaryForGoal: z2.boolean(), label: z2.string().optional() })
|
|
689
|
-
).optional()
|
|
690
|
-
})
|
|
691
|
-
),
|
|
692
|
-
/** Every field a send forwards. Nothing to map. */
|
|
693
|
-
carries: z2.array(z2.object({ name: z2.string(), label: z2.string(), group: z2.string(), hashed: z2.boolean() })),
|
|
694
|
-
/**
|
|
695
|
-
* The events this company's systems raise, so a send can be pointed at
|
|
696
|
-
* one: every Source by the key it raises, and every named event the store
|
|
697
|
-
* saw arrive from a system.
|
|
698
|
-
*/
|
|
699
|
-
events: z2.array(
|
|
700
|
-
z2.object({
|
|
701
|
-
eventKey: z2.string(),
|
|
702
|
-
/** The event's own name. */
|
|
703
|
-
name: z2.string(),
|
|
704
|
-
/** `source` for a Source on Sources, `systems` for a name the API posted, `both` when a page sends it too, `website` for a name Baker's pixel sent — a send on it carries `origin: "website"`. */
|
|
705
|
-
origin: z2.string(),
|
|
706
|
-
/**
|
|
707
|
-
* The last 30 days of it: how many arrived, and how many each platform
|
|
708
|
-
* could match a person on. The rest would be skipped by a send there.
|
|
709
|
-
*/
|
|
710
|
-
match: z2.object({ events: z2.number(), platforms: z2.record(z2.string(), z2.number()) }).optional()
|
|
711
|
-
})
|
|
712
|
-
),
|
|
713
|
-
/** What each platform does with extra parameters, and the names it knows. */
|
|
714
|
-
parameters: z2.array(
|
|
715
|
-
z2.object({
|
|
716
|
-
platform: z2.string(),
|
|
717
|
-
takes: z2.boolean(),
|
|
718
|
-
where: z2.string(),
|
|
719
|
-
known: z2.array(z2.string()),
|
|
720
|
-
max: z2.number()
|
|
721
|
-
})
|
|
722
|
-
),
|
|
723
|
-
/** The event fields a parameter template may read, beside `properties.<key>`. */
|
|
724
|
-
templateFields: z2.array(z2.object({ name: z2.string(), label: z2.string() })),
|
|
725
|
-
/** One send's uploads, when `uploads` named one. */
|
|
726
|
-
uploads: z2.object({ sendId: z2.string(), rows: z2.array(sendUploadSchema) }).optional(),
|
|
727
|
-
/**
|
|
728
|
-
* When `history` was asked: when each live send was set up (epoch ms), and
|
|
729
|
-
* when an integration named after its event was last removed, if one was —
|
|
730
|
-
* what tells a send left on an event nothing raises apart from a mystery.
|
|
731
|
-
*/
|
|
732
|
-
history: z2.array(z2.object({ sendId: z2.string(), createdAt: z2.number(), integrationRemovedAt: z2.number().optional() })).optional()
|
|
733
|
-
}),
|
|
734
|
-
hints: z2.array(z2.string()).optional()
|
|
735
|
-
});
|
|
736
|
-
|
|
737
|
-
// ../api/src/analytics/unstage.ts
|
|
738
|
-
import { z as z3 } from "zod";
|
|
739
|
-
var ANALYTICS_UNSTAGE_KINDS = ["mapping", "conversion", "send", "source"];
|
|
740
|
-
var analyticsUnstageKindSchema = z3.enum(ANALYTICS_UNSTAGE_KINDS);
|
|
741
|
-
var analyticsUnstageRequestSchema = z3.object({
|
|
742
|
-
chatId: z3.string().min(1),
|
|
743
|
-
kind: analyticsUnstageKindSchema.optional(),
|
|
744
|
-
ref: z3.string().min(1).optional(),
|
|
745
|
-
/** Everything staged — of `kind` when given, of every kind otherwise. */
|
|
746
|
-
all: z3.boolean().optional()
|
|
747
|
-
}).refine((body) => body.all === true ? body.ref === void 0 : body.kind !== void 0 && body.ref !== void 0, {
|
|
748
|
-
message: "Pass --kind with --ref to take back one staged change, or --all (optionally with --kind) to take back everything staged."
|
|
749
|
-
});
|
|
750
|
-
var analyticsUnstageResponseSchema = z3.object({
|
|
751
|
-
ok: z3.literal(true),
|
|
752
|
-
data: z3.object({
|
|
753
|
-
/** How many staged changes were taken back, per kind touched. */
|
|
754
|
-
removed: z3.partialRecord(analyticsUnstageKindSchema, z3.number().int().min(0))
|
|
755
|
-
}),
|
|
756
|
-
hints: z3.array(z3.string()).optional()
|
|
757
|
-
});
|
|
758
|
-
|
|
759
|
-
// ../api/src/analytics/wire.ts
|
|
760
|
-
import { z as z4 } from "zod";
|
|
761
|
-
|
|
762
|
-
// ../api/src/analytics/conversions.ts
|
|
763
|
-
var CONVERSION_COUNT_MODES = ["once_per_visit", "every_time"];
|
|
764
|
-
var PRIMARY_CONVERSION_TRIGGER = {
|
|
765
|
-
calendly: "calendlyEvent.eventScheduled",
|
|
766
|
-
customForm: "customForm.onFormSubmitted",
|
|
767
|
-
highlevel: "highlevelEvent.appointmentScheduled",
|
|
768
|
-
highlevelForm: "highlevelFormEvent.formSubmitted",
|
|
769
|
-
hubspot: "hubspotForm.onFormSubmitted",
|
|
770
|
-
hubspotMeeting: "hubspotMeeting.onMeetingScheduled",
|
|
771
|
-
link: "link.onClick",
|
|
772
|
-
savvycal: "savvycalEvent.scheduled",
|
|
773
|
-
text: "text.onButtonClicked"
|
|
774
|
-
};
|
|
775
|
-
var NON_SUBMIT_NODE_TYPES = ["link", "text"];
|
|
776
|
-
var STEP_SUBMIT_TRIGGERS = Object.fromEntries(
|
|
777
|
-
Object.entries(PRIMARY_CONVERSION_TRIGGER).filter(([nodeType]) => !NON_SUBMIT_NODE_TYPES.includes(nodeType))
|
|
778
|
-
);
|
|
779
|
-
var MAX_CONVERSION_NAME = 80;
|
|
780
|
-
|
|
781
|
-
// ../api/src/analytics/submissionAnswers.ts
|
|
782
|
-
var MAX_ANSWER_CHARS = 16384;
|
|
783
|
-
var MAX_ANSWER_NAME_CHARS = 120;
|
|
784
|
-
var TRUNCATED = "\u2026";
|
|
785
|
-
function cutToLength(value, max) {
|
|
786
|
-
if (value.length <= max) return value;
|
|
787
|
-
return `${[...value].slice(0, max - 1).join("")}${TRUNCATED}`;
|
|
788
|
-
}
|
|
789
|
-
function boundSubmissionAnswers(answers) {
|
|
790
|
-
const kept = {};
|
|
791
|
-
for (const [name, value] of Object.entries(answers)) {
|
|
792
|
-
kept[cutToLength(name, MAX_ANSWER_NAME_CHARS)] = cutToLength(value, MAX_ANSWER_CHARS);
|
|
793
|
-
}
|
|
794
|
-
return kept;
|
|
795
|
-
}
|
|
796
|
-
|
|
797
|
-
// ../api/src/analytics/wire.ts
|
|
798
|
-
var SEND_FILTERS = ["any", "failed", "skipped"];
|
|
799
|
-
var adParamRoleSchema = z4.enum(AD_PARAM_ROLES);
|
|
800
|
-
var ANALYTICS_FULL_BREAKDOWN_LIMIT = 100;
|
|
801
|
-
var ANALYTICS_MAX_PAGE_SIZE = 200;
|
|
802
|
-
var ANALYTICS_MAX_PAGE = 500;
|
|
803
|
-
function isResolvableTimeZone(value) {
|
|
804
|
-
try {
|
|
805
|
-
new Intl.DateTimeFormat("en-US", { timeZone: value });
|
|
806
|
-
return true;
|
|
807
|
-
} catch {
|
|
808
|
-
return false;
|
|
809
|
-
}
|
|
810
|
-
}
|
|
811
|
-
var analyticsPresetSchema = z4.enum([
|
|
812
|
-
/** Everything that matters in one call — the default entry point. */
|
|
813
|
-
"overview",
|
|
814
|
-
/** Traffic shape: trend, sources, geo, device. */
|
|
815
|
-
"traffic",
|
|
816
|
-
/** Per-step drop-off for the company's Forms. */
|
|
817
|
-
"funnel",
|
|
818
|
-
/**
|
|
819
|
-
* One Form in depth: its steps, where people went between them, and how many
|
|
820
|
-
* converted at the node that actually produced the conversion.
|
|
821
|
-
*
|
|
822
|
-
* Distinct from `funnel`, which is a per-step table across every Form.
|
|
823
|
-
* A Form with branches is not a table — a visitor who leaves step two for
|
|
824
|
-
* the booking branch and a visitor who leaves it for nothing are the same
|
|
825
|
-
* row there, and they are the whole question. `paths` returns the edges
|
|
826
|
-
* between steps, which is what a Sankey draws.
|
|
827
|
-
*/
|
|
828
|
-
"flow",
|
|
829
|
-
/** One page in detail. */
|
|
830
|
-
"page",
|
|
831
|
-
/**
|
|
832
|
-
* Every Form trigger that fired, and how much of it produced a side effect.
|
|
833
|
-
*
|
|
834
|
-
* Separate from `funnel` because it answers a different question: the funnel
|
|
835
|
-
* measures the steps a visitor walked, this measures the things they *did* —
|
|
836
|
-
* clicking the link that redirects them out, an embedded checkout posting
|
|
837
|
-
* back — most of which have nothing configured against them and none of
|
|
838
|
-
* which appear as a step.
|
|
839
|
-
*/
|
|
840
|
-
"triggers",
|
|
841
|
-
/** What each published build did, so a change can be attributed to a publish. */
|
|
842
|
-
"releases",
|
|
843
|
-
/**
|
|
844
|
-
* One ad dimension broken down, plus what is actually on the URLs.
|
|
845
|
-
*
|
|
846
|
-
* Answers the question the ad platform cannot: not how many clicks a keyword
|
|
847
|
-
* bought, but whether the people it brought read the page, filled the Form
|
|
848
|
-
* or left immediately. Pair it with `adRole` to choose the dimension; the
|
|
849
|
-
* parameter inventory comes back either way, because on a half-tagged
|
|
850
|
-
* account "there is no keyword on 80% of your paid traffic" is the finding.
|
|
851
|
-
*/
|
|
852
|
-
"ads",
|
|
853
|
-
/**
|
|
854
|
-
* Every landing side by side: traffic, entrances, conversion rate, and a
|
|
855
|
-
* sparkline each, joined to the landing's real name and tags.
|
|
856
|
-
*
|
|
857
|
-
* The list view. `page` answers one page in depth and needs to be told which
|
|
858
|
-
* one; this answers "which of my pages is working" without knowing the
|
|
859
|
-
* answer first, and is what a landings screen renders.
|
|
860
|
-
*/
|
|
861
|
-
"landings",
|
|
862
|
-
/**
|
|
863
|
-
* The same numbers grouped by the tag a landing is filed under.
|
|
864
|
-
*
|
|
865
|
-
* The unit a campaign is actually run at. Nobody asks how `/pricing-b` did;
|
|
866
|
-
* they ask how the September push did, and September was six landings.
|
|
867
|
-
*/
|
|
868
|
-
"tags",
|
|
869
|
-
/**
|
|
870
|
-
* Events a page defined for itself — a section seen, a video played, a
|
|
871
|
-
* pricing toggle flipped.
|
|
872
|
-
*
|
|
873
|
-
* Separate from every other preset because the vocabulary is the page's
|
|
874
|
-
* rather than the product's. Mixing them into `traffic` would produce a list
|
|
875
|
-
* half of which the reader has to already know is bespoke.
|
|
876
|
-
*/
|
|
877
|
-
"events",
|
|
878
|
-
/**
|
|
879
|
-
* Browser, OS, engine and viewport of real visitors.
|
|
880
|
-
*
|
|
881
|
-
* `traffic` reports the device family, which is enough to notice that mobile
|
|
882
|
-
* converts worse and not enough to do anything about it. This is narrow
|
|
883
|
-
* enough to reproduce a bug on.
|
|
884
|
-
*/
|
|
885
|
-
"devices",
|
|
886
|
-
/**
|
|
887
|
-
* Paid acquisition, grouped the way money is spent.
|
|
888
|
-
*
|
|
889
|
-
* Distinct from `traffic` in two ways that matter. It groups by SESSION, so a
|
|
890
|
-
* visitor counts once for the campaign they arrived on rather than once per
|
|
891
|
-
* page they read. And it reports leads that were actually DELIVERED, not
|
|
892
|
-
* `form_submit` events — a campaign whose forms all submit and whose CRM is
|
|
893
|
-
* rejecting every one of them reads as converting perfectly on every other
|
|
894
|
-
* preset here, and reads as zero delivered on this one.
|
|
895
|
-
*/
|
|
896
|
-
"paid",
|
|
897
|
-
/**
|
|
898
|
-
* Where each submission actually went, and what each destination made of it.
|
|
899
|
-
*
|
|
900
|
-
* The preset for "I filled in the form, where is my lead?". One row per
|
|
901
|
-
* submission listing every destination, its outcome, and the id the
|
|
902
|
-
* destination gave the record it created — which is what turns "it says
|
|
903
|
-
* success" into something a client can open and check.
|
|
904
|
-
*/
|
|
905
|
-
"delivery",
|
|
906
|
-
/**
|
|
907
|
-
* Every attempt anybody made at a Form, delivered or not.
|
|
908
|
-
*
|
|
909
|
-
* The wider companion to `delivery`, and the one that answers "I filled in
|
|
910
|
-
* my own form, where is it?" honestly. `delivery` starts from the dispatch,
|
|
911
|
-
* so a Form wired to no destination produces no row in it at all — which is
|
|
912
|
-
* correct for "what did we hand to their CRM" and reads as data loss to
|
|
913
|
-
* everybody else. The grain here is the attempt: one visitor, one Form, one
|
|
914
|
-
* visit, whether they finished, gave up halfway, or completed a Form that
|
|
915
|
-
* sends nowhere.
|
|
916
|
-
*/
|
|
917
|
-
"submissions",
|
|
918
|
-
/**
|
|
919
|
-
* Where the people who convert actually are, at whatever resolution is asked
|
|
920
|
-
* for.
|
|
921
|
-
*
|
|
922
|
-
* `traffic` breaks acquisition down by country, which is the right grain for
|
|
923
|
-
* "which market is this campaign working in" and the wrong one for every
|
|
924
|
-
* decision a local advertiser makes. A dentist buying a five-mile radius or a
|
|
925
|
-
* franchise choosing where to open is asking about postcodes, which is also
|
|
926
|
-
* how the ad platforms sell that targeting.
|
|
927
|
-
*/
|
|
928
|
-
"geo",
|
|
929
|
-
/**
|
|
930
|
-
* Which machines are fetching this site.
|
|
931
|
-
*
|
|
932
|
-
* Every other preset here excludes them, which is correct — a crawler is not
|
|
933
|
-
* an audience — and a verify check now enforces that rather than trusting it. The rows are kept, though, and this is what
|
|
934
|
-
* they are kept for: whether Google is still crawling a page that was
|
|
935
|
-
* republished, whether Meta fetched the link preview before spend went
|
|
936
|
-
* behind the URL, and how much of the traffic is now AI answer engines.
|
|
937
|
-
*/
|
|
938
|
-
"bots",
|
|
939
|
-
/**
|
|
940
|
-
* Which companies are visiting — named by the visitor's own network at the
|
|
941
|
-
* edge, never a person, and only for visitors who accepted marketing on a
|
|
942
|
-
* company that switched it on. The website half of an account-based report.
|
|
943
|
-
*/
|
|
944
|
-
"companies",
|
|
945
|
-
/**
|
|
946
|
-
* One visit, replayed end to end — and every visit the same person made
|
|
947
|
-
* before it.
|
|
948
|
-
*
|
|
949
|
-
* The only preset that answers about a *person* rather than a population.
|
|
950
|
-
* Every other report here aggregates, which is the right shape for "is the
|
|
951
|
-
* campaign working" and useless for the question a marketer asks the moment
|
|
952
|
-
* a lead arrives: who was this, where did they come from, what did they read,
|
|
953
|
-
* and did their details reach the CRM. Answering that from an aggregate is
|
|
954
|
-
* impossible by construction.
|
|
955
|
-
*
|
|
956
|
-
* Needs `sessionId`. Give `identityHash` as well and it also returns the
|
|
957
|
-
* person's earlier visits, including the anonymous ones from before they ever
|
|
958
|
-
* identified themselves — which is the difference between "converted on the
|
|
959
|
-
* first visit" and "converted on the fourth", two very different businesses.
|
|
960
|
-
*/
|
|
961
|
-
"session",
|
|
962
|
-
/**
|
|
963
|
-
* Everybody who visited, one row per person — converted or not.
|
|
964
|
-
*
|
|
965
|
-
* The unit here is a *person*, which no other preset has. `traffic` counts
|
|
966
|
-
* visitors and cannot name one; `delivery` names the ones who became a lead
|
|
967
|
-
* and is silent about the ninety-odd percent who did not; `session` describes
|
|
968
|
-
* one visit and has to be told which. This is the list those are read from.
|
|
969
|
-
*
|
|
970
|
-
* Grouped by browser cookie, so somebody who came back on Wednesday is one
|
|
971
|
-
* row and not two. Pass `onlyConverted` for the converted-only cut, and
|
|
972
|
-
* `landingId` to ask who visited one page.
|
|
973
|
-
*
|
|
974
|
-
* Not offered as a `baker analytics` preset, for the same reason `realtime`
|
|
975
|
-
* is not: it answers about individuals, and an agent writing a client report
|
|
976
|
-
* should be reading the population.
|
|
977
|
-
*/
|
|
978
|
-
"people",
|
|
979
|
-
/**
|
|
980
|
-
* Who is on the site right now.
|
|
981
|
-
*
|
|
982
|
-
* The only preset measured from `now()` rather than over a date window, and
|
|
983
|
-
* the only one meant to be polled. Kept out of `overview` for exactly that
|
|
984
|
-
* reason: a live counter has to refresh every few seconds and the rest of the
|
|
985
|
-
* page must not refetch with it.
|
|
986
|
-
*
|
|
987
|
-
* Deliberately not offered as a `baker analytics` preset. The sandbox agent
|
|
988
|
-
* works asynchronously — by the time it reads an answer, "the last five
|
|
989
|
-
* minutes" names a window that has passed — so the only thing listing it
|
|
990
|
-
* would do is add a choice the agent can never usefully pick to the menu it
|
|
991
|
-
* reads before picking one.
|
|
992
|
-
*/
|
|
993
|
-
"realtime",
|
|
994
|
-
/**
|
|
995
|
-
* What this company counts as a conversion, and everything it could count.
|
|
996
|
-
*
|
|
997
|
-
* The two halves of one question, which is why they are one preset: the list
|
|
998
|
-
* of definitions with what each produced, and the catalogue of every event
|
|
999
|
-
* these pages actually emitted with whether it is already counted. Reading
|
|
1000
|
-
* the first without the second is how the previous design failed — a
|
|
1001
|
-
* marketer could see that nothing was counted and had no way to find out what
|
|
1002
|
-
* was available to count.
|
|
1003
|
-
*/
|
|
1004
|
-
"conversions",
|
|
1005
|
-
/**
|
|
1006
|
-
* Every event as it was stored, newest first — the one preset that does not
|
|
1007
|
-
* reduce.
|
|
1008
|
-
*
|
|
1009
|
-
* Deliberately not offered as a `baker analytics` preset. It is the raw feed
|
|
1010
|
-
* a person watches while wiring something up, and an agent asked to describe
|
|
1011
|
-
* an account wants the counts rather than the tape.
|
|
1012
|
-
*/
|
|
1013
|
-
"stream"
|
|
1014
|
-
]);
|
|
1015
|
-
var ANALYTICS_PRESETS = analyticsPresetSchema.options;
|
|
1016
|
-
var ANALYTICS_EVENT_DOORS = ["pages", "website", "server", "integrations"];
|
|
1017
|
-
var analyticsQueryRequestSchema = z4.object({
|
|
1018
|
-
preset: analyticsPresetSchema,
|
|
1019
|
-
/** Lookback in days. Ignored when `startDate` is given. */
|
|
1020
|
-
days: z4.coerce.number().int().positive().max(400).optional(),
|
|
1021
|
-
startDate: z4.iso.date().optional(),
|
|
1022
|
-
endDate: z4.iso.date().optional(),
|
|
1023
|
-
/** Required by the `page` preset; ignored by the others. */
|
|
1024
|
-
path: z4.string().max(1024).optional(),
|
|
1025
|
-
/** Narrows `funnel` to one Form. Omitted means every Form. */
|
|
1026
|
-
flowSlug: z4.string().max(120).optional(),
|
|
1027
|
-
/**
|
|
1028
|
-
* How far down the `geo` preset looks. Ignored by every other preset.
|
|
1029
|
-
*
|
|
1030
|
-
* A closed set rather than a column name, because it names a column and a
|
|
1031
|
-
* column name taken from a request must never reach the SQL.
|
|
1032
|
-
*/
|
|
1033
|
-
grain: z4.enum(["country", "region", "city", "postal_code", "metro_code"]).optional(),
|
|
1034
|
-
/**
|
|
1035
|
-
* Narrows `geo` to one country before going finer.
|
|
1036
|
-
*
|
|
1037
|
-
* Not optional decoration below country level: postcodes collide across
|
|
1038
|
-
* markets, so a bare `28001` is a Madrid postcode and a US ZIP at once.
|
|
1039
|
-
*/
|
|
1040
|
-
country: z4.string().max(8).optional(),
|
|
1041
|
-
/**
|
|
1042
|
-
* Which ad dimension to break down by, or to narrow every other report to.
|
|
1043
|
-
*
|
|
1044
|
-
* A role from the closed vocabulary — `keyword`, `match_type`,
|
|
1045
|
-
* `campaign_id` — never a raw parameter name. The company's own spellings
|
|
1046
|
-
* are resolved from its mapping server-side, so a caller asking for
|
|
1047
|
-
* "keyword" gets `kw` rows from before a rename as well as `keyword` rows
|
|
1048
|
-
* after it, and no request can name a column.
|
|
1049
|
-
*/
|
|
1050
|
-
adRole: adParamRoleSchema.optional(),
|
|
1051
|
-
/**
|
|
1052
|
-
* Narrows to one value of `adRole`. Requires `adRole`.
|
|
1053
|
-
*
|
|
1054
|
-
* An empty string with `adRole` set is a real query — "arrived carrying
|
|
1055
|
-
* none of these" — which is how you size the untagged half of an account.
|
|
1056
|
-
* Omit both to leave the report unnarrowed.
|
|
1057
|
-
*/
|
|
1058
|
-
adValue: z4.string().max(255).optional(),
|
|
1059
|
-
/**
|
|
1060
|
-
* Read this report in one ad platform's vocabulary, and from its traffic.
|
|
1061
|
-
*
|
|
1062
|
-
* Two effects, and they belong together. A role resolves against the
|
|
1063
|
-
* mapping in force for that platform — so `cid` is TikTok's ad here and
|
|
1064
|
-
* nobody's campaign — and the report narrows to the sessions that arrived
|
|
1065
|
-
* from it, matched on the click id the platform stamps and, failing that,
|
|
1066
|
-
* on `utm_source`. Asking a platform's question of another platform's
|
|
1067
|
-
* traffic is how a keyword report ends up counting Meta visits that could
|
|
1068
|
-
* not have carried a keyword.
|
|
1069
|
-
*
|
|
1070
|
-
* Omit it for the union across every platform, which is the honest
|
|
1071
|
-
* superset and the right default for "how is paid doing".
|
|
1072
|
-
*/
|
|
1073
|
-
adPlatform: z4.enum(AD_PLATFORMS).optional(),
|
|
1074
|
-
/**
|
|
1075
|
-
* Read only what came in by one door. See {@link ANALYTICS_EVENT_DOORS}.
|
|
1076
|
-
*
|
|
1077
|
-
* Omit it for all of it, which is the default and the honest superset.
|
|
1078
|
-
* Only the reads where the split is a question somebody asks honour it —
|
|
1079
|
-
* the totals, the trend, the two page-event reads, the conversion
|
|
1080
|
-
* breakdown and the events catalogue. A session-scoped report cannot: an
|
|
1081
|
-
* ingest row carries no `session_id`, deliberately, so there is no visit
|
|
1082
|
-
* for it to be counted in.
|
|
1083
|
-
*/
|
|
1084
|
-
eventOrigin: z4.enum(ANALYTICS_EVENT_DOORS).optional(),
|
|
1085
|
-
/**
|
|
1086
|
-
* `stream` only: keep just one kind of event, named by the key
|
|
1087
|
-
* `conversions` hands back in its catalogue.
|
|
1088
|
-
*
|
|
1089
|
-
* The key rather than `eventName`, because three of the four families have
|
|
1090
|
-
* no name of their own — a Form's trigger, a submit, an outbound click —
|
|
1091
|
-
* and a filter that could only name the fourth would be a filter that hides
|
|
1092
|
-
* most of the feed from itself.
|
|
1093
|
-
*/
|
|
1094
|
-
eventKey: z4.string().optional(),
|
|
1095
|
-
/**
|
|
1096
|
-
* `stream` only: keep just what one source sent, by the source's name —
|
|
1097
|
-
* the `baker_source` every event from an address or a HubSpot read
|
|
1098
|
-
* carries. Names come from `baker analytics sources`.
|
|
1099
|
-
*/
|
|
1100
|
-
sourceName: z4.string().optional(),
|
|
1101
|
-
/**
|
|
1102
|
-
* `stream` only: keep just the uploads a conversion's sends made —
|
|
1103
|
-
* `any` for every upload, `failed` for the ones the platform refused.
|
|
1104
|
-
*/
|
|
1105
|
-
sends: z4.enum(SEND_FILTERS).optional(),
|
|
1106
|
-
/** `stream` only: keep just the uploads one send made, by its id (`s1`). */
|
|
1107
|
-
sendId: z4.string().optional(),
|
|
1108
|
-
/** `stream` only: keep what went to one destination (`meta`, `httpWebhook`) — a Form's deliveries and sends' uploads alike. */
|
|
1109
|
-
sentTo: z4.string().max(64).optional(),
|
|
1110
|
-
/** `stream` only: one event by its uid, and every upload made for it — with the platform's verdict on each. */
|
|
1111
|
-
eventUid: z4.string().optional(),
|
|
1112
|
-
/**
|
|
1113
|
-
* `stream` only: list just the rows taken for machine traffic — a headless
|
|
1114
|
-
* browser, a datacenter — instead of the human feed. How an agent sees its
|
|
1115
|
-
* own test visit, which every report rightly leaves out.
|
|
1116
|
-
*/
|
|
1117
|
-
machines: z4.boolean().optional(),
|
|
1118
|
-
/** Return the long breakdowns and the per-day trend. */
|
|
1119
|
-
full: z4.boolean().optional(),
|
|
1120
|
-
/**
|
|
1121
|
-
* IANA zone the day boundaries are drawn in. Defaults to UTC.
|
|
1122
|
-
*
|
|
1123
|
-
* Not cosmetic. Bucketing a Madrid client's traffic by UTC days moves two
|
|
1124
|
-
* hours of every evening into the following day, so "Tuesday" is not
|
|
1125
|
-
* Tuesday and a day-of-week comparison is wrong by however much traffic
|
|
1126
|
-
* arrives after 22:00 — which on a consumer landing is a lot of it.
|
|
1127
|
-
*
|
|
1128
|
-
* Validated against the platform's own zone database rather than an enum,
|
|
1129
|
-
* because the list is the platform's and not ours — but validated it must
|
|
1130
|
-
* be. The zone is substituted into the query as a string literal and
|
|
1131
|
-
* ClickHouse rejects one it cannot resolve, so an unrecognised zone used to
|
|
1132
|
-
* fail the whole report as an INTERNAL_ERROR with nothing naming the cause.
|
|
1133
|
-
*
|
|
1134
|
-
* Rejected rather than quietly defaulted to UTC. A silent fallback returns
|
|
1135
|
-
* a report that looks like the one that was asked for and is bucketed on
|
|
1136
|
-
* different days, which is the exact error this parameter exists to
|
|
1137
|
-
* prevent — better to say the zone is unknown than to answer for the wrong
|
|
1138
|
-
* one.
|
|
1139
|
-
*/
|
|
1140
|
-
timezone: z4.string().max(64).refine(isResolvableTimeZone, { message: "Unknown timezone \u2014 pass an IANA zone such as Europe/Madrid" }).optional(),
|
|
1141
|
-
/**
|
|
1142
|
-
* How wide one point of a series is.
|
|
1143
|
-
*
|
|
1144
|
-
* Chosen by the caller rather than derived from the window, because the
|
|
1145
|
-
* caller knows what it is drawing: the same 30 days is 30 points on a
|
|
1146
|
-
* dashboard and 4 on a slide. A 24-hour window at `day` granularity is one
|
|
1147
|
-
* bar, which is the shape this exists to prevent.
|
|
1148
|
-
*/
|
|
1149
|
-
granularity: z4.enum(["hour", "day", "week", "month"]).optional(),
|
|
1150
|
-
/**
|
|
1151
|
-
* Narrow to one landing by its `internalId`.
|
|
1152
|
-
*
|
|
1153
|
-
* The reference where `path` is a description: it survives the page being
|
|
1154
|
-
* renamed or moved, which is exactly when a before-and-after comparison
|
|
1155
|
-
* matters most and is exactly when `path` stops matching.
|
|
1156
|
-
*/
|
|
1157
|
-
landingId: z4.string().max(120).optional(),
|
|
1158
|
-
/** Narrows `landings` to the landings carrying one tag. */
|
|
1159
|
-
tag: z4.string().max(32).optional(),
|
|
1160
|
-
/**
|
|
1161
|
-
* Which visit the `session` preset replays.
|
|
1162
|
-
*
|
|
1163
|
-
* Ignored by every other preset. Not a filter on the aggregates: narrowing
|
|
1164
|
-
* a population report to one visitor produces numbers that are individually
|
|
1165
|
-
* true and collectively meaningless.
|
|
1166
|
-
*/
|
|
1167
|
-
sessionId: z4.string().max(120).optional(),
|
|
1168
|
-
/**
|
|
1169
|
-
* Whose earlier visits to resolve, as a lowercase hex digest.
|
|
1170
|
-
*
|
|
1171
|
-
* A digest and never an address: the identity a page sends is hashed in the
|
|
1172
|
-
* browser, and nothing downstream of that ever holds the original.
|
|
1173
|
-
*/
|
|
1174
|
-
identityHash: z4.string().max(128).optional(),
|
|
1175
|
-
/** Which page-defined event the `events` preset breaks down. */
|
|
1176
|
-
eventName: z4.string().max(120).optional(),
|
|
1177
|
-
/** Which of that event's own properties to break it down by. */
|
|
1178
|
-
property: z4.string().max(64).optional(),
|
|
1179
|
-
/**
|
|
1180
|
-
* Narrow the breakdown to the rows carrying one property value.
|
|
1181
|
-
*
|
|
1182
|
-
* Not the same as breaking down by a second key. Video is the case that
|
|
1183
|
-
* demanded it: every milestone carries `autoplay`, and the retention curve
|
|
1184
|
-
* of the videos a visitor chose to play is a different curve from the one a
|
|
1185
|
-
* muted hero produces by playing to nobody. Grouping gives the two totals;
|
|
1186
|
-
* only filtering gives either curve.
|
|
1187
|
-
*/
|
|
1188
|
-
where: z4.object({ property: z4.string().max(64), value: z4.string().max(120) }).optional(),
|
|
1189
|
-
/**
|
|
1190
|
-
* An ordered funnel over page-defined event names.
|
|
1191
|
-
*
|
|
1192
|
-
* Data rather than schema, deliberately: defining a new funnel is a
|
|
1193
|
-
* parameter on a request, not a migration and a deploy. The order is the
|
|
1194
|
-
* caller's and is enforced — a session counts at step N only if it produced
|
|
1195
|
-
* step N after step N-1, or "saw pricing then clicked demo" and the reverse
|
|
1196
|
-
* would be the same number.
|
|
1197
|
-
*/
|
|
1198
|
-
steps: z4.array(z4.string().max(120)).max(10).optional(),
|
|
1199
|
-
/**
|
|
1200
|
-
* Also return the immediately preceding window of the same length.
|
|
1201
|
-
*
|
|
1202
|
-
* The first question anyone asks of a number is "compared to what". Served
|
|
1203
|
-
* as a second full totals read rather than a delta computed in SQL, so the
|
|
1204
|
-
* comparison window is described in the response and a caller can render
|
|
1205
|
-
* either side of it.
|
|
1206
|
-
*/
|
|
1207
|
-
compare: z4.boolean().optional(),
|
|
1208
|
-
/** `devices` only: which facet to group on. */
|
|
1209
|
-
deviceGrain: z4.enum(["browser", "os", "engine", "device", "viewport"]).optional(),
|
|
1210
|
-
/**
|
|
1211
|
-
* One browser, by its cookie id.
|
|
1212
|
-
*
|
|
1213
|
-
* Narrows `people` to a single person, narrows `stream` to everything
|
|
1214
|
-
* that person did, and replays that person's whole history on `session` —
|
|
1215
|
-
* every visit they made, not just the one. Given with `sessionId`, the
|
|
1216
|
-
* session wins and this is ignored.
|
|
1217
|
-
*
|
|
1218
|
-
* On `stream` it is a seed rather than a cookie filter: the browser plus
|
|
1219
|
-
* every address, phone, click id and platform cookie ever seen beside it.
|
|
1220
|
-
* Filtering on the cookie alone would drop exactly the rows the reader
|
|
1221
|
-
* came for — a deal a CRM posted names the person and carries no cookie.
|
|
1222
|
-
*/
|
|
1223
|
-
anonId: z4.string().max(120).optional(),
|
|
1224
|
-
/**
|
|
1225
|
-
* `stream` and `session`: one person by any key the store recognises them
|
|
1226
|
-
* by — a contact digest, a CRM id, a click id, a platform cookie — for the
|
|
1227
|
-
* rows a system posted about somebody no browser has named yet. A browser
|
|
1228
|
-
* wins when both are given.
|
|
1229
|
-
*/
|
|
1230
|
-
personKind: z4.string().max(40).optional(),
|
|
1231
|
-
personValue: z4.string().max(255).optional(),
|
|
1232
|
-
/**
|
|
1233
|
-
* `stream` only: several people, each by whatever the reader holds about
|
|
1234
|
-
* them — an email, a phone, a CRM contact or deal id, a click id, a browser
|
|
1235
|
-
* id, `kind:value` to say which. Emails and phones are hashed by the
|
|
1236
|
-
* server; the plaintext never reaches the store. Wins over the single
|
|
1237
|
-
* person above, and every row comes back naming which of these it is
|
|
1238
|
-
* (`personTerms`), with how each was read in `peopleSearch`.
|
|
1239
|
-
*/
|
|
1240
|
-
people: peopleSearchInputSchema.optional(),
|
|
1241
|
-
/**
|
|
1242
|
-
* `people` only: keep only the visitors who converted.
|
|
1243
|
-
*
|
|
1244
|
-
* A parameter rather than a client-side filter because the list is capped:
|
|
1245
|
-
* filtering the most recent 200 visitors down to the ones who converted
|
|
1246
|
-
* usually leaves two, and reads as "we had two leads".
|
|
1247
|
-
*/
|
|
1248
|
-
onlyConverted: z4.boolean().optional(),
|
|
1249
|
-
/**
|
|
1250
|
-
* Which page of a list-shaped report to read, 1-based.
|
|
1251
|
-
*
|
|
1252
|
-
* Only three reports are lists of individual things rather than
|
|
1253
|
-
* breakdowns — `people`, `submissions` and `delivery` — and only those
|
|
1254
|
-
* three take this. A breakdown is a top-N by construction: page two of
|
|
1255
|
-
* "your busiest countries" is not a thing anybody wants.
|
|
1256
|
-
*
|
|
1257
|
-
* It exists because the alternative silently stopped being true. Every one
|
|
1258
|
-
* of those lists was capped, the cap was invisible, and the summary line
|
|
1259
|
-
* above the list counted the rows it had been handed — so an account with
|
|
1260
|
-
* four thousand visitors read "200 people visited in this period" with no
|
|
1261
|
-
* indication that the number was the cap talking. A cap that is reported is
|
|
1262
|
-
* a page; a cap that is not is a wrong answer.
|
|
1263
|
-
*/
|
|
1264
|
-
page: z4.coerce.number().int().min(1).max(ANALYTICS_MAX_PAGE).optional(),
|
|
1265
|
-
/**
|
|
1266
|
-
* How many rows one page holds. Bounded, because the reader is a browser.
|
|
1267
|
-
*
|
|
1268
|
-
* Omitted, a list keeps the size it had before pagination existed, which is
|
|
1269
|
-
* what keeps `baker analytics submissions --full` returning the same 800
|
|
1270
|
-
* rows it always did for an agent that reads the whole thing in one go.
|
|
1271
|
-
*/
|
|
1272
|
-
pageSize: z4.coerce.number().int().min(1).max(ANALYTICS_MAX_PAGE_SIZE).optional()
|
|
1273
|
-
}).refine((value) => value.preset !== "page" || typeof value.path === "string", {
|
|
1274
|
-
message: "The 'page' preset needs --path",
|
|
1275
|
-
path: ["path"]
|
|
1276
|
-
}).refine(
|
|
1277
|
-
(value) => value.preset !== "session" || typeof value.sessionId === "string" || typeof value.anonId === "string" || typeof value.personValue === "string",
|
|
1278
|
-
{
|
|
1279
|
-
message: "The 'session' preset needs --session, a browser id or a person key",
|
|
1280
|
-
path: ["sessionId"]
|
|
1281
|
-
}
|
|
1282
|
-
).refine((value) => value.property === void 0 || typeof value.eventName === "string", {
|
|
1283
|
-
message: "Breaking an event down by a property needs --event too",
|
|
1284
|
-
path: ["property"]
|
|
1285
|
-
}).refine((value) => value.where === void 0 || typeof value.property === "string", {
|
|
1286
|
-
message: "Narrowing with --where needs --event and --property too",
|
|
1287
|
-
path: ["where"]
|
|
1288
|
-
});
|
|
1289
|
-
var analyticsWindowSchema = z4.object({
|
|
1290
|
-
startDate: z4.iso.date(),
|
|
1291
|
-
endDate: z4.iso.date(),
|
|
1292
|
-
days: z4.number().int().positive(),
|
|
1293
|
-
/** True when the window reaches past the datasource TTL, so part of it is simply gone. */
|
|
1294
|
-
beyondRetention: z4.boolean()
|
|
1295
|
-
});
|
|
1296
|
-
var analyticsTotalsSchema = z4.object({
|
|
1297
|
-
/** Counted from `visitor_new`. */
|
|
1298
|
-
visitors: z4.number().int().nonnegative(),
|
|
1299
|
-
/** Counted from `session_start`. */
|
|
1300
|
-
sessions: z4.number().int().nonnegative(),
|
|
1301
|
-
pageViews: z4.number().int().nonnegative(),
|
|
1302
|
-
/**
|
|
1303
|
-
* Every conversion, counting a visit twice when it converted twice.
|
|
1304
|
-
*
|
|
1305
|
-
* A Form's author can mark an outcome as counting every time it happens — a
|
|
1306
|
-
* download, a repeatable action — so this legitimately runs ahead of
|
|
1307
|
-
* {@link convertingSessions}, and of `sessions`.
|
|
1308
|
-
*/
|
|
1309
|
-
conversions: z4.number().int().nonnegative(),
|
|
1310
|
-
/**
|
|
1311
|
-
* Conversions in the window that no landing earned — by people none of the
|
|
1312
|
-
* company's pages saw. Not in `conversions`, which is a page metric; shown
|
|
1313
|
-
* beside it so a deal a CRM reported is never a silent zero. Zero under any
|
|
1314
|
-
* scope.
|
|
1315
|
-
*/
|
|
1316
|
-
unplacedConversions: z4.number().int().nonnegative().default(0),
|
|
1317
|
-
/** Visits that produced at least one conversion. Never above `sessions`. */
|
|
1318
|
-
convertingSessions: z4.number().int().nonnegative(),
|
|
1319
|
-
/**
|
|
1320
|
-
* Converting visits per visit, 0–1. Null when there were no visits.
|
|
1321
|
-
*
|
|
1322
|
-
* Over converting visits rather than over conversions, because the second
|
|
1323
|
-
* ratio passes 1 the moment one visit converts twice — and a headline card
|
|
1324
|
-
* reading "125%" is read as a broken report, not as a visitor who did the
|
|
1325
|
-
* thing twice. The count above still says how often it happened.
|
|
1326
|
-
*/
|
|
1327
|
-
conversionRate: z4.number().min(0).max(1).nullable(),
|
|
1328
|
-
avgEngagementMs: z4.number().nonnegative().nullable(),
|
|
1329
|
-
/** Page views per session. At or near 1 means visitors leave from the page they land on. */
|
|
1330
|
-
pagesPerSession: z4.number().nonnegative().nullable()
|
|
1331
|
-
});
|
|
1332
|
-
var analyticsTrendPointSchema = z4.object({
|
|
1333
|
-
/**
|
|
1334
|
-
* The bucket's start, as an ISO instant.
|
|
1335
|
-
*
|
|
1336
|
-
* A full instant rather than a date, because a series is no longer always
|
|
1337
|
-
* daily: at `hour` granularity `2026-08-22` names twenty-four points, and at
|
|
1338
|
-
* `month` it names one that started three weeks earlier. It is also now
|
|
1339
|
-
* timezone-aware, so the same instant is a different calendar day depending
|
|
1340
|
-
* on the zone the caller asked for — which a bare `YYYY-MM-DD` cannot
|
|
1341
|
-
* express without silently choosing one.
|
|
1342
|
-
*/
|
|
1343
|
-
bucket: z4.string(),
|
|
1344
|
-
visitors: z4.number().int().nonnegative(),
|
|
1345
|
-
sessions: z4.number().int().nonnegative(),
|
|
1346
|
-
pageViews: z4.number().int().nonnegative(),
|
|
1347
|
-
conversions: z4.number().int().nonnegative()
|
|
1348
|
-
});
|
|
1349
|
-
var analyticsLandingRowSchema = z4.object({
|
|
1350
|
-
/** The landing's `internalId` — the reference every event carries. */
|
|
1351
|
-
landingId: z4.string(),
|
|
1352
|
-
/** The Convex `landings._id`, so a dashboard can link straight to the row. */
|
|
1353
|
-
landingRef: z4.string(),
|
|
1354
|
-
/**
|
|
1355
|
-
* What a person calls it, or `""` when the dimension has not been mirrored
|
|
1356
|
-
* yet.
|
|
1357
|
-
*
|
|
1358
|
-
* Empty is a real and temporary state — a landing published before the
|
|
1359
|
-
* mirror existed, or one whose sync has not run — and it is reported rather
|
|
1360
|
-
* than papered over with the id, so a caller can say "not synced yet"
|
|
1361
|
-
* instead of showing something that looks like a name and is not.
|
|
1362
|
-
*/
|
|
1363
|
-
name: z4.string(),
|
|
1364
|
-
slug: z4.string(),
|
|
1365
|
-
tags: z4.array(z4.string()),
|
|
1366
|
-
views: z4.number().int().nonnegative(),
|
|
1367
|
-
sessions: z4.number().int().nonnegative(),
|
|
1368
|
-
/** Sessions that BEGAN here — the page's Visits on screen, summing to the headline, and its rate's denominator. */
|
|
1369
|
-
entrances: z4.number().int().nonnegative(),
|
|
1370
|
-
visitors: z4.number().int().nonnegative(),
|
|
1371
|
-
/**
|
|
1372
|
-
* Conversions that fired ON this landing — rarely the number to show.
|
|
1373
|
-
*
|
|
1374
|
-
* A landing's outcome usually happens somewhere else: the client's checkout,
|
|
1375
|
-
* their shop, a CRM days later. None of those rows carries a landing id, so
|
|
1376
|
-
* this reads 0 for a page whose visits convert reliably.
|
|
1377
|
-
*/
|
|
1378
|
-
conversions: z4.number().int().nonnegative(),
|
|
1379
|
-
/** Visits that converted on this page at least once. */
|
|
1380
|
-
convertingSessions: z4.number().int().nonnegative(),
|
|
1381
|
-
/**
|
|
1382
|
-
* Conversions this landing led to — what the page is bought for.
|
|
1383
|
-
*
|
|
1384
|
-
* The landing rule: a conversion on the page, or anywhere else when this was
|
|
1385
|
-
* the last landing its person viewed, up to 90 days before. So it includes
|
|
1386
|
-
* the sale a returning visitor made next week and the deal a CRM posted with
|
|
1387
|
-
* no cookie at all, and the landings add up to the headline.
|
|
1388
|
-
*/
|
|
1389
|
-
creditedConversions: z4.number().int().nonnegative(),
|
|
1390
|
-
/** People whose conversions are credited here. */
|
|
1391
|
-
creditedVisitors: z4.number().int().nonnegative(),
|
|
1392
|
-
/** Visits credited at least one conversion here — the rate's numerator. */
|
|
1393
|
-
creditedVisits: z4.number().int().nonnegative(),
|
|
1394
|
-
outboundClicks: z4.number().int().nonnegative(),
|
|
1395
|
-
/**
|
|
1396
|
-
* `creditedVisits` over `entrances`, capped at 1 — the headline's converted
|
|
1397
|
-
* visits over visits, for one page, so the rows add up to the headline.
|
|
1398
|
-
* Null when no visit started here.
|
|
1399
|
-
*
|
|
1400
|
-
* Converting visits, not conversions: see {@link analyticsTotalsSchema}.
|
|
1401
|
-
*/
|
|
1402
|
-
conversionRate: z4.number().min(0).max(1).nullable(),
|
|
1403
|
-
avgEngagementMs: z4.number().nonnegative().nullable(),
|
|
1404
|
-
/**
|
|
1405
|
-
* Views per bucket, zero-filled against the same axis every other landing
|
|
1406
|
-
* in the response uses — so the arrays are the same length and can be drawn
|
|
1407
|
-
* side by side without asking what each element means.
|
|
1408
|
-
*/
|
|
1409
|
-
sparkline: z4.array(z4.number().int().nonnegative()),
|
|
1410
|
-
/**
|
|
1411
|
-
* The ad platforms actually sending this page traffic — `google`, `meta`,
|
|
1412
|
-
* `linkedin`, `tiktok`, `x`, `microsoft`.
|
|
1413
|
-
*
|
|
1414
|
-
* Derived from the click ids a visit arrived with, never from `utm_source`:
|
|
1415
|
-
* a label is whatever somebody typed into a tracking template, a `gclid` is a
|
|
1416
|
-
* click. Ordered by traffic, busiest first.
|
|
1417
|
-
*/
|
|
1418
|
-
channels: z4.array(z4.string()),
|
|
1419
|
-
/**
|
|
1420
|
-
* Visits that started on the page, per entry of {@link channels}, in the
|
|
1421
|
-
* same order — so a page's marks add up to its share of Ads → Audience.
|
|
1422
|
-
*
|
|
1423
|
-
* The half that makes a mark readable. A mark on its own says "advertised
|
|
1424
|
-
* here", which is why it used to be withheld until three visits had arrived —
|
|
1425
|
-
* and withholding it is what made a page whose whole day was five Meta clicks
|
|
1426
|
-
* show nothing at all. The count says how much, so one test click and a live
|
|
1427
|
-
* campaign are distinguishable by reading rather than by absence.
|
|
1428
|
-
*/
|
|
1429
|
-
channelSessions: z4.array(z4.number().int().nonnegative())
|
|
1430
|
-
});
|
|
1431
|
-
var analyticsTagRowSchema = z4.object({
|
|
1432
|
-
tag: z4.string(),
|
|
1433
|
-
landings: z4.number().int().nonnegative(),
|
|
1434
|
-
views: z4.number().int().nonnegative(),
|
|
1435
|
-
sessions: z4.number().int().nonnegative(),
|
|
1436
|
-
entrances: z4.number().int().nonnegative(),
|
|
1437
|
-
conversions: z4.number().int().nonnegative(),
|
|
1438
|
-
/** Visits that converted on one of this tag's pages. */
|
|
1439
|
-
convertingSessions: z4.number().int().nonnegative(),
|
|
1440
|
-
/** Converting visits per entrance. */
|
|
1441
|
-
conversionRate: z4.number().min(0).max(1).nullable()
|
|
1442
|
-
});
|
|
1443
|
-
var ANALYTICS_EVENT_ORIGINS = ["site", "systems", "both"];
|
|
1444
|
-
var analyticsCustomEventRowSchema = z4.object({
|
|
1445
|
-
eventName: z4.string(),
|
|
1446
|
-
events: z4.number().int().nonnegative(),
|
|
1447
|
-
sessions: z4.number().int().nonnegative(),
|
|
1448
|
-
visitors: z4.number().int().nonnegative(),
|
|
1449
|
-
/**
|
|
1450
|
-
* The property keys this event carries.
|
|
1451
|
-
*
|
|
1452
|
-
* The keys, not the values: a caller has to know what it can break the event
|
|
1453
|
-
* down BY before it can ask, and the values are unbounded where the keys are
|
|
1454
|
-
* capped. This is what lets a dashboard offer the breakdown without the
|
|
1455
|
-
* reader already knowing what the page chose to record.
|
|
1456
|
-
*/
|
|
1457
|
-
propertyKeys: z4.array(z4.string()),
|
|
1458
|
-
/**
|
|
1459
|
-
* What these events were worth, per currency.
|
|
1460
|
-
*
|
|
1461
|
-
* A map and never one number, for the reason the person card's `money` is
|
|
1462
|
-
* one: a name carrying 99,882.50 EUR and 1,000 USD is not worth 100,882.50
|
|
1463
|
-
* of anything, and there is no rate in this product to make it so.
|
|
1464
|
-
*
|
|
1465
|
-
* The `''` key is a value a *page* reported — `value` with no currency,
|
|
1466
|
-
* which is a score on the page's own terms rather than money. Kept rather
|
|
1467
|
-
* than dropped, because for those events it is the only number there is.
|
|
1468
|
-
*/
|
|
1469
|
-
money: z4.record(z4.string(), z4.number()).default({}),
|
|
1470
|
-
landings: z4.array(z4.string()),
|
|
1471
|
-
/** Which collector produced this name — and `both` when more than one did. */
|
|
1472
|
-
origin: z4.enum(ANALYTICS_EVENT_ORIGINS)
|
|
1473
|
-
});
|
|
1474
|
-
var analyticsEventBreakdownRowSchema = z4.object({
|
|
1475
|
-
value: z4.string(),
|
|
1476
|
-
events: z4.number().int().nonnegative(),
|
|
1477
|
-
sessions: z4.number().int().nonnegative(),
|
|
1478
|
-
/** Per currency, exactly as {@link analyticsCustomEventRowSchema.money}. */
|
|
1479
|
-
money: z4.record(z4.string(), z4.number()).default({})
|
|
1480
|
-
});
|
|
1481
|
-
var analyticsCustomFunnelStepSchema = z4.object({
|
|
1482
|
-
stepIndex: z4.number().int().positive(),
|
|
1483
|
-
stepName: z4.string(),
|
|
1484
|
-
sessions: z4.number().int().nonnegative(),
|
|
1485
|
-
/** Share of the sessions that reached the previous step. Null on the first. */
|
|
1486
|
-
stepRate: z4.number().min(0).max(1).nullable(),
|
|
1487
|
-
/** Share of the sessions that reached step one. Null on the first. */
|
|
1488
|
-
overallRate: z4.number().min(0).max(1).nullable()
|
|
1489
|
-
});
|
|
1490
|
-
var analyticsDeviceRowSchema = z4.object({
|
|
1491
|
-
/** The bucket label — `Chrome 120.0`, `iOS 17.4`, `380–767`. */
|
|
1492
|
-
bucket: z4.string(),
|
|
1493
|
-
sessions: z4.number().int().nonnegative(),
|
|
1494
|
-
pageViews: z4.number().int().nonnegative(),
|
|
1495
|
-
convertingSessions: z4.number().int().nonnegative(),
|
|
1496
|
-
conversions: z4.number().int().nonnegative(),
|
|
1497
|
-
/**
|
|
1498
|
-
* Converting sessions over sessions.
|
|
1499
|
-
*
|
|
1500
|
-
* Over sessions rather than conversions over sessions, because one session
|
|
1501
|
-
* can submit twice and a rate above 1 in a browser-comparison table reads as
|
|
1502
|
-
* a bug in the report rather than as a visitor who filled two forms.
|
|
1503
|
-
*/
|
|
1504
|
-
conversionRate: z4.number().min(0).max(1).nullable(),
|
|
1505
|
-
avgEngagementMs: z4.number().nonnegative().nullable()
|
|
1506
|
-
});
|
|
1507
|
-
var analyticsPageRowSchema = z4.object({
|
|
1508
|
-
path: z4.string(),
|
|
1509
|
-
/**
|
|
1510
|
-
* The landing's own `internalId`, straight out of its `_definition.md`.
|
|
1511
|
-
*
|
|
1512
|
-
* The path says where the page is; this says which page it is, so a number
|
|
1513
|
-
* here lines up with a file the agent can open — and with the same page after
|
|
1514
|
-
* it has been renamed, which the path does not. Empty for a path with no
|
|
1515
|
-
* landing behind it.
|
|
1516
|
-
*/
|
|
1517
|
-
landingId: z4.string(),
|
|
1518
|
-
pageViews: z4.number().int().nonnegative(),
|
|
1519
|
-
/** Sessions that began on this page — its value as a landing page. */
|
|
1520
|
-
entrances: z4.number().int().nonnegative(),
|
|
1521
|
-
/**
|
|
1522
|
-
* Conversions that fired ON this page — "which page converts".
|
|
1523
|
-
*
|
|
1524
|
-
* Almost never the number to put beside Entrances. A landing page's job is to
|
|
1525
|
-
* start a visit that converts, and the conversion is usually somewhere else:
|
|
1526
|
-
* the shop, the checkout, a CRM a week later. Read alone this makes every
|
|
1527
|
-
* landing page of a real funnel report zero.
|
|
1528
|
-
*/
|
|
1529
|
-
conversions: z4.number().int().nonnegative(),
|
|
1530
|
-
/** Visits that converted on this page at least once. */
|
|
1531
|
-
convertingSessions: z4.number().int().nonnegative(),
|
|
1532
|
-
/**
|
|
1533
|
-
* Conversions credited to this landing page by the landing rule — on it, or
|
|
1534
|
-
* anywhere when it was the last landing page its person viewed, up to 90
|
|
1535
|
-
* days before. The number a landing-page table means by "conversions".
|
|
1536
|
-
*/
|
|
1537
|
-
creditedConversions: z4.number().int().nonnegative(),
|
|
1538
|
-
/** People whose conversions are credited here. */
|
|
1539
|
-
creditedVisitors: z4.number().int().nonnegative(),
|
|
1540
|
-
/** Credited people per entrance, 0–1. Null when nobody landed here. */
|
|
1541
|
-
conversionRate: z4.number().min(0).max(1).nullable(),
|
|
1542
|
-
avgEngagementMs: z4.number().nonnegative().nullable()
|
|
1543
|
-
});
|
|
1544
|
-
var analyticsSourceRowSchema = z4.object({
|
|
1545
|
-
source: z4.string(),
|
|
1546
|
-
medium: z4.string(),
|
|
1547
|
-
sessions: z4.number().int().nonnegative(),
|
|
1548
|
-
conversions: z4.number().int().nonnegative(),
|
|
1549
|
-
conversionRate: z4.number().min(0).max(1).nullable()
|
|
1550
|
-
});
|
|
1551
|
-
var analyticsCampaignRowSchema = z4.object({
|
|
1552
|
-
utmSource: z4.string(),
|
|
1553
|
-
utmMedium: z4.string(),
|
|
1554
|
-
utmCampaign: z4.string(),
|
|
1555
|
-
/**
|
|
1556
|
-
* The platform a click id proves, or `""` when the visit carried none.
|
|
1557
|
-
*
|
|
1558
|
-
* What separates a campaign the ad breakdown already reports — with its
|
|
1559
|
-
* platform proven and its ad set and ad underneath — from one nothing else
|
|
1560
|
-
* can show: the newsletter, the partner link, the hand-tagged post. The two
|
|
1561
|
-
* are otherwise identical, because `utm_campaign={campaignid}` is the normal
|
|
1562
|
-
* tagging convention and produces the same ids in both places.
|
|
1563
|
-
*
|
|
1564
|
-
* Kept on the row rather than filtered out here: a CLI hint reads an empty
|
|
1565
|
-
* campaign list as "no campaign tagging on any traffic", and dropping the
|
|
1566
|
-
* paid ones would make that fire on a perfectly tagged account.
|
|
1567
|
-
*/
|
|
1568
|
-
clickPlatform: z4.string(),
|
|
1569
|
-
sessions: z4.number().int().nonnegative(),
|
|
1570
|
-
conversions: z4.number().int().nonnegative(),
|
|
1571
|
-
conversionRate: z4.number().min(0).max(1).nullable()
|
|
1572
|
-
});
|
|
1573
|
-
var analyticsRealtimeMinuteSchema = z4.object({
|
|
1574
|
-
/** The minute, as an ISO instant. */
|
|
1575
|
-
minute: z4.string(),
|
|
1576
|
-
visitors: z4.number().int().nonnegative(),
|
|
1577
|
-
pageViews: z4.number().int().nonnegative()
|
|
1578
|
-
});
|
|
1579
|
-
var analyticsRealtimePageSchema = z4.object({
|
|
1580
|
-
path: z4.string(),
|
|
1581
|
-
/** The landing this path belongs to; empty when no landing claims it. */
|
|
1582
|
-
landingId: z4.string(),
|
|
1583
|
-
visitors: z4.number().int().nonnegative()
|
|
1584
|
-
});
|
|
1585
|
-
var analyticsRealtimeSchema = z4.object({
|
|
1586
|
-
/** Distinct visitors with any activity inside the active window. */
|
|
1587
|
-
activeNow: z4.number().int().nonnegative(),
|
|
1588
|
-
/** How recently a visitor must have acted to be counted, in minutes. */
|
|
1589
|
-
activeWithinMinutes: z4.number().int().positive(),
|
|
1590
|
-
minutes: z4.array(analyticsRealtimeMinuteSchema),
|
|
1591
|
-
pages: z4.array(analyticsRealtimePageSchema)
|
|
1592
|
-
});
|
|
1593
|
-
var analyticsDimensionRowSchema = z4.object({
|
|
1594
|
-
key: z4.string(),
|
|
1595
|
-
sessions: z4.number().int().nonnegative(),
|
|
1596
|
-
conversions: z4.number().int().nonnegative(),
|
|
1597
|
-
conversionRate: z4.number().min(0).max(1).nullable()
|
|
1598
|
-
});
|
|
1599
|
-
var analyticsFunnelStepSchema = z4.object({
|
|
1600
|
-
stepId: z4.string(),
|
|
1601
|
-
stepIndex: z4.number().int().nonnegative(),
|
|
1602
|
-
/** Visits that moved forward into this step. Never events — see `visits`. */
|
|
1603
|
-
views: z4.number().int().nonnegative(),
|
|
1604
|
-
/** Visits that finished this step and moved on. */
|
|
1605
|
-
completions: z4.number().int().nonnegative(),
|
|
1606
|
-
/** Share of viewers who did not complete this step, 0–1. */
|
|
1607
|
-
dropRate: z4.number().min(0).max(1).nullable(),
|
|
1608
|
-
/**
|
|
1609
|
-
* Visits that converted AT this step — the node kind's own outcome trigger
|
|
1610
|
-
* fired here, or the Form was submitted here.
|
|
1611
|
-
*
|
|
1612
|
-
* Usually zero on every step but one. That is the point: a Form has one
|
|
1613
|
-
* conversion, and knowing which step owns it is what stops a drop-off chart
|
|
1614
|
-
* treating the booking widget's "profile viewed" as a funnel stage.
|
|
1615
|
-
*/
|
|
1616
|
-
convertedSessions: z4.number().int().nonnegative(),
|
|
1617
|
-
/**
|
|
1618
|
-
* This step is where the Form ends — a confirmation screen, not a loss.
|
|
1619
|
-
*
|
|
1620
|
-
* Stated rather than left to be inferred. The dashboard used to read it off
|
|
1621
|
-
* `dropRate === null`, which is also how a step nobody viewed arrives, so a
|
|
1622
|
-
* converting link node in the middle of a Form was labelled its ending.
|
|
1623
|
-
*/
|
|
1624
|
-
isEnding: z4.boolean()
|
|
1625
|
-
});
|
|
1626
|
-
var analyticsFunnelSchema = z4.object({
|
|
1627
|
-
flowSlug: z4.string(),
|
|
1628
|
-
/**
|
|
1629
|
-
* Visits that saw the Form at all — the denominator for every share here.
|
|
1630
|
-
*
|
|
1631
|
-
* Read this, not `starts`, whenever the question is "out of how many". A
|
|
1632
|
-
* start is recorded at the visitor's FIRST INTERACTION, so the two differ by
|
|
1633
|
-
* exactly the people who looked at the Form and never touched it — usually
|
|
1634
|
-
* most of them, and always the group a drop-off chart exists to find.
|
|
1635
|
-
*
|
|
1636
|
-
* Every count in this object is distinct visits, including each step's
|
|
1637
|
-
* `views` and `completions`. That is load-bearing rather than incidental:
|
|
1638
|
-
* the screen divides these by each other, and while the steps counted events
|
|
1639
|
-
* a Form four people had opened reported one step reached fifteen times and
|
|
1640
|
-
* fourteen people lost.
|
|
1641
|
-
*/
|
|
1642
|
-
visits: z4.number().int().nonnegative(),
|
|
1643
|
-
/** Visits that interacted with the Form at all — typed, picked, or advanced. */
|
|
1644
|
-
starts: z4.number().int().nonnegative(),
|
|
1645
|
-
submits: z4.number().int().nonnegative(),
|
|
1646
|
-
/** Conversions per visit that opened the Form, 0–1. */
|
|
1647
|
-
completionRate: z4.number().min(0).max(1).nullable(),
|
|
1648
|
-
/** The step losing the most people. The single most useful field here. */
|
|
1649
|
-
worstStep: analyticsFunnelStepSchema.nullable(),
|
|
1650
|
-
steps: z4.array(analyticsFunnelStepSchema),
|
|
1651
|
-
/**
|
|
1652
|
-
* Visits that converted, counted once each at whichever node did it.
|
|
1653
|
-
*
|
|
1654
|
-
* Read this rather than `submits` whenever the two disagree. `submits` only
|
|
1655
|
-
* fires when a flow runs out of nodes, so a Form that books a call on a
|
|
1656
|
-
* mid-flow Calendly node reports zero submits and every one of its real
|
|
1657
|
-
* bookings here.
|
|
1658
|
-
*/
|
|
1659
|
-
convertedSessions: z4.number().int().nonnegative()
|
|
1660
|
-
});
|
|
1661
|
-
var analyticsPaidRowSchema = z4.object({
|
|
1662
|
-
source: z4.string(),
|
|
1663
|
-
medium: z4.string(),
|
|
1664
|
-
campaign: z4.string(),
|
|
1665
|
-
content: z4.string(),
|
|
1666
|
-
term: z4.string(),
|
|
1667
|
-
/** `google` | `meta` | `tiktok` | `x` | `linkedin` | `microsoft` | `""`. */
|
|
1668
|
-
clickPlatform: z4.string(),
|
|
1669
|
-
sessions: z4.number().int().nonnegative(),
|
|
1670
|
-
convertingSessions: z4.number().int().nonnegative(),
|
|
1671
|
-
conversions: z4.number().int().nonnegative(),
|
|
1672
|
-
/** Leads whose server-side delivery reported success. */
|
|
1673
|
-
delivered: z4.number().int().nonnegative(),
|
|
1674
|
-
/** Leads whose delivery reported failure. Non-zero here is a broken integration. */
|
|
1675
|
-
failedDeliveries: z4.number().int().nonnegative(),
|
|
1676
|
-
/** Distinct people, across devices — only countable where visitors identified themselves. */
|
|
1677
|
-
identifiedPeople: z4.number().int().nonnegative(),
|
|
1678
|
-
/** Converting sessions per session, 0–1. */
|
|
1679
|
-
conversionRate: z4.number().min(0).max(1).nullable(),
|
|
1680
|
-
/** Delivered leads per conversion, 0–1. Below 1 means leads are being lost after submit. */
|
|
1681
|
-
deliveryRate: z4.number().min(0).max(1).nullable()
|
|
1682
|
-
});
|
|
1683
|
-
var analyticsDeliveryRowSchema = z4.object({
|
|
1684
|
-
eventId: z4.string(),
|
|
1685
|
-
submittedAt: z4.string(),
|
|
1686
|
-
/**
|
|
1687
|
-
* The visit the submission was made in, so a lead can be opened as a story.
|
|
1688
|
-
*
|
|
1689
|
-
* The whole reason a delivery row is worth clicking. Without it a submission
|
|
1690
|
-
* is a timestamp and a CRM outcome, and the questions anybody actually has —
|
|
1691
|
-
* which ad brought them, what they read first, how long they took — are all
|
|
1692
|
-
* on the other side of this one join.
|
|
1693
|
-
*/
|
|
1694
|
-
sessionId: z4.string(),
|
|
1695
|
-
/** Lowercase hex digest of who submitted, when the page could identify them. */
|
|
1696
|
-
identityHash: z4.string(),
|
|
1697
|
-
flowSlug: z4.string(),
|
|
1698
|
-
stepId: z4.string(),
|
|
1699
|
-
landingId: z4.string(),
|
|
1700
|
-
destinations: z4.array(z4.string()),
|
|
1701
|
-
dispatched: z4.number().int().nonnegative(),
|
|
1702
|
-
succeeded: z4.number().int().nonnegative(),
|
|
1703
|
-
failed: z4.number().int().nonnegative(),
|
|
1704
|
-
/** Dispatched and never settled. Distinguishing this from failed is "wait" vs "act". */
|
|
1705
|
-
pending: z4.number().int().nonnegative(),
|
|
1706
|
-
/**
|
|
1707
|
-
* The ids the destinations gave back.
|
|
1708
|
-
*
|
|
1709
|
-
* A submission that succeeded everywhere and carries none of these is a real
|
|
1710
|
-
* and previously invisible failure: the integration accepted the call and
|
|
1711
|
-
* dropped the record.
|
|
1712
|
-
*/
|
|
1713
|
-
providerRefs: z4.array(z4.string()),
|
|
1714
|
-
sampleError: z4.string()
|
|
1715
|
-
});
|
|
1716
|
-
var analyticsTriggerRowSchema = z4.object({
|
|
1717
|
-
flowSlug: z4.string(),
|
|
1718
|
-
/** `link`, `customForm`, `iframe`, `hubspotMeeting`, … */
|
|
1719
|
-
nodeType: z4.string(),
|
|
1720
|
-
/** The trigger, verbatim: `link.onClick`, `iframe.checkout_completed`. */
|
|
1721
|
-
triggerId: z4.string(),
|
|
1722
|
-
fires: z4.number().int().nonnegative(),
|
|
1723
|
-
sessions: z4.number().int().nonnegative(),
|
|
1724
|
-
/** How many of those fires produced a side effect. Often zero, on purpose. */
|
|
1725
|
-
sideEffectsFired: z4.number().int().nonnegative()
|
|
1726
|
-
});
|
|
1727
|
-
var analyticsReleaseRowSchema = z4.object({
|
|
1728
|
-
/** The commit the build came from. */
|
|
1729
|
-
release: z4.string(),
|
|
1730
|
-
firstSeen: z4.string(),
|
|
1731
|
-
lastSeen: z4.string(),
|
|
1732
|
-
sessions: z4.number().int().nonnegative(),
|
|
1733
|
-
pageViews: z4.number().int().nonnegative(),
|
|
1734
|
-
conversions: z4.number().int().nonnegative(),
|
|
1735
|
-
/** Visits that converted on this build at least once. */
|
|
1736
|
-
convertingSessions: z4.number().int().nonnegative(),
|
|
1737
|
-
/** Converting visits per session, 0–1. Null below a usable sample. */
|
|
1738
|
-
conversionRate: z4.number().min(0).max(1).nullable()
|
|
1739
|
-
});
|
|
1740
|
-
var analyticsGeoRowSchema = z4.object({
|
|
1741
|
-
/** The place itself, at whatever grain was asked for. */
|
|
1742
|
-
place: z4.string(),
|
|
1743
|
-
/** Always carried: a postcode without its country is ambiguous, a city twice over. */
|
|
1744
|
-
country: z4.string(),
|
|
1745
|
-
region: z4.string(),
|
|
1746
|
-
sessions: z4.number().int().nonnegative(),
|
|
1747
|
-
conversions: z4.number().int().nonnegative(),
|
|
1748
|
-
/** Conversions per session, 0–1. Null below a usable sample. */
|
|
1749
|
-
conversionRate: z4.number().min(0).max(1).nullable(),
|
|
1750
|
-
/** People rather than browsers, where the visit identified itself. */
|
|
1751
|
-
identifiedPeople: z4.number().int().nonnegative()
|
|
1752
|
-
});
|
|
1753
|
-
var analyticsBotRowSchema = z4.object({
|
|
1754
|
-
/** The crawler's name, or `unidentified` for a machine we could not name. */
|
|
1755
|
-
bot: z4.string(),
|
|
1756
|
-
/** `search` | `ai` | `social` | `seo` | `monitoring` | `tool` | `automation`. */
|
|
1757
|
-
category: z4.string(),
|
|
1758
|
-
hits: z4.number().int().nonnegative(),
|
|
1759
|
-
pages: z4.number().int().nonnegative(),
|
|
1760
|
-
lastSeen: z4.string(),
|
|
1761
|
-
samplePaths: z4.array(z4.string())
|
|
1762
|
-
});
|
|
1763
|
-
var analyticsHiddenMachinesSchema = z4.object({
|
|
1764
|
-
events: z4.number().int().nonnegative(),
|
|
1765
|
-
/** Which signal decided, most first: `ua` is a browser that said it is headless. */
|
|
1766
|
-
reasons: z4.array(
|
|
1767
|
-
z4.object({
|
|
1768
|
-
reason: z4.string(),
|
|
1769
|
-
events: z4.number().int().nonnegative(),
|
|
1770
|
-
lastSeen: z4.string()
|
|
1771
|
-
})
|
|
1772
|
-
)
|
|
1773
|
-
});
|
|
1774
|
-
var analyticsVisitorCompanyRowSchema = z4.object({
|
|
1775
|
-
/** The network's registered name, as Cloudflare reports it. */
|
|
1776
|
-
name: z4.string(),
|
|
1777
|
-
/** Null in v1 — Cloudflare names a network, never its website. */
|
|
1778
|
-
domain: z4.string().nullable(),
|
|
1779
|
-
/** `high`: the name reads as an organisation. `low`: it only cleared the ISP/cloud/VPN deny-list. */
|
|
1780
|
-
confidence: z4.enum(["high", "low"]),
|
|
1781
|
-
visits: z4.number().int().nonnegative(),
|
|
1782
|
-
pageViews: z4.number().int().nonnegative(),
|
|
1783
|
-
/** Distinct pages read. */
|
|
1784
|
-
pages: z4.number().int().nonnegative(),
|
|
1785
|
-
/** Up to ten of them. */
|
|
1786
|
-
topPages: z4.array(z4.string()),
|
|
1787
|
-
firstSeen: z4.string(),
|
|
1788
|
-
lastSeen: z4.string()
|
|
1789
|
-
});
|
|
1790
|
-
var analyticsWarningSchema = z4.object({
|
|
1791
|
-
/**
|
|
1792
|
-
* `AD_ROLE_UNMAPPED` is the one that reports a *question* rather than the
|
|
1793
|
-
* data. A role resolves to the parameter names that carry it, and when a
|
|
1794
|
-
* company has mapped none the list is empty — which the filter reads as
|
|
1795
|
-
* "arrived carrying none of these" and answers with a confident zero across
|
|
1796
|
-
* the whole report. Zero is a far more expensive conclusion than "nobody has
|
|
1797
|
-
* said which parameter that is", so the narrowing is dropped and this says so.
|
|
1798
|
-
*/
|
|
1799
|
-
code: z4.enum(["LOW_SAMPLE", "NO_DATA", "BEYOND_RETENTION", "AD_ROLE_UNMAPPED"]),
|
|
1800
|
-
message: z4.string()
|
|
1801
|
-
});
|
|
1802
|
-
var analyticsFlowSummarySchema = z4.object({
|
|
1803
|
-
flowSlug: z4.string(),
|
|
1804
|
-
sessions: z4.number().int().nonnegative(),
|
|
1805
|
-
starts: z4.number().int().nonnegative(),
|
|
1806
|
-
convertedSessions: z4.number().int().nonnegative(),
|
|
1807
|
-
submits: z4.number().int().nonnegative(),
|
|
1808
|
-
stepViews: z4.number().int().nonnegative(),
|
|
1809
|
-
/** Distinct steps anyone reached, across all visits. */
|
|
1810
|
-
stepsSeen: z4.number().int().nonnegative(),
|
|
1811
|
-
deepestStepIndex: z4.number().int().nonnegative(),
|
|
1812
|
-
/** Steps reached per visit, averaged — "how much of this Form do people read". */
|
|
1813
|
-
avgStepsReached: z4.number().nonnegative(),
|
|
1814
|
-
/** Conversions per visit that started, 0–1. */
|
|
1815
|
-
conversionRate: z4.number().min(0).max(1).nullable(),
|
|
1816
|
-
/** Which node ids produced the conversions. Usually one; two means two offers. */
|
|
1817
|
-
conversionSteps: z4.array(z4.string()),
|
|
1818
|
-
/** And by what — `calendlyEvent.eventScheduled`, `customForm.onFormSubmitted`. */
|
|
1819
|
-
conversionTriggers: z4.array(z4.string()),
|
|
1820
|
-
conversionNodeTypes: z4.array(z4.string()),
|
|
1821
|
-
lastSeen: z4.string()
|
|
1822
|
-
});
|
|
1823
|
-
var analyticsFlowEdgeSchema = z4.object({
|
|
1824
|
-
flowSlug: z4.string(),
|
|
1825
|
-
fromStep: z4.string(),
|
|
1826
|
-
toStep: z4.string(),
|
|
1827
|
-
sessions: z4.number().int().nonnegative()
|
|
1828
|
-
});
|
|
1829
|
-
var analyticsConversionRowSchema = z4.object({
|
|
1830
|
-
/** What a person calls this outcome. */
|
|
1831
|
-
name: z4.string(),
|
|
1832
|
-
/** Every event counted under this name. One entry unless the name is shared. */
|
|
1833
|
-
eventKeys: z4.array(z4.string()),
|
|
1834
|
-
/**
|
|
1835
|
-
* `once_per_visit` | `every_time` — how repeats inside one visit are counted.
|
|
1836
|
-
*
|
|
1837
|
-
* `mixed` when a shared name spans both, which is a real state and an editing
|
|
1838
|
-
* accident; saying so is what makes it findable.
|
|
1839
|
-
*/
|
|
1840
|
-
countMode: z4.string(),
|
|
1841
|
-
/** Counted the way each definition asked to be counted, and credited to a landing. */
|
|
1842
|
-
conversions: z4.number(),
|
|
1843
|
-
/**
|
|
1844
|
-
* Times it happened that no landing earned: by people none of the company's
|
|
1845
|
-
* pages saw, within 90 days. Zero under a landing or an ad scope, where the
|
|
1846
|
-
* gap would mean something else. Absent on a row built before it existed.
|
|
1847
|
-
*/
|
|
1848
|
-
unplaced: z4.number().default(0),
|
|
1849
|
-
/** Distinct visits that produced it, never mode-adjusted. The gap between the two is the repeat behaviour. */
|
|
1850
|
-
convertingVisits: z4.number(),
|
|
1851
|
-
/** Null when it has never fired. */
|
|
1852
|
-
lastSeen: z4.string().nullable(),
|
|
1853
|
-
/**
|
|
1854
|
-
* The doors its events came in by in the window, in
|
|
1855
|
-
* {@link ANALYTICS_EVENT_DOORS} order. Empty when it has not fired.
|
|
1856
|
-
*/
|
|
1857
|
-
doors: z4.array(z4.enum(ANALYTICS_EVENT_DOORS)).default([]),
|
|
1858
|
-
/** Proposed in this chat: counted from when it is published, so every report reads it as nothing until then. */
|
|
1859
|
-
staged: z4.boolean().optional()
|
|
1860
|
-
});
|
|
1861
|
-
var analyticsEventCatalogRowSchema = z4.object({
|
|
1862
|
-
/** `form:…` | `submit:…` | `page:…` | `exit:…` — parse with `parseEventKey`. */
|
|
1863
|
-
eventKey: z4.string(),
|
|
1864
|
-
/**
|
|
1865
|
-
* Which collector produced this key — and `both` when more than one did.
|
|
1866
|
-
*
|
|
1867
|
-
* On the row rather than in the key, which is the whole shape of the change
|
|
1868
|
-
* that removed the `server:` family: a picker can say where an event came
|
|
1869
|
-
* from without a filter round-trip, and a report can still separate the two
|
|
1870
|
-
* populations at any grain, but nothing downstream has to learn a second
|
|
1871
|
-
* vocabulary to count one.
|
|
1872
|
-
*/
|
|
1873
|
-
origin: z4.enum(ANALYTICS_EVENT_ORIGINS),
|
|
1874
|
-
events: z4.number(),
|
|
1875
|
-
sessions: z4.number(),
|
|
1876
|
-
/** The Form node's kind, for a `form:` key. Empty otherwise. */
|
|
1877
|
-
nodeType: z4.string(),
|
|
1878
|
-
/** The Form this happened in, for a `form:` or `submit:` key. Empty otherwise. */
|
|
1879
|
-
flowSlug: z4.string(),
|
|
1880
|
-
/** Null when it has never fired — only possible for a row we already count. */
|
|
1881
|
-
lastSeen: z4.string().nullable(),
|
|
1882
|
-
/** Already counted as a conversion. Shown, never hidden: a row that vanished on being counted reads as a bug. */
|
|
1883
|
-
isCounted: z4.boolean(),
|
|
1884
|
-
/** The name it is counted under, when it is. */
|
|
1885
|
-
countedAs: z4.string(),
|
|
1886
|
-
/**
|
|
1887
|
-
* The doors on Sources this key's events came through, by name — the
|
|
1888
|
-
* `baker_source` each event carries. Empty for a key nothing on Sources
|
|
1889
|
-
* sent; more than one when two doors used one name.
|
|
1890
|
-
*/
|
|
1891
|
-
sources: z4.array(z4.string()),
|
|
1892
|
-
/**
|
|
1893
|
-
* The doors this key's events came in by, in {@link ANALYTICS_EVENT_DOORS}
|
|
1894
|
-
* order, each with its own volume — only the doors it actually used.
|
|
1895
|
-
*
|
|
1896
|
-
* `origin` says site or systems; this says which of the four, which is the
|
|
1897
|
-
* question every picker is read to answer. Defaulted, so a store that
|
|
1898
|
-
* predates the column parses as "no door known" rather than failing.
|
|
1899
|
-
*/
|
|
1900
|
-
doors: z4.array(z4.object({ door: z4.enum(ANALYTICS_EVENT_DOORS), events: z4.number(), sessions: z4.number() })).default([])
|
|
1901
|
-
});
|
|
1902
|
-
var analyticsAdDimensionRowSchema = z4.object({
|
|
1903
|
-
/** The dimension's value. Empty means "arrived carrying none of these". */
|
|
1904
|
-
value: z4.string(),
|
|
1905
|
-
/** Which platform stamped the click, from the click id rather than a label. */
|
|
1906
|
-
platform: z4.string(),
|
|
1907
|
-
sessions: z4.number(),
|
|
1908
|
-
convertingSessions: z4.number(),
|
|
1909
|
-
conversions: z4.number(),
|
|
1910
|
-
bouncedSessions: z4.number(),
|
|
1911
|
-
identifiedPeople: z4.number(),
|
|
1912
|
-
pageViews: z4.number(),
|
|
1913
|
-
engagementMs: z4.number(),
|
|
1914
|
-
/** Conversions per session, or null when nothing arrived. */
|
|
1915
|
-
conversionRate: z4.number().nullable(),
|
|
1916
|
-
/** Bounces per session, or null when nothing arrived. */
|
|
1917
|
-
bounceRate: z4.number().nullable()
|
|
1918
|
-
});
|
|
1919
|
-
var analyticsAdParamRowSchema = z4.object({
|
|
1920
|
-
name: z4.string(),
|
|
1921
|
-
/** Whether the value is stored, or only the fact that the name appeared. */
|
|
1922
|
-
captured: z4.boolean(),
|
|
1923
|
-
/** The role in force for the platform asked about, built-in or configured. */
|
|
1924
|
-
role: adParamRoleSchema.optional(),
|
|
1925
|
-
/**
|
|
1926
|
-
* True when this company said what it means, rather than Baker knowing it.
|
|
1927
|
-
*
|
|
1928
|
-
* The difference between a row that can be reset to a sensible default and
|
|
1929
|
-
* one where clearing it means "nobody has said".
|
|
1930
|
-
*/
|
|
1931
|
-
configured: z4.boolean(),
|
|
1932
|
-
/**
|
|
1933
|
-
* Visits carrying this parameter **that arrived from the platform asked
|
|
1934
|
-
* about**, not visits carrying it anywhere.
|
|
1935
|
-
*
|
|
1936
|
-
* This used to be the second: one inventory of every parameter on every
|
|
1937
|
-
* visit, shown identically under each platform tab. That is wrong on the
|
|
1938
|
-
* facts, and confidently so. A visit arrives from one platform — it has one
|
|
1939
|
-
* click id — so `gclid` traffic cannot also be Meta traffic, and a Meta tab
|
|
1940
|
-
* listing `gad_campaignid` on 1,204 visits invited somebody to name a Google
|
|
1941
|
-
* parameter in Meta's vocabulary and then wonder why no report ever used it.
|
|
1942
|
-
* The count belongs to the platform or it is not a count of anything.
|
|
1943
|
-
*/
|
|
1944
|
-
sessions: z4.number(),
|
|
1945
|
-
events: z4.number(),
|
|
1946
|
-
/** Up to five distinct values. Always empty for an uncaptured parameter. */
|
|
1947
|
-
sampleValues: z4.array(z4.string()),
|
|
1948
|
-
lastSeen: z4.string().optional(),
|
|
1949
|
-
/**
|
|
1950
|
-
* True when this row is here because somebody configured it, not because it
|
|
1951
|
-
* arrived.
|
|
1952
|
-
*
|
|
1953
|
-
* The row a mapping made before its first click. A tracking setup is
|
|
1954
|
-
* routinely written the week before the campaign runs, and a tool that can
|
|
1955
|
-
* only describe traffic it has already seen cannot be used at the one moment
|
|
1956
|
-
* somebody sits down to do this properly. Such a row has no visits and no
|
|
1957
|
-
* values, and says so rather than reading as a parameter that stopped
|
|
1958
|
-
* arriving.
|
|
1959
|
-
*/
|
|
1960
|
-
awaitingTraffic: z4.boolean().optional()
|
|
1961
|
-
});
|
|
1962
|
-
var analyticsFlowDestinationsSchema = z4.object({
|
|
1963
|
-
flowSlug: z4.string(),
|
|
1964
|
-
/** Destination types seen — `meta`, `httpWebhook`, `hubspotForm`. */
|
|
1965
|
-
destinations: z4.array(z4.string()),
|
|
1966
|
-
lastSeen: z4.string().optional()
|
|
1967
|
-
});
|
|
1968
|
-
var analyticsAdPlatformTrafficSchema = z4.object({
|
|
1969
|
-
platform: z4.string(),
|
|
1970
|
-
sessions: z4.number(),
|
|
1971
|
-
conversions: z4.number(),
|
|
1972
|
-
/** How many of those visits carried any campaign parameter at all. */
|
|
1973
|
-
taggedSessions: z4.number()
|
|
1974
|
-
});
|
|
1975
|
-
var analyticsPageInfoSchema = z4.object({
|
|
1976
|
-
/** Which field of the response was paged. */
|
|
1977
|
-
block: z4.enum(["visitors", "submissions", "deliveries", "stream"]),
|
|
1978
|
-
page: z4.number().int(),
|
|
1979
|
-
pageSize: z4.number().int(),
|
|
1980
|
-
returned: z4.number().int(),
|
|
1981
|
-
hasMore: z4.boolean()
|
|
1982
|
-
});
|
|
1983
|
-
var analyticsTimelineRowSchema = z4.object({
|
|
1984
|
-
timestamp: z4.string(),
|
|
1985
|
-
/**
|
|
1986
|
-
* The visit this event belongs to, and the browser that made it.
|
|
1987
|
-
*
|
|
1988
|
-
* Empty on anything that belongs to neither — a settlement, and an event a
|
|
1989
|
-
* client's own server posted about somebody who was never on a page. Carried
|
|
1990
|
-
* because the raw feed (`stream`) is a company-wide list rather than one
|
|
1991
|
-
* visit's, so a row has to say who it was about before a reader can get from
|
|
1992
|
-
* it to the person. On a replay both are constant and simply confirm it.
|
|
1993
|
-
*/
|
|
1994
|
-
sessionId: z4.string(),
|
|
1995
|
-
anonId: z4.string(),
|
|
1996
|
-
/**
|
|
1997
|
-
* Where the producer put this event in its own order, from 1. `0` means it
|
|
1998
|
-
* did not number this one.
|
|
1999
|
-
*
|
|
2000
|
-
* The tie-break that makes the replay a replay. The timestamp is
|
|
2001
|
-
* milliseconds and the Form engine emits several events in one synchronous
|
|
2002
|
-
* block, so a step completing, the identities it revealed and the next step
|
|
2003
|
-
* coming into view routinely share one — and sorted on the timestamp alone
|
|
2004
|
-
* they came back in an order that matched nothing that happened.
|
|
2005
|
-
*/
|
|
2006
|
-
eventSeq: z4.number().int().nonnegative(),
|
|
2007
|
-
/** This event's identity, so two rows can be said to be the same event. */
|
|
2008
|
-
eventUid: z4.string(),
|
|
2009
|
-
/** `page_view`, `form_step_view`, `side_effect_dispatched`, … */
|
|
2010
|
-
eventType: z4.string(),
|
|
2011
|
-
/** `edge`, `beacon`, `server` — where the row was written from. */
|
|
2012
|
-
source: z4.string(),
|
|
2013
|
-
/**
|
|
2014
|
-
* `baker`, `external`, `export` — where the page was, which `source` does
|
|
2015
|
-
* not say. The two together are what decide the row's door; see
|
|
2016
|
-
* `ANALYTICS_EVENT_DOORS`.
|
|
2017
|
-
*
|
|
2018
|
-
* Defaulted rather than required: the column arrived after the corpus did
|
|
2019
|
-
* and carries no default of its own, so a row older than it reads `""`, and
|
|
2020
|
-
* that has to mean "Baker's, as everything was then" rather than fail the
|
|
2021
|
-
* whole row's parse.
|
|
2022
|
-
*/
|
|
2023
|
-
deployment: z4.string().default(""),
|
|
2024
|
-
environment: z4.string(),
|
|
2025
|
-
/** The build the page was published from. */
|
|
2026
|
-
release: z4.string(),
|
|
2027
|
-
path: z4.string(),
|
|
2028
|
-
host: z4.string(),
|
|
2029
|
-
landingId: z4.string(),
|
|
2030
|
-
flowSlug: z4.string(),
|
|
2031
|
-
stepId: z4.string(),
|
|
2032
|
-
stepIndex: z4.number().int().nonnegative(),
|
|
2033
|
-
nodeType: z4.string(),
|
|
2034
|
-
triggerId: z4.string(),
|
|
2035
|
-
/** A page-defined event's own name, when this row is one. */
|
|
2036
|
-
eventName: z4.string(),
|
|
2037
|
-
/** Whatever the page attached to a custom event. Strings only, by design. */
|
|
2038
|
-
properties: z4.record(z4.string(), z4.string()),
|
|
2039
|
-
/** Where an outbound click or a link node was going, in full. */
|
|
2040
|
-
targetUrl: z4.string(),
|
|
2041
|
-
/** A number the page reported alongside the event. */
|
|
2042
|
-
value: z4.number(),
|
|
2043
|
-
/**
|
|
2044
|
-
* The currency that number is in, when it has one.
|
|
2045
|
-
*
|
|
2046
|
-
* Only a server-sent event carries it — a page reports a `value` on its own
|
|
2047
|
-
* terms, a CRM reports a deal in euros — and without it the replay prints a
|
|
2048
|
-
* bare `4200.5` beside a closed deal, which is a number nobody can act on.
|
|
2049
|
-
*/
|
|
2050
|
-
valueCurrency: z4.string().default(""),
|
|
2051
|
-
/** The visitor's digest, when they had identified themselves by this point. */
|
|
2052
|
-
identityHash: z4.string(),
|
|
2053
|
-
/**
|
|
2054
|
-
* The browser to attribute this row to, once the identity has been resolved.
|
|
2055
|
-
*
|
|
2056
|
-
* `anonId` when the row has one, and otherwise the browser {@link identityHash}
|
|
2057
|
-
* resolves to through `identities`. Empty when neither exists.
|
|
2058
|
-
*
|
|
2059
|
-
* It is a separate field rather than a coalesce into `anonId` because the two
|
|
2060
|
-
* claims are not the same: `anonId` is the cookie the row was written with,
|
|
2061
|
-
* and a server-sent event was written with none and must not start claiming
|
|
2062
|
-
* one. This is the *read's* answer to "who was that", and it is retroactive
|
|
2063
|
-
* and cross-device by construction — a "Deal won" posted in March attaches to
|
|
2064
|
-
* the person the moment they type that address into a Form in April, and to
|
|
2065
|
-
* every browser they have used here.
|
|
2066
|
-
*
|
|
2067
|
-
* Only `event_stream` fills it. Empty everywhere else, which is honest: a
|
|
2068
|
-
* session replay deliberately does not resolve, because an event that
|
|
2069
|
-
* happened during no visit must not be placed inside one.
|
|
2070
|
-
*/
|
|
2071
|
-
personAnonId: z4.string().default(""),
|
|
2072
|
-
/**
|
|
2073
|
-
* What this row knows the person by, when it does not know their browser:
|
|
2074
|
-
* `email` | `phone` | `external` | `click` | `cookie`, or empty.
|
|
2075
|
-
*
|
|
2076
|
-
* The feed's Who column reads it. A row naming a person by a means that has
|
|
2077
|
-
* no face here yet — a digest nobody has typed into a Form, an ad click, one
|
|
2078
|
-
* of Meta's cookies — is not a row about nobody, and rendering it as one is
|
|
2079
|
-
* what made the server-sent half of the feed look unattached to the rest.
|
|
2080
|
-
*/
|
|
2081
|
-
knownBy: z4.string().default(""),
|
|
2082
|
-
/**
|
|
2083
|
-
* What this row counts as under the company's own conversion definitions, or
|
|
2084
|
-
* empty when it counts as nothing.
|
|
2085
|
-
*
|
|
2086
|
-
* The store's own key, projected rather than rebuilt here, so the feed and
|
|
2087
|
-
* the reports cannot disagree about what one event was. Two rows carrying the
|
|
2088
|
-
* same non-empty key are **one** conversion — the second is stored, listed,
|
|
2089
|
-
* and marked as already counted rather than hidden, because a sender who
|
|
2090
|
-
* posted a deal twice needs to see that the second request arrived.
|
|
2091
|
-
*
|
|
2092
|
-
* Only `event_stream` fills it; empty everywhere else.
|
|
2093
|
-
*/
|
|
2094
|
-
conversionKey: z4.string().default(""),
|
|
2095
|
-
/** Which signal took this row for a machine (`ua`, `datacenter`, …). Empty on every human row. */
|
|
2096
|
-
botReason: z4.string().optional(),
|
|
2097
|
-
/**
|
|
2098
|
-
* The browser, OS, device and country the row came from. Only the feed fills
|
|
2099
|
-
* them: how somebody who just tested a page finds their own visit on it
|
|
2100
|
-
* without having typed an email.
|
|
2101
|
-
*/
|
|
2102
|
-
browser: z4.string().optional(),
|
|
2103
|
-
os: z4.string().optional(),
|
|
2104
|
-
deviceType: z4.string().optional(),
|
|
2105
|
-
country: z4.string().optional(),
|
|
2106
|
-
/**
|
|
2107
|
-
* Which lines of a people search this row belongs to, by position in
|
|
2108
|
-
* `peopleSearch`. Empty when nobody was searched for.
|
|
2109
|
-
*/
|
|
2110
|
-
personTerms: z4.array(z4.number()).optional(),
|
|
2111
|
-
/**
|
|
2112
|
-
* `email` | `phone` — which of the two they gave.
|
|
2113
|
-
*
|
|
2114
|
-
* Load-bearing rather than trivia: a visitor who fills in both fields
|
|
2115
|
-
* produces two `identify` rows in the same millisecond, and without the kind
|
|
2116
|
-
* a replay renders the same sentence twice and reads as a duplicated event.
|
|
2117
|
-
*/
|
|
2118
|
-
identityKind: z4.string(),
|
|
2119
|
-
/**
|
|
2120
|
-
* The `user_data` block this event carried, exactly as it arrived.
|
|
2121
|
-
*
|
|
2122
|
-
* The contact digests (`email_sha256`, `phone_sha256`, `external_id_sha256`),
|
|
2123
|
-
* the click ids, Meta's cookies, and the advanced-matching /
|
|
2124
|
-
* enhanced-conversions fields — first name, city, postcode, country. Empty on
|
|
2125
|
-
* everything a page produced, which is most rows.
|
|
2126
|
-
*
|
|
2127
|
-
* **Per event, and deliberately not merged** — unlike the person card, which
|
|
2128
|
-
* merges the same fields newest-wins across everything anyone ever sent. The
|
|
2129
|
-
* question one event answers is "what did *this request* contain", and the
|
|
2130
|
-
* answer has to be allowed to be *worse* than what is known about the person
|
|
2131
|
-
* overall. That is how a sender finds the field they forgot to map: the
|
|
2132
|
-
* person has a postcode, and this event does not.
|
|
2133
|
-
*/
|
|
2134
|
-
userData: z4.record(z4.string(), z4.string()).default({}),
|
|
2135
|
-
sideEffectType: z4.string(),
|
|
2136
|
-
sideEffectName: z4.string(),
|
|
2137
|
-
sideEffectId: z4.string(),
|
|
2138
|
-
tagId: z4.string(),
|
|
2139
|
-
messageId: z4.string(),
|
|
2140
|
-
/**
|
|
2141
|
-
* The submission this row belongs to.
|
|
2142
|
-
*
|
|
2143
|
-
* What ties a browser pixel and a server dispatch of the SAME submit
|
|
2144
|
-
* together. Without it they read as two unrelated things that happened to
|
|
2145
|
-
* occur in the same second.
|
|
2146
|
-
*/
|
|
2147
|
-
eventId: z4.string(),
|
|
2148
|
-
runId: z4.string(),
|
|
2149
|
-
engagementMs: z4.number().int().nonnegative(),
|
|
2150
|
-
scrollDepth: z4.number().int().nonnegative(),
|
|
2151
|
-
/**
|
|
2152
|
-
* The A/B test this row was stamped into, and which side the edge served —
|
|
2153
|
-
* `a` for the page as it is, `b` for the new variant.
|
|
2154
|
-
*
|
|
2155
|
-
* Set only on rows a page under test produced, which is how a person's story
|
|
2156
|
-
* can say which version they were shown. Empty on a server-sent row: a CRM
|
|
2157
|
-
* knows nothing about the split, and the conversion it posts is attributed
|
|
2158
|
-
* to a side by WHO did it (see `experiment_conversions`), never by a stamp.
|
|
2159
|
-
*/
|
|
2160
|
-
experimentId: z4.string().default(""),
|
|
2161
|
-
variant: z4.string().default(""),
|
|
2162
|
-
/** `success` | `failed` | `""` for a dispatch that has not settled yet. */
|
|
2163
|
-
outcome: z4.string(),
|
|
2164
|
-
/** What the destination said when it refused. Empty on success. */
|
|
2165
|
-
error: z4.string(),
|
|
2166
|
-
/** The destination's own id for the record it created, when it gave one. */
|
|
2167
|
-
providerRef: z4.string(),
|
|
2168
|
-
/** When the destination answered, so "it took eleven seconds" is sayable. */
|
|
2169
|
-
settledAt: z4.string()
|
|
2170
|
-
});
|
|
2171
|
-
var analyticsSubmissionRowSchema = z4.object({
|
|
2172
|
-
sessionId: z4.string(),
|
|
2173
|
-
flowSlug: z4.string(),
|
|
2174
|
-
startedAt: z4.string(),
|
|
2175
|
-
lastAt: z4.string(),
|
|
2176
|
-
anonId: z4.string(),
|
|
2177
|
-
identityHash: z4.string(),
|
|
2178
|
-
identityKind: z4.string(),
|
|
2179
|
-
landingId: z4.string(),
|
|
2180
|
-
path: z4.string(),
|
|
2181
|
-
/** Steps they saw. The denominator for "how far did they get". */
|
|
2182
|
-
stepsReached: z4.number().int().nonnegative(),
|
|
2183
|
-
/** Steps they actually handed something over on. Zero means no attempt. */
|
|
2184
|
-
stepsSubmitted: z4.number().int().nonnegative(),
|
|
2185
|
-
submittedStepIds: z4.array(z4.string()),
|
|
2186
|
-
/** The furthest step they reached, for naming where they stopped. */
|
|
2187
|
-
lastStepId: z4.string(),
|
|
2188
|
-
/** Whether the Form reached an ending, by any of its three routes. */
|
|
2189
|
-
finished: z4.boolean(),
|
|
2190
|
-
conversions: z4.number().int().nonnegative(),
|
|
2191
|
-
destinations: z4.array(z4.string()),
|
|
2192
|
-
/** Destinations that fired as a pixel in the page. */
|
|
2193
|
-
browserDestinations: z4.array(z4.string()),
|
|
2194
|
-
/** Destinations Baker dispatched from the server. */
|
|
2195
|
-
serverDestinations: z4.array(z4.string()),
|
|
2196
|
-
/**
|
|
2197
|
-
* Server-side dispatch runs — the counterpart of `serverDestinations`, NOT of
|
|
2198
|
-
* `destinations`.
|
|
2199
|
-
*
|
|
2200
|
-
* Zero is not "this went nowhere", and reading it that way is a mistake
|
|
2201
|
-
* already made once: it is zero for an attempt abandoned before the step that
|
|
2202
|
-
* fires a destination, and zero for a Form whose only destination is a
|
|
2203
|
-
* browser pixel. `destinations` is the union of both sides and is the column
|
|
2204
|
-
* that answers "did this reach anything at all".
|
|
2205
|
-
*/
|
|
2206
|
-
dispatched: z4.number().int().nonnegative(),
|
|
2207
|
-
succeeded: z4.number().int().nonnegative(),
|
|
2208
|
-
failed: z4.number().int().nonnegative(),
|
|
2209
|
-
/** Dispatched and never settled — "wait", as against "act". */
|
|
2210
|
-
pending: z4.number().int().nonnegative(),
|
|
2211
|
-
sampleError: z4.string(),
|
|
2212
|
-
providerRefs: z4.array(z4.string()),
|
|
2213
|
-
/** The submission ids, which is how the panel opens the sealed payload. */
|
|
2214
|
-
eventIds: z4.array(z4.string())
|
|
2215
|
-
});
|
|
2216
|
-
var analyticsVisitorSessionSchema = z4.object({
|
|
2217
|
-
sessionId: z4.string(),
|
|
2218
|
-
startedAt: z4.string(),
|
|
2219
|
-
endedAt: z4.string(),
|
|
2220
|
-
entryPath: z4.string(),
|
|
2221
|
-
entryLandingId: z4.string(),
|
|
2222
|
-
utmCampaign: z4.string(),
|
|
2223
|
-
referrerSource: z4.string(),
|
|
2224
|
-
deviceType: z4.string(),
|
|
2225
|
-
pageViews: z4.number().int().nonnegative(),
|
|
2226
|
-
conversions: z4.number().int().nonnegative(),
|
|
2227
|
-
/**
|
|
2228
|
-
* True for the visits made BEFORE we knew who this was.
|
|
2229
|
-
*
|
|
2230
|
-
* Shown rather than smoothed over: a history without it invites the reading
|
|
2231
|
-
* that we recognised them all along, when in fact these visits were only
|
|
2232
|
-
* attributed backwards through the browser after they identified themselves.
|
|
2233
|
-
*/
|
|
2234
|
-
wasAnonymous: z4.boolean(),
|
|
2235
|
-
engagementMs: z4.number().int().nonnegative()
|
|
2236
|
-
});
|
|
2237
|
-
var analyticsVisitProfileSchema = z4.object({
|
|
2238
|
-
sessionId: z4.string(),
|
|
2239
|
-
startedAt: z4.string(),
|
|
2240
|
-
endedAt: z4.string(),
|
|
2241
|
-
entryPath: z4.string(),
|
|
2242
|
-
entryLandingId: z4.string(),
|
|
2243
|
-
country: z4.string(),
|
|
2244
|
-
region: z4.string(),
|
|
2245
|
-
city: z4.string(),
|
|
2246
|
-
timezone: z4.string(),
|
|
2247
|
-
/** The network the visit came from. What separates a datacentre from a person. */
|
|
2248
|
-
asOrganization: z4.string(),
|
|
2249
|
-
deviceType: z4.string(),
|
|
2250
|
-
browser: z4.string(),
|
|
2251
|
-
os: z4.string(),
|
|
2252
|
-
referrerSource: z4.string(),
|
|
2253
|
-
referrerDomain: z4.string(),
|
|
2254
|
-
utmSource: z4.string(),
|
|
2255
|
-
utmMedium: z4.string(),
|
|
2256
|
-
utmCampaign: z4.string(),
|
|
2257
|
-
/**
|
|
2258
|
-
* Which platform the click id proves, in the `AD_PLATFORMS` vocabulary —
|
|
2259
|
-
* `google` | `meta` | `tiktok` | `x` | `linkedin` | `microsoft` | `""`.
|
|
2260
|
-
*
|
|
2261
|
-
* The same spelling every mark, mapping and report uses. It briefly said
|
|
2262
|
-
* `google_ads` / `meta_ads` here alone, which meant every logo lookup on the
|
|
2263
|
-
* People screen missed and a paid visit drew a neutral globe.
|
|
2264
|
-
*/
|
|
2265
|
-
clickPlatform: z4.string(),
|
|
2266
|
-
/** Every ValueTrack-style parameter the URL carried, unresolved. */
|
|
2267
|
-
campaignParams: z4.record(z4.string(), z4.string()),
|
|
2268
|
-
/** The browser's own cookie id. One person can have several. */
|
|
2269
|
-
anonId: z4.string(),
|
|
2270
|
-
identityHash: z4.string(),
|
|
2271
|
-
/** What the digest was made of — `email`, `phone`. Never the value. */
|
|
2272
|
-
identityKind: z4.string(),
|
|
2273
|
-
pageViews: z4.number().int().nonnegative(),
|
|
2274
|
-
conversions: z4.number().int().nonnegative(),
|
|
2275
|
-
engagementMs: z4.number().int().nonnegative()
|
|
2276
|
-
});
|
|
2277
|
-
var analyticsPersonKeySchema = z4.object({
|
|
2278
|
-
/** `email` | `phone` | `external` | `browser` | a click-id name | `fbp` | `fbc`. */
|
|
2279
|
-
kind: z4.string(),
|
|
2280
|
-
/** A digest for a contact detail, the value itself for a cookie or a click id. */
|
|
2281
|
-
value: z4.string(),
|
|
2282
|
-
firstSeen: z4.string(),
|
|
2283
|
-
lastSeen: z4.string(),
|
|
2284
|
-
/** How many times it was observed beside another key — every submission repeats it. */
|
|
2285
|
-
observations: z4.number().int().nonnegative(),
|
|
2286
|
-
sessions: z4.number().int().nonnegative(),
|
|
2287
|
-
/** `client` | `edge` | `server` | `ingest` — which collector first saw it. */
|
|
2288
|
-
source: z4.string(),
|
|
2289
|
-
/** The Form it was first seen on, where it came from one. */
|
|
2290
|
-
flowSlug: z4.string(),
|
|
2291
|
-
landingId: z4.string()
|
|
2292
|
-
});
|
|
2293
|
-
var analyticsPersonProfileSchema = z4.object({
|
|
2294
|
-
firstSeen: z4.string(),
|
|
2295
|
-
lastSeen: z4.string(),
|
|
2296
|
-
sessions: z4.number().int().nonnegative(),
|
|
2297
|
-
/** How many browsers resolved to this person. More than one is cross-device. */
|
|
2298
|
-
devices: z4.number().int().nonnegative(),
|
|
2299
|
-
pageViews: z4.number().int().nonnegative(),
|
|
2300
|
-
conversions: z4.number().int().nonnegative(),
|
|
2301
|
-
/**
|
|
2302
|
-
* What they are worth, per currency — `{ EUR: 4753 }`.
|
|
2303
|
-
*
|
|
2304
|
-
* A map rather than an amount and a code, because the two-column shape had
|
|
2305
|
-
* no honest answer for somebody with a deal in each of two currencies: it
|
|
2306
|
-
* summed them and labelled the total with whichever code came back first.
|
|
2307
|
-
* Only a server event ever carries money, and a retried post is counted
|
|
2308
|
-
* once, on `event_uid`.
|
|
2309
|
-
*/
|
|
2310
|
-
money: z4.record(z4.string(), z4.number()),
|
|
2311
|
-
engagementMs: z4.number().int().nonnegative(),
|
|
2312
|
-
/** How many of their events a client's own server posted. */
|
|
2313
|
-
serverEvents: z4.number().int().nonnegative(),
|
|
2314
|
-
country: z4.string(),
|
|
2315
|
-
region: z4.string(),
|
|
2316
|
-
city: z4.string(),
|
|
2317
|
-
deviceType: z4.string(),
|
|
2318
|
-
browser: z4.string(),
|
|
2319
|
-
os: z4.string(),
|
|
2320
|
-
utmSource: z4.string(),
|
|
2321
|
-
utmMedium: z4.string(),
|
|
2322
|
-
utmCampaign: z4.string(),
|
|
2323
|
-
referrerSource: z4.string(),
|
|
2324
|
-
entryLandingId: z4.string(),
|
|
2325
|
-
entryPath: z4.string(),
|
|
2326
|
-
/**
|
|
2327
|
-
* The customer-matching block, merged newest-wins across everything anyone
|
|
2328
|
-
* has ever told us about them — `city`, `postal_code`, `country`,
|
|
2329
|
-
* `first_name_sha256`, `fbp`. Keyed exactly as the store holds it, so a key
|
|
2330
|
-
* ending `_sha256` says its value is a digest and cannot be shown.
|
|
2331
|
-
*/
|
|
2332
|
-
matchKeys: z4.record(z4.string(), z4.string())
|
|
2333
|
-
});
|
|
2334
|
-
var analyticsVisitorRowSchema = z4.object({
|
|
2335
|
-
anonId: z4.string(),
|
|
2336
|
-
firstSeen: z4.string(),
|
|
2337
|
-
lastSeen: z4.string(),
|
|
2338
|
-
sessions: z4.number().int().nonnegative(),
|
|
2339
|
-
pageViews: z4.number().int().nonnegative(),
|
|
2340
|
-
conversions: z4.number().int().nonnegative(),
|
|
2341
|
-
formTriggers: z4.number().int().nonnegative(),
|
|
2342
|
-
outboundClicks: z4.number().int().nonnegative(),
|
|
2343
|
-
engagementMs: z4.number().int().nonnegative(),
|
|
2344
|
-
/** The visit to open by default — the most recent one. */
|
|
2345
|
-
lastSessionId: z4.string(),
|
|
2346
|
-
entryPath: z4.string(),
|
|
2347
|
-
entryLandingId: z4.string(),
|
|
2348
|
-
lastPath: z4.string(),
|
|
2349
|
-
referrerSource: z4.string(),
|
|
2350
|
-
referrerDomain: z4.string(),
|
|
2351
|
-
utmSource: z4.string(),
|
|
2352
|
-
utmMedium: z4.string(),
|
|
2353
|
-
utmCampaign: z4.string(),
|
|
2354
|
-
clickPlatform: z4.string(),
|
|
2355
|
-
campaignParams: z4.record(z4.string(), z4.string()),
|
|
2356
|
-
/**
|
|
2357
|
-
* The click ids this person arrived on, by their own names — `gclid`,
|
|
2358
|
-
* `fbclid`, `msclkid`, `li_fat_id`, `ttclid`, `twclid`, `wbraid`, `gbraid`,
|
|
2359
|
-
* `dclid`, `rdt_cid`, `epik`, `sccid`, `oppref`.
|
|
2360
|
-
*
|
|
2361
|
-
* Only the ones that were present. The endpoint has always returned all eight
|
|
2362
|
-
* columns and nothing above it carried them, so the one screen whose subject
|
|
2363
|
-
* is a person could name the platform that paid for the click and not the
|
|
2364
|
-
* click — which is the value a platform's own reporting is matched on, and
|
|
2365
|
-
* therefore the value somebody is looking for when a conversion did not show
|
|
2366
|
-
* up on the other side.
|
|
2367
|
-
*/
|
|
2368
|
-
clickIds: z4.record(z4.string(), z4.string()),
|
|
2369
|
-
country: z4.string(),
|
|
2370
|
-
region: z4.string(),
|
|
2371
|
-
city: z4.string(),
|
|
2372
|
-
timezone: z4.string(),
|
|
2373
|
-
asOrganization: z4.string(),
|
|
2374
|
-
deviceType: z4.string(),
|
|
2375
|
-
browser: z4.string(),
|
|
2376
|
-
os: z4.string(),
|
|
2377
|
-
identityHash: z4.string(),
|
|
2378
|
-
identityKind: z4.string()
|
|
2379
|
-
});
|
|
2380
|
-
var analyticsMeasureScopeSchema = z4.object({
|
|
2381
|
-
scope: z4.enum(["campaigns", "outcomes", "all", "unknown"]),
|
|
2382
|
-
/** Every event the tag on the client's own site sent in this window. */
|
|
2383
|
-
websiteEvents: z4.number(),
|
|
2384
|
-
/** Browser ids it minted off-Baker. Any at all means the tag is on `all`. */
|
|
2385
|
-
websiteNewVisitors: z4.number()
|
|
2386
|
-
});
|
|
2387
|
-
var analyticsQueryDataSchema = z4.object({
|
|
2388
|
-
preset: analyticsPresetSchema,
|
|
2389
|
-
window: analyticsWindowSchema,
|
|
2390
|
-
totals: analyticsTotalsSchema,
|
|
2391
|
-
trend: z4.array(analyticsTrendPointSchema).optional(),
|
|
2392
|
-
topPages: z4.array(analyticsPageRowSchema).optional(),
|
|
2393
|
-
topSources: z4.array(analyticsSourceRowSchema).optional(),
|
|
2394
|
-
topCampaigns: z4.array(analyticsCampaignRowSchema).optional(),
|
|
2395
|
-
countries: z4.array(analyticsDimensionRowSchema).optional(),
|
|
2396
|
-
devices: z4.array(analyticsDimensionRowSchema).optional(),
|
|
2397
|
-
funnels: z4.array(analyticsFunnelSchema).optional(),
|
|
2398
|
-
flowSummary: z4.array(analyticsFlowSummarySchema).optional(),
|
|
2399
|
-
flowPaths: z4.array(analyticsFlowEdgeSchema).optional(),
|
|
2400
|
-
triggers: z4.array(analyticsTriggerRowSchema).optional(),
|
|
2401
|
-
releases: z4.array(analyticsReleaseRowSchema).optional(),
|
|
2402
|
-
paid: z4.array(analyticsPaidRowSchema).optional(),
|
|
2403
|
-
measureScope: analyticsMeasureScopeSchema.optional(),
|
|
2404
|
-
deliveries: z4.array(analyticsDeliveryRowSchema).optional(),
|
|
2405
|
-
submissions: z4.array(analyticsSubmissionRowSchema).optional(),
|
|
2406
|
-
geo: z4.array(analyticsGeoRowSchema).optional(),
|
|
2407
|
-
bots: z4.array(analyticsBotRowSchema).optional(),
|
|
2408
|
-
visitorCompanies: z4.array(analyticsVisitorCompanyRowSchema).optional(),
|
|
2409
|
-
landings: z4.array(analyticsLandingRowSchema).optional(),
|
|
2410
|
-
tags: z4.array(analyticsTagRowSchema).optional(),
|
|
2411
|
-
customEvents: z4.array(analyticsCustomEventRowSchema).optional(),
|
|
2412
|
-
eventBreakdown: z4.array(analyticsEventBreakdownRowSchema).optional(),
|
|
2413
|
-
customFunnel: z4.array(analyticsCustomFunnelStepSchema).optional(),
|
|
2414
|
-
deviceBreakdown: z4.array(analyticsDeviceRowSchema).optional(),
|
|
2415
|
-
realtime: analyticsRealtimeSchema.optional(),
|
|
2416
|
-
adDimensions: z4.array(analyticsAdDimensionRowSchema).optional(),
|
|
2417
|
-
adParams: z4.array(analyticsAdParamRowSchema).optional(),
|
|
2418
|
-
/**
|
|
2419
|
-
* Parameters arriving on visits no platform can be named for.
|
|
2420
|
-
*
|
|
2421
|
-
* Kept apart rather than folded into the platform's own list, and kept rather
|
|
2422
|
-
* than dropped. Folding them in is what made every tab identical; dropping
|
|
2423
|
-
* them would lose a parameter that arrives on hand-tagged links, on an email
|
|
2424
|
-
* campaign, or on paid traffic whose click id an ad blocker removed — and
|
|
2425
|
-
* losing it silently, which is the one outcome worse than showing it in the
|
|
2426
|
-
* wrong place. They are evidence, not a to-do list: there is no platform to
|
|
2427
|
-
* map them under, so a reader who recognises one adds it by name to the
|
|
2428
|
-
* platform they know it belongs to.
|
|
2429
|
-
*/
|
|
2430
|
-
adParamsUnattributed: z4.array(analyticsAdParamRowSchema).optional(),
|
|
2431
|
-
adPlatformTraffic: z4.array(analyticsAdPlatformTrafficSchema).optional(),
|
|
2432
|
-
flowDestinations: z4.array(analyticsFlowDestinationsSchema).optional(),
|
|
2433
|
-
/** Present only on a report that was asked for by the page. */
|
|
2434
|
-
pageInfo: analyticsPageInfoSchema.optional(),
|
|
2435
|
-
conversions: z4.array(analyticsConversionRowSchema).optional(),
|
|
2436
|
-
/** Every event these pages produced, counted or not. The "add a conversion" picker. */
|
|
2437
|
-
eventCatalog: z4.array(analyticsEventCatalogRowSchema).optional(),
|
|
2438
|
-
timeline: z4.array(analyticsTimelineRowSchema).optional(),
|
|
2439
|
-
/**
|
|
2440
|
-
* The raw feed. Same row shape as a replay, because it is the same rows —
|
|
2441
|
-
* what changes is that this one is bounded by a window rather than by a visit.
|
|
2442
|
-
*/
|
|
2443
|
-
stream: z4.array(analyticsTimelineRowSchema).optional(),
|
|
2444
|
-
/** How each line of a people search on `stream` was read — what `personTerms` points at. */
|
|
2445
|
-
peopleSearch: z4.array(peopleSearchTermSchema).optional(),
|
|
2446
|
-
/** `stream` only: what that list left off as machine traffic. Absent when it is narrowed past what a count can follow. */
|
|
2447
|
-
hiddenMachines: analyticsHiddenMachinesSchema.optional(),
|
|
2448
|
-
visitorSessions: z4.array(analyticsVisitorSessionSchema).optional(),
|
|
2449
|
-
/** Every key this person is known by — contact details, browsers, clicks, cookies. */
|
|
2450
|
-
personKeys: z4.array(analyticsPersonKeySchema).optional(),
|
|
2451
|
-
/** The same person, rolled up: their totals across every device, and what is known about them. */
|
|
2452
|
-
personProfile: analyticsPersonProfileSchema.optional(),
|
|
2453
|
-
visitProfile: analyticsVisitProfileSchema.optional(),
|
|
2454
|
-
visitors: z4.array(analyticsVisitorRowSchema).optional(),
|
|
2455
|
-
/**
|
|
2456
|
-
* The same totals for the window immediately before this one, when asked for.
|
|
2457
|
-
*
|
|
2458
|
-
* The comparison window is returned alongside rather than reduced to a set of
|
|
2459
|
-
* deltas, so a caller can show either side of it and does not have to trust
|
|
2460
|
-
* our arithmetic to render "1,240 vs 980".
|
|
2461
|
-
*/
|
|
2462
|
-
previous: z4.object({
|
|
2463
|
-
window: analyticsWindowSchema,
|
|
2464
|
-
totals: analyticsTotalsSchema
|
|
2465
|
-
}).optional()
|
|
2466
|
-
});
|
|
2467
|
-
var analyticsQueryResponseSchema = z4.object({
|
|
2468
|
-
ok: z4.literal(true),
|
|
2469
|
-
data: analyticsQueryDataSchema,
|
|
2470
|
-
warnings: z4.array(analyticsWarningSchema).optional(),
|
|
2471
|
-
hints: z4.array(z4.string()).optional()
|
|
2472
|
-
});
|
|
2473
|
-
var analyticsConversionsRequestSchema = z4.object({
|
|
2474
|
-
set: z4.array(
|
|
2475
|
-
z4.object({
|
|
2476
|
-
/** `form:<flow>:<step>:<trigger>` | `submit:<flow>` | `page:<name>` | `exit:<host>`. */
|
|
2477
|
-
eventKey: z4.string().max(320),
|
|
2478
|
-
name: z4.string().max(MAX_CONVERSION_NAME),
|
|
2479
|
-
countMode: z4.enum(CONVERSION_COUNT_MODES).optional()
|
|
2480
|
-
})
|
|
2481
|
-
).max(60).optional(),
|
|
2482
|
-
remove: z4.array(z4.string().max(320)).max(60).optional(),
|
|
2483
|
-
/** Every key counted under `from` moves to `to`, and the sends under the name go with it. */
|
|
2484
|
-
rename: z4.object({ from: z4.string().min(1).max(MAX_CONVERSION_NAME), to: z4.string().min(1).max(MAX_CONVERSION_NAME) }).optional()
|
|
2485
|
-
});
|
|
2486
|
-
var analyticsConversionsResponseSchema = z4.object({
|
|
2487
|
-
ok: z4.literal(true),
|
|
2488
|
-
data: z4.object({
|
|
2489
|
-
/**
|
|
2490
|
-
* What the company counts — inside a chat, with this chat's proposal on
|
|
2491
|
-
* top: `staged` marks a definition that applies when the chat is published.
|
|
2492
|
-
*/
|
|
2493
|
-
definitions: z4.array(
|
|
2494
|
-
z4.object({
|
|
2495
|
-
eventKey: z4.string(),
|
|
2496
|
-
name: z4.string(),
|
|
2497
|
-
countMode: z4.string(),
|
|
2498
|
-
updatedAt: z4.number(),
|
|
2499
|
-
staged: z4.boolean().optional()
|
|
2500
|
-
})
|
|
2501
|
-
),
|
|
2502
|
-
/** This chat's proposal, when it has one: counted from Publish, and gone if the chat is discarded. */
|
|
2503
|
-
staged: z4.object({
|
|
2504
|
-
set: z4.array(z4.object({ eventKey: z4.string(), name: z4.string() })),
|
|
2505
|
-
remove: z4.array(z4.string())
|
|
2506
|
-
}).optional()
|
|
2507
|
-
}),
|
|
2508
|
-
hints: z4.array(z4.string()).optional()
|
|
2509
|
-
});
|
|
2510
|
-
var analyticsMappingRequestSchema = z4.object({
|
|
2511
|
-
/**
|
|
2512
|
-
* Which platform these operations are about. Required for a change.
|
|
2513
|
-
*
|
|
2514
|
-
* There is no cross-platform entry to write: the platforms do not describe
|
|
2515
|
-
* the same world, so `cid` is TikTok's ad and half the internet's campaign,
|
|
2516
|
-
* and a keyword on Meta traffic is not a thing that can exist. Omit it only
|
|
2517
|
-
* to read the mapping back.
|
|
2518
|
-
*/
|
|
2519
|
-
platform: z4.enum(AD_PLATFORMS).optional(),
|
|
2520
|
-
/** Parameter name → role, on `platform`. Merged over what is stored. */
|
|
2521
|
-
set: z4.record(z4.string().max(64), adParamRoleSchema).optional(),
|
|
2522
|
-
/** Parameter names to stop reading, on `platform`. Applied after `set`. */
|
|
2523
|
-
remove: z4.array(z4.string().max(64)).max(64).optional()
|
|
2524
|
-
});
|
|
2525
|
-
var analyticsMappingResponseSchema = z4.object({
|
|
2526
|
-
ok: z4.literal(true),
|
|
2527
|
-
data: z4.object({
|
|
2528
|
-
/**
|
|
2529
|
-
* This company's own entries after the change, keyed `<platform>/<name>`.
|
|
2530
|
-
*
|
|
2531
|
-
* Every platform's, not only the one the request named: a caller that has
|
|
2532
|
-
* just mapped `cid` on TikTok is usually about to be asked the same
|
|
2533
|
-
* question about Google, and the answer there is different.
|
|
2534
|
-
*/
|
|
2535
|
-
params: z4.record(z4.string(), adParamRoleSchema),
|
|
2536
|
-
/**
|
|
2537
|
-
* Names that are understood without being configured.
|
|
2538
|
-
*
|
|
2539
|
-
* Returned so a caller can tell "already handled" from "not mapped" without
|
|
2540
|
-
* shipping a copy of the built-in list, and so an agent does not spend a
|
|
2541
|
-
* turn configuring `keyword` to mean keyword.
|
|
2542
|
-
*/
|
|
2543
|
-
builtIn: z4.array(z4.string()),
|
|
2544
|
-
/**
|
|
2545
|
-
* What the client's own ad account says about each parameter just staged.
|
|
2546
|
-
*
|
|
2547
|
-
* Present only when a Session staged a `set` on a platform whose tracking
|
|
2548
|
-
* configuration Baker can read. `contradicted` is the entry worth stopping
|
|
2549
|
-
* for: the account fills that name with a placeholder meaning something
|
|
2550
|
-
* else, so the answer just given would produce a report that is wrong and
|
|
2551
|
-
* looks entirely plausible.
|
|
2552
|
-
*/
|
|
2553
|
-
evidence: z4.record(
|
|
2554
|
-
z4.string(),
|
|
2555
|
-
z4.object({
|
|
2556
|
-
status: z4.enum(["confirmed", "contradicted", "unseen", "not_read"]),
|
|
2557
|
-
macro: z4.string().optional(),
|
|
2558
|
-
suggestedRole: adParamRoleSchema.optional(),
|
|
2559
|
-
source: z4.string().optional(),
|
|
2560
|
-
reason: z4.string().optional()
|
|
2561
|
-
})
|
|
2562
|
-
).optional(),
|
|
2563
|
-
updatedAt: z4.number().nullable()
|
|
2564
|
-
}),
|
|
2565
|
-
hints: z4.array(z4.string()).optional()
|
|
2566
|
-
});
|
|
2567
|
-
var analyticsTrackingRequestSchema = z4.object({
|
|
2568
|
-
platform: z4.enum(AD_PLATFORMS).optional(),
|
|
2569
|
-
days: z4.number().int().min(1).max(365).optional()
|
|
2570
|
-
});
|
|
2571
|
-
var trackingDimensionSchema = z4.object({
|
|
2572
|
-
role: adParamRoleSchema,
|
|
2573
|
-
/** The platform's own macro for it — what goes in the URL. */
|
|
2574
|
-
macro: z4.string(),
|
|
2575
|
-
/** The account's own spelling where it has one, else the canonical name. */
|
|
2576
|
-
name: z4.string(),
|
|
2577
|
-
/**
|
|
2578
|
-
* What has to happen for this dimension to reach a report.
|
|
2579
|
-
*
|
|
2580
|
-
* Four states rather than a boolean, because two of them need opposite fixes
|
|
2581
|
-
* and one of them is not a finding at all. `unmapped` is one
|
|
2582
|
-
* `baker analytics map` call and repairs the history with it; `missing` is a
|
|
2583
|
-
* change to the ad account and everything before it stays unattributable;
|
|
2584
|
-
* `unknown` means no visit arrived and the account could not be read, which
|
|
2585
|
-
* must never be reported as untagged.
|
|
2586
|
-
*/
|
|
2587
|
-
state: z4.enum(["covered", "unmapped", "missing", "unknown"]),
|
|
2588
|
-
evidence: z4.string().optional(),
|
|
2589
|
-
note: z4.string().optional()
|
|
2590
|
-
});
|
|
2591
|
-
var analyticsTrackingPlatformSchema = z4.object({
|
|
2592
|
-
platform: z4.enum(AD_PLATFORMS),
|
|
2593
|
-
label: z4.string(),
|
|
2594
|
-
sessions: z4.number(),
|
|
2595
|
-
/** Whether the ad account itself could be read, and why not when it could not. */
|
|
2596
|
-
account: z4.object({ read: z4.boolean(), templates: z4.number(), reason: z4.string().optional() }),
|
|
2597
|
-
dimensions: z4.array(trackingDimensionSchema),
|
|
2598
|
-
/** Names the URLs already carry that Baker does not read yet. */
|
|
2599
|
-
unmapped: z4.record(z4.string(), adParamRoleSchema),
|
|
2600
|
-
mapCommand: z4.string(),
|
|
2601
|
-
unexplained: z4.array(z4.object({ name: z4.string(), value: z4.string() })),
|
|
2602
|
-
/** The pairs to append to the account's tagging, or `""`. */
|
|
2603
|
-
suffix: z4.string(),
|
|
2604
|
-
whereItGoes: z4.string(),
|
|
2605
|
-
/** Which level to put them at, who can write it, and how an existing value is treated. */
|
|
2606
|
-
fix: z4.string()
|
|
2607
|
-
});
|
|
2608
|
-
var analyticsTrackingResponseSchema = z4.object({
|
|
2609
|
-
ok: z4.literal(true),
|
|
2610
|
-
data: z4.object({ days: z4.number(), platforms: z4.array(analyticsTrackingPlatformSchema) }),
|
|
2611
|
-
hints: z4.array(z4.string()).optional()
|
|
2612
|
-
});
|
|
2613
|
-
var boundedReference = (max) => z4.string().transform((value) => cutToLength(value, max));
|
|
2614
|
-
var submissionRecordRequestSchema = z4.object({
|
|
2615
|
-
/**
|
|
2616
|
-
* Injected by the Worker from the host or the site key. Never from the page.
|
|
2617
|
-
*
|
|
2618
|
-
* One of the two fields that is still required, because a copy that cannot
|
|
2619
|
-
* be filed under a company cannot be found again by anybody. Bounding it
|
|
2620
|
-
* would produce a row belonging to a company that does not exist, which is
|
|
2621
|
-
* worse than refusing — this is the case where refusing is right.
|
|
2622
|
-
*/
|
|
2623
|
-
companyId: z4.string().min(1),
|
|
2624
|
-
/** Shared with every destination this submit was sent to, and with its event. */
|
|
2625
|
-
submissionId: z4.string().min(1).pipe(boundedReference(128)),
|
|
2626
|
-
/**
|
|
2627
|
-
* The Form execution this step belongs to, or `""` from a page published
|
|
2628
|
-
* before attempts existed.
|
|
2629
|
-
*
|
|
2630
|
-
* `submissionId` is minted per node, so two steps of one filling produce two
|
|
2631
|
-
* copies with nothing joining them. This is that join. It changes nothing
|
|
2632
|
-
* else here: a sealed copy is still per step, and still the only payload
|
|
2633
|
-
* anybody keeps.
|
|
2634
|
-
*/
|
|
2635
|
-
attemptId: boundedReference(128).default(""),
|
|
2636
|
-
flowSlug: boundedReference(120).default(""),
|
|
2637
|
-
nodeId: boundedReference(120).default(""),
|
|
2638
|
-
nodeType: boundedReference(40).default(""),
|
|
2639
|
-
landingId: boundedReference(120).default(""),
|
|
2640
|
-
release: boundedReference(64).default(""),
|
|
2641
|
-
pageUrl: boundedReference(2048).default(""),
|
|
2642
|
-
/**
|
|
2643
|
-
* A SHA-256 digest, or absent. Never an address.
|
|
2644
|
-
*
|
|
2645
|
-
* The join from a recovered copy to every session the same person had,
|
|
2646
|
-
* without anybody having to open the copy to get there.
|
|
2647
|
-
*/
|
|
2648
|
-
identityHash: boundedReference(128).optional(),
|
|
2649
|
-
/**
|
|
2650
|
-
* Degraded rather than refused, like everything else here: an unrecognised
|
|
2651
|
-
* kind costs the copy one label, and refusing it would cost the copy.
|
|
2652
|
-
*/
|
|
2653
|
-
identityKind: z4.enum(["email", "phone"]).optional().catch(void 0),
|
|
2654
|
-
/** Injected by the Worker's edge. Kept exactly here and as a /24 everywhere else. */
|
|
2655
|
-
clientIp: boundedReference(64).nullish(),
|
|
2656
|
-
/**
|
|
2657
|
-
* Every answer on the step, free text included. Sealed on arrival.
|
|
2658
|
-
*
|
|
2659
|
-
* Bounded rather than length-checked, and that is the whole of it: a `max()`
|
|
2660
|
-
* here refused the **entire copy** over one long answer, so a visitor who
|
|
2661
|
-
* pasted a paragraph into a free-text field lost the email and the budget
|
|
2662
|
-
* beside it too. See {@link boundSubmissionAnswers}.
|
|
2663
|
-
*/
|
|
2664
|
-
answers: z4.record(z4.string(), z4.string()).transform(boundSubmissionAnswers)
|
|
2665
|
-
});
|
|
2666
|
-
|
|
2667
|
-
// ../api/src/analytics/busy.ts
|
|
2668
|
-
var ANALYTICS_BUSY_MESSAGE = "Analytics is busy right now. The numbers will be there in a moment \u2014 try again shortly.";
|
|
2669
|
-
function isAnalyticsBusy(message) {
|
|
2670
|
-
return typeof message === "string" && message.includes(ANALYTICS_BUSY_MESSAGE);
|
|
2671
|
-
}
|
|
2672
|
-
var ANALYTICS_BUSY_FIX = "Nothing went wrong and nothing was lost \u2014 the analytics store was briefly at capacity. Wait a few seconds and ask for the same report again. If you were in the middle of a larger job, carry on with the rest of it and come back to this read; do not abandon the job.";
|
|
2673
|
-
var ANALYTICS_BUSY_RETRY_MS = 5e3;
|
|
2674
|
-
async function retryOnceIfBusy(read, messageOf, sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms))) {
|
|
2675
|
-
try {
|
|
2676
|
-
return await read();
|
|
2677
|
-
} catch (caught) {
|
|
2678
|
-
if (!isAnalyticsBusy(messageOf(caught))) throw caught;
|
|
2679
|
-
await sleep(ANALYTICS_BUSY_RETRY_MS);
|
|
2680
|
-
return await read();
|
|
2681
|
-
}
|
|
2682
|
-
}
|
|
2683
|
-
|
|
2684
|
-
// ../api/src/analytics/conversionNames.ts
|
|
2685
|
-
function normalizeConversionName(name) {
|
|
2686
|
-
return name.normalize("NFD").replace(/[\u0300-\u036f]/g, "").toLowerCase().replace(/[^a-z0-9]+/g, " ").trim().split(" ").filter((word) => word !== "").map((word) => word.length > 3 && word.endsWith("s") ? word.slice(0, -1) : word).join(" ");
|
|
2687
|
-
}
|
|
2688
|
-
function findNameCollision(name, existing) {
|
|
2689
|
-
const normalized = normalizeConversionName(name);
|
|
2690
|
-
return existing.find((candidate) => candidate !== name && normalizeConversionName(candidate) === normalized) ?? null;
|
|
2691
|
-
}
|
|
2692
|
-
var STANDARD_CONVERSION_NAMES = [
|
|
2693
|
-
{ name: "Lead", meaning: "Somebody handed over contact details" },
|
|
2694
|
-
{ name: "Booked a call", meaning: "A meeting or demo was scheduled" },
|
|
2695
|
-
{ name: "Quote requested", meaning: "Somebody asked what it would cost" },
|
|
2696
|
-
{ name: "Purchase", meaning: "Money changed hands" },
|
|
2697
|
-
{ name: "Signed up", meaning: "An account or trial was created" },
|
|
2698
|
-
{ name: "Subscribed", meaning: "Somebody opted in to hear from them again" },
|
|
2699
|
-
{ name: "Downloaded", meaning: "A guide, price list or asset was taken" },
|
|
2700
|
-
{ name: "Contacted us", meaning: "A call, WhatsApp or email started from the page" }
|
|
2701
|
-
];
|
|
2702
|
-
|
|
2703
|
-
// ../api/src/analytics/destinations.ts
|
|
2704
|
-
var CONVERSION_SEND_PREFIX = "conversionSend:";
|
|
2705
|
-
function isConversionSend(type) {
|
|
2706
|
-
return type.startsWith(CONVERSION_SEND_PREFIX);
|
|
2707
|
-
}
|
|
2708
|
-
var SERVER_SIDE_SENDER_TAG = {
|
|
2709
|
-
metaCapi: "meta",
|
|
2710
|
-
chatgptAdsCapi: "chatgptAds",
|
|
2711
|
-
googleAdsCapi: "googleAds",
|
|
2712
|
-
linkedinCapi: "linkedinInsightTag",
|
|
2713
|
-
twitterAdsCapi: "twitterAds",
|
|
2714
|
-
ga4Mp: "googleAnalytics"
|
|
2715
|
-
};
|
|
2716
|
-
var DESTINATION_NAMES = {
|
|
2717
|
-
email: "Email",
|
|
2718
|
-
httpWebhook: "HTTP Webhook",
|
|
2719
|
-
zapier: "Zapier",
|
|
2720
|
-
tiktok: "TikTok Pixel",
|
|
2721
|
-
pinterest: "Pinterest Tag",
|
|
2722
|
-
googleTagManager: "Google Tag Manager",
|
|
2723
|
-
amplitude: "Amplitude",
|
|
2724
|
-
hotjar: "Hotjar",
|
|
2725
|
-
clarity: "Microsoft Clarity",
|
|
2726
|
-
hubspot: "HubSpot Events",
|
|
2727
|
-
vwo: "VWO",
|
|
2728
|
-
posthog: "PostHog",
|
|
2729
|
-
datafast: "DataFast",
|
|
2730
|
-
code: "Custom Code",
|
|
2731
|
-
pipedrive: "Pipedrive",
|
|
2732
|
-
googleSpreadsheet: "Google Sheets",
|
|
2733
|
-
hubspotForm: "HubSpot Form",
|
|
2734
|
-
goHighlevelContact: "GoHighLevel",
|
|
2735
|
-
shopifyCustomer: "Shopify",
|
|
2736
|
-
crmble: "Crmble",
|
|
2737
|
-
activeCampaignContact: "ActiveCampaign"
|
|
2738
|
-
};
|
|
2739
|
-
function destinationKey(type) {
|
|
2740
|
-
const platform = isConversionSend(type) ? type.slice(CONVERSION_SEND_PREFIX.length) : type;
|
|
2741
|
-
return SERVER_SIDE_SENDER_TAG[platform] ?? platform;
|
|
2742
|
-
}
|
|
2743
|
-
function destinationName(type) {
|
|
2744
|
-
if (type === "") return "";
|
|
2745
|
-
const key = destinationKey(type);
|
|
2746
|
-
if (isSendPlatform(key)) return SEND_PLATFORM_SPECS[key].title;
|
|
2747
|
-
return DESTINATION_NAMES[key] ?? type;
|
|
2748
|
-
}
|
|
2749
|
-
|
|
2750
|
-
// ../api/src/analytics/row.ts
|
|
2751
|
-
var EVENT_ITEMS_MAX = 250;
|
|
2752
|
-
|
|
2753
|
-
// ../api/src/analytics/triggers.ts
|
|
2754
|
-
var TRIGGERS = {
|
|
2755
|
-
"calendlyEvent.eventScheduled": {
|
|
2756
|
-
what: "Call booked",
|
|
2757
|
-
meaning: "Somebody picked a slot and confirmed it. This is the booking."
|
|
2758
|
-
},
|
|
2759
|
-
"calendlyEvent.dateAndTimeSelected": {
|
|
2760
|
-
what: "Time picked",
|
|
2761
|
-
meaning: "Somebody chose a slot but has not confirmed the booking yet."
|
|
2762
|
-
},
|
|
2763
|
-
"calendlyEvent.eventTypeViewed": {
|
|
2764
|
-
what: "Calendar opened",
|
|
2765
|
-
meaning: "The calendar appeared. Nobody has picked a time yet.",
|
|
2766
|
-
lifecycle: true
|
|
2767
|
-
},
|
|
2768
|
-
"calendlyEvent.profilePageViewed": {
|
|
2769
|
-
what: "Booking page shown",
|
|
2770
|
-
meaning: "Calendly's own page appeared. Nobody has picked a time yet.",
|
|
2771
|
-
lifecycle: true
|
|
2772
|
-
},
|
|
2773
|
-
"customForm.onFormSubmitted": {
|
|
2774
|
-
what: "Form submitted",
|
|
2775
|
-
meaning: "Somebody filled this step in and sent it."
|
|
2776
|
-
},
|
|
2777
|
-
"highlevelEvent.appointmentScheduled": {
|
|
2778
|
-
what: "Appointment booked",
|
|
2779
|
-
meaning: "Somebody picked a slot and confirmed it. This is the booking."
|
|
2780
|
-
},
|
|
2781
|
-
"highlevelEvent.calendarLoaded": {
|
|
2782
|
-
what: "Calendar finished loading",
|
|
2783
|
-
meaning: "The calendar appeared. Nobody has picked a time yet.",
|
|
2784
|
-
lifecycle: true
|
|
2785
|
-
},
|
|
2786
|
-
"highlevelFormEvent.formSubmitted": {
|
|
2787
|
-
what: "Form submitted",
|
|
2788
|
-
meaning: "Somebody filled the form in and sent it."
|
|
2789
|
-
},
|
|
2790
|
-
"highlevelFormEvent.formLoaded": {
|
|
2791
|
-
what: "Form finished loading",
|
|
2792
|
-
meaning: "The form appeared. Nobody has typed anything yet.",
|
|
2793
|
-
lifecycle: true
|
|
2794
|
-
},
|
|
2795
|
-
"hubspotForm.onFormSubmitted": {
|
|
2796
|
-
what: "Form submitted",
|
|
2797
|
-
meaning: "Somebody filled the form in and sent it. This is the one that means a lead."
|
|
2798
|
-
},
|
|
2799
|
-
"hubspotForm.onBeforeFormSubmit": {
|
|
2800
|
-
what: "Form about to be sent",
|
|
2801
|
-
meaning: "Fires an instant before the form is sent \u2014 not the same as it arriving.",
|
|
2802
|
-
lifecycle: true
|
|
2803
|
-
},
|
|
2804
|
-
"hubspotForm.onFormReady": {
|
|
2805
|
-
what: "Form finished loading",
|
|
2806
|
-
meaning: "The form appeared. Nobody has typed anything yet.",
|
|
2807
|
-
lifecycle: true
|
|
2808
|
-
},
|
|
2809
|
-
"hubspotForm.onBeforeFormInit": {
|
|
2810
|
-
what: "Form starting to load",
|
|
2811
|
-
meaning: "Fires before the form has even drawn. It only means the page was opened.",
|
|
2812
|
-
lifecycle: true
|
|
2813
|
-
},
|
|
2814
|
-
"hubspotMeeting.onMeetingScheduled": {
|
|
2815
|
-
what: "Meeting booked",
|
|
2816
|
-
meaning: "Somebody picked a slot and confirmed it. This is the booking."
|
|
2817
|
-
},
|
|
2818
|
-
"link.onClick": {
|
|
2819
|
-
what: "Link clicked",
|
|
2820
|
-
meaning: "Somebody clicked the link on this step and left for wherever it points."
|
|
2821
|
-
},
|
|
2822
|
-
"savvycalEvent.scheduled": {
|
|
2823
|
-
what: "Call booked",
|
|
2824
|
-
meaning: "Somebody picked a slot and confirmed it. This is the booking."
|
|
2825
|
-
},
|
|
2826
|
-
"text.onTextDisplayed": {
|
|
2827
|
-
what: "Screen shown",
|
|
2828
|
-
meaning: "This screen appeared. On a thank-you screen that is the outcome; elsewhere it is not."
|
|
2829
|
-
},
|
|
2830
|
-
"text.onButtonClicked": {
|
|
2831
|
-
what: "Button pressed",
|
|
2832
|
-
meaning: "Somebody pressed the button on this screen."
|
|
2833
|
-
}
|
|
2834
|
-
};
|
|
2835
|
-
function triggerDescription(triggerId) {
|
|
2836
|
-
return TRIGGERS[triggerId];
|
|
2837
|
-
}
|
|
2838
|
-
|
|
2839
|
-
// ../api/src/analytics/feedNoise.ts
|
|
2840
|
-
var BOOKKEEPING_TYPES = /* @__PURE__ */ new Set([
|
|
2841
|
-
"visitor_new",
|
|
2842
|
-
"session_start",
|
|
2843
|
-
"identify",
|
|
2844
|
-
"form_step_view",
|
|
2845
|
-
"side_effect_settled"
|
|
2846
|
-
]);
|
|
2847
|
-
var SUBMIT_TRIGGERS = new Set(Object.values(STEP_SUBMIT_TRIGGERS));
|
|
2848
|
-
function isEmbedLifecycle(row) {
|
|
2849
|
-
return row.eventType === "form_trigger" && triggerDescription(row.triggerId)?.lifecycle === true;
|
|
2850
|
-
}
|
|
2851
|
-
function isBookkeepingRow(row) {
|
|
2852
|
-
if (BOOKKEEPING_TYPES.has(row.eventType)) return true;
|
|
2853
|
-
if (isEmbedLifecycle(row)) return true;
|
|
2854
|
-
return row.eventType === "form_trigger" && SUBMIT_TRIGGERS.has(row.triggerId);
|
|
2855
|
-
}
|
|
2856
|
-
|
|
2857
|
-
// ../api/src/analytics/matchKeys.ts
|
|
2858
|
-
var CONTACT_KEYS = ["email", "phone", "external_id", "baker_id"];
|
|
2859
|
-
var MATCH_KEY_FIELDS = [...CONTACT_KEYS, ...INGEST_CLICK_ID_PARAMS, ...MATCH_COOKIES];
|
|
2860
|
-
var MATCH_KEY_LABELS = {
|
|
2861
|
-
email: "email",
|
|
2862
|
-
phone: "phone",
|
|
2863
|
-
external_id: "external ID",
|
|
2864
|
-
baker_id: "Baker ID",
|
|
2865
|
-
gclid: "Google click",
|
|
2866
|
-
wbraid: "Google click (wbraid)",
|
|
2867
|
-
gbraid: "Google click (gbraid)",
|
|
2868
|
-
dclid: "Google Display click",
|
|
2869
|
-
fbclid: "Meta click",
|
|
2870
|
-
ttclid: "TikTok click",
|
|
2871
|
-
twclid: "X click",
|
|
2872
|
-
li_fat_id: "LinkedIn click",
|
|
2873
|
-
msclkid: "Microsoft click",
|
|
2874
|
-
rdt_cid: "Reddit click",
|
|
2875
|
-
epik: "Pinterest click",
|
|
2876
|
-
sccid: "Snapchat click",
|
|
2877
|
-
oppref: "ChatGPT Ads click",
|
|
2878
|
-
fbp: "Meta browser cookie",
|
|
2879
|
-
fbc: "Meta click cookie"
|
|
2880
|
-
};
|
|
2881
|
-
function carries(userData, field) {
|
|
2882
|
-
for (const key of [field, `${field}_sha256`, `${field}_preview`]) {
|
|
2883
|
-
const value = userData[key];
|
|
2884
|
-
if (typeof value === "string" && value !== "") return true;
|
|
2885
|
-
}
|
|
2886
|
-
return false;
|
|
2887
|
-
}
|
|
2888
|
-
function rowMatchKeys(userData) {
|
|
2889
|
-
if (userData === void 0) return [];
|
|
2890
|
-
return MATCH_KEY_FIELDS.filter((field) => carries(userData, field)).map((field) => ({
|
|
2891
|
-
field,
|
|
2892
|
-
label: MATCH_KEY_LABELS[field] ?? field
|
|
2893
|
-
}));
|
|
2894
|
-
}
|
|
2895
|
-
|
|
2896
|
-
// ../api/src/analytics/trackingTemplate.ts
|
|
2897
|
-
function placeholderKey(raw) {
|
|
2898
|
-
return raw.replace(/[{}]/g, "").replace(/^_+|_+$/g, "").trim().toLowerCase();
|
|
2899
|
-
}
|
|
2900
|
-
var EXTRA_PLACEHOLDER_ROLES = {
|
|
2901
|
-
google: {
|
|
2902
|
-
merchant_id: "product_id",
|
|
2903
|
-
product_partition_id: "product_id"
|
|
2904
|
-
}
|
|
2905
|
-
};
|
|
2906
|
-
function placeholderRoles(platform) {
|
|
2907
|
-
const roles = {};
|
|
2908
|
-
for (const dimension of AD_PLATFORM_DEFINITIONS[platform].dimensions) {
|
|
2909
|
-
roles[placeholderKey(dimension.macro)] = dimension.role;
|
|
2910
|
-
}
|
|
2911
|
-
return { ...roles, ...EXTRA_PLACEHOLDER_ROLES[platform] ?? {} };
|
|
2912
|
-
}
|
|
2913
|
-
function paramsFromTemplate(template) {
|
|
2914
|
-
const start = template.indexOf("?");
|
|
2915
|
-
const query = start === -1 ? template : template.slice(start + 1);
|
|
2916
|
-
const params = [];
|
|
2917
|
-
for (const pair of query.split("&")) {
|
|
2918
|
-
const at = pair.indexOf("=");
|
|
2919
|
-
if (at < 1) continue;
|
|
2920
|
-
const name = pair.slice(0, at).trim();
|
|
2921
|
-
if (name === "") continue;
|
|
2922
|
-
params.push({ name, value: pair.slice(at + 1).trim() });
|
|
2923
|
-
}
|
|
2924
|
-
return params;
|
|
2925
|
-
}
|
|
2926
|
-
function proposeMappingFromTemplate(template, platform) {
|
|
2927
|
-
const builtIn = builtinAdParamMapping(platform);
|
|
2928
|
-
const vocabulary = placeholderRoles(platform);
|
|
2929
|
-
const proposed = {};
|
|
2930
|
-
const unexplained = [];
|
|
2931
|
-
for (const param of paramsFromTemplate(template)) {
|
|
2932
|
-
if (RESERVED_PARAM_NAMES.includes(param.name)) continue;
|
|
2933
|
-
if (param.name in builtIn) continue;
|
|
2934
|
-
const role = vocabulary[placeholderKey(param.value)];
|
|
2935
|
-
if (role) {
|
|
2936
|
-
proposed[param.name] = role;
|
|
2937
|
-
continue;
|
|
2938
|
-
}
|
|
2939
|
-
unexplained.push(param);
|
|
2940
|
-
}
|
|
2941
|
-
return { proposed, unexplained };
|
|
2942
|
-
}
|
|
2943
|
-
function mappingCommandFor(platform, proposed) {
|
|
2944
|
-
const pairs = Object.entries(proposed).map(([name, role]) => `${name}=${role}`);
|
|
2945
|
-
if (pairs.length === 0) return "";
|
|
2946
|
-
return `baker analytics map --platform ${platform} --set ${pairs.join(",")}`;
|
|
2947
|
-
}
|
|
2948
|
-
|
|
2949
|
-
export {
|
|
2950
|
-
AD_PARAM_ROLE_SPECS,
|
|
2951
|
-
isAdPlatform,
|
|
2952
|
-
essentialAdDimensions,
|
|
2953
|
-
isAnalyticsBusy,
|
|
2954
|
-
ANALYTICS_BUSY_FIX,
|
|
2955
|
-
retryOnceIfBusy,
|
|
2956
|
-
findNameCollision,
|
|
2957
|
-
STANDARD_CONVERSION_NAMES,
|
|
2958
|
-
CONVERSION_COUNT_MODES,
|
|
2959
|
-
formEventKey,
|
|
2960
|
-
isCheckoutRecordKey,
|
|
2961
|
-
CHECKOUT_RECORD_REFUSAL,
|
|
2962
|
-
isLandingViewKey,
|
|
2963
|
-
parseEventKey,
|
|
2964
|
-
SEND_PLATFORMS,
|
|
2965
|
-
isSendPlatform,
|
|
2966
|
-
sendEventProblem,
|
|
2967
|
-
destinationName,
|
|
2968
|
-
EVENT_ITEMS_MAX,
|
|
2969
|
-
isBookkeepingRow,
|
|
2970
|
-
rowMatchKeys,
|
|
2971
|
-
PEOPLE_SEARCH_MAX_TERMS,
|
|
2972
|
-
parsePeopleQuery,
|
|
2973
|
-
peopleLookupRequestSchema,
|
|
2974
|
-
sendsRequestSchema,
|
|
2975
|
-
proposeMappingFromTemplate,
|
|
2976
|
-
mappingCommandFor,
|
|
2977
|
-
ANALYTICS_UNSTAGE_KINDS,
|
|
2978
|
-
SEND_FILTERS,
|
|
2979
|
-
ANALYTICS_FULL_BREAKDOWN_LIMIT,
|
|
2980
|
-
ANALYTICS_EVENT_DOORS
|
|
2981
|
-
};
|
|
2982
|
-
//# sourceMappingURL=chunk-7J3NZBPV.js.map
|