@koda-sl/baker-cli 0.495.0 → 0.497.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 +25 -4
- package/dist/account-ZKJFX2GK.js +80 -0
- package/dist/account-ZKJFX2GK.js.map +1 -0
- package/dist/account-users-SZCYHVBM.js +62 -0
- package/dist/account-users-SZCYHVBM.js.map +1 -0
- package/dist/accounts-5DFYKYSM.js +78 -0
- package/dist/accounts-5DFYKYSM.js.map +1 -0
- package/dist/accounts-OGAIQNE6.js +612 -0
- package/dist/accounts-OGAIQNE6.js.map +1 -0
- package/dist/actions-FMNJSOBA.js +55 -0
- package/dist/activecampaign-LYYYH6XD.js +936 -0
- package/dist/activecampaign-LYYYH6XD.js.map +1 -0
- package/dist/add-AOQLZRPC.js +80 -0
- package/dist/add-AOQLZRPC.js.map +1 -0
- package/dist/add-HWXEPSZF.js +105 -0
- package/dist/add-HWXEPSZF.js.map +1 -0
- package/dist/add-VDZPGZF5.js +148 -0
- package/dist/add-VDZPGZF5.js.map +1 -0
- package/dist/add-YYP3O536.js +303 -0
- package/dist/add-YYP3O536.js.map +1 -0
- package/dist/ads-OLXSDPD6.js +40 -0
- package/dist/advertisers-STYAIX72.js +121 -0
- package/dist/advertisers-STYAIX72.js.map +1 -0
- package/dist/analytics-6WBK4VFO.js +1977 -0
- package/dist/analytics-6WBK4VFO.js.map +1 -0
- package/dist/analytics-DHB325DM.js +434 -0
- package/dist/analytics-DHB325DM.js.map +1 -0
- package/dist/assign-BFXHYTMF.js +78 -0
- package/dist/assign-BFXHYTMF.js.map +1 -0
- package/dist/audience-size-XWHZV2GH.js +74 -0
- package/dist/audience-size-XWHZV2GH.js.map +1 -0
- package/dist/audit-IYGRU7LD.js +152 -0
- package/dist/audit-IYGRU7LD.js.map +1 -0
- package/dist/autocomplete-SDDSJTAF.js +112 -0
- package/dist/autocomplete-SDDSJTAF.js.map +1 -0
- package/dist/avatars-I4H3NMEJ.js +38 -0
- package/dist/bid-pricing-OVYBDRMV.js +101 -0
- package/dist/bid-pricing-OVYBDRMV.js.map +1 -0
- package/dist/brand-3V7ECY7D.js +22 -0
- package/dist/brief-U2W7KMFC.js +539 -0
- package/dist/brief-U2W7KMFC.js.map +1 -0
- package/dist/campaign-groups-FJHBVUA3.js +97 -0
- package/dist/campaign-groups-FJHBVUA3.js.map +1 -0
- package/dist/campaign-writes-XKYYMZML.js +166 -0
- package/dist/campaign-writes-XKYYMZML.js.map +1 -0
- package/dist/campaigns-E5UW4I3X.js +111 -0
- package/dist/campaigns-E5UW4I3X.js.map +1 -0
- package/dist/campaigns-MCB76NPQ.js +107 -0
- package/dist/canvas-JCNKMGCG.js +46 -0
- package/dist/capabilities-CLTZCXCZ.js +145 -0
- package/dist/capabilities-CLTZCXCZ.js.map +1 -0
- package/dist/chatgpt-XFZ42NXC.js +47 -0
- package/dist/chats-DTJSBDWO.js +277 -0
- package/dist/chats-DTJSBDWO.js.map +1 -0
- package/dist/check-CZTS64AW.js +105 -0
- package/dist/check-CZTS64AW.js.map +1 -0
- package/dist/chunk-2YTBPRRG.js +207 -0
- package/dist/chunk-3SNCMEJB.js +97 -0
- package/dist/chunk-7QGFO35A.js +23 -0
- package/dist/chunk-AV7ALENU.js +191 -0
- package/dist/chunk-BRLFQ4VX.js +604 -0
- package/dist/chunk-CAZGM2NX.js +92 -0
- package/dist/chunk-CAZGM2NX.js.map +1 -0
- package/dist/chunk-DJE7UXYT.js +831 -0
- package/dist/chunk-EFWXYUSK.js +139 -0
- package/dist/chunk-EONSZAZB.js +3868 -0
- package/dist/chunk-FALJQCWL.js +661 -0
- package/dist/chunk-FALJQCWL.js.map +1 -0
- package/dist/chunk-FG3MV2XM.js +89 -0
- package/dist/chunk-FKG476GH.js +392 -0
- package/dist/chunk-FUGQSIYG.js +297 -0
- package/dist/chunk-G4OFH3MX.js +455 -0
- package/dist/chunk-G4OFH3MX.js.map +1 -0
- package/dist/chunk-GZ4A2VYW.js +39 -0
- package/dist/chunk-GZ4A2VYW.js.map +1 -0
- package/dist/chunk-HPLHAHG5.js +275 -0
- package/dist/chunk-I24YT2KG.js +122 -0
- package/dist/chunk-IFDZZOUC.js +903 -0
- package/dist/chunk-JVVUI55M.js +455 -0
- package/dist/chunk-KKSHEPBY.js +363 -0
- package/dist/chunk-KQ7RCLGC.js +547 -0
- package/dist/chunk-L7WMS5PW.js +172 -0
- package/dist/chunk-LBRO4MTL.js +19 -0
- package/dist/chunk-LNRPOULW.js +224 -0
- package/dist/chunk-LX6WC2XZ.js +942 -0
- package/dist/chunk-MMGTJBM6.js +142 -0
- package/dist/chunk-NZS3KEQ2.js +97 -0
- package/dist/chunk-NZS3KEQ2.js.map +1 -0
- package/dist/chunk-O37VU7FG.js +6799 -0
- package/dist/chunk-O37VU7FG.js.map +1 -0
- package/dist/chunk-OEZYSL3U.js +51 -0
- package/dist/chunk-OOVHBMQB.js +103 -0
- package/dist/chunk-PTH7VWKK.js +159 -0
- package/dist/chunk-PYD6IGW6.js +401 -0
- package/dist/chunk-PYD6IGW6.js.map +1 -0
- package/dist/chunk-QE2E4EYJ.js +349 -0
- package/dist/chunk-QE2E4EYJ.js.map +1 -0
- package/dist/chunk-QZF4BVKL.js +66 -0
- package/dist/chunk-RITUSBYO.js +61 -0
- package/dist/chunk-SSTL3A7Z.js +206 -0
- package/dist/chunk-SZNGQ2GF.js +64 -0
- package/dist/chunk-SZNGQ2GF.js.map +1 -0
- package/dist/chunk-TD4SO6TR.js +169 -0
- package/dist/chunk-UZ4RTOFG.js +91 -0
- package/dist/chunk-VAX7PFQV.js +592 -0
- package/dist/chunk-VDRSZK4P.js +494 -0
- package/dist/chunk-VNU2EYD4.js +344 -0
- package/dist/chunk-WT4WDIXA.js +156 -0
- package/dist/chunk-XEX23CIB.js +160 -0
- package/dist/chunk-XXDF25BW.js +8939 -0
- package/dist/chunk-YJ3LSFMX.js +249 -0
- package/dist/chunk-YVK5RT3B.js +197 -0
- package/dist/chunk-YWWRLZUR.js +433 -0
- package/dist/chunk-Z4S5BCVZ.js +57 -0
- package/dist/chunk-ZYGK7GAK.js +1079 -0
- package/dist/claim-TSFPWTQY.js +198 -0
- package/dist/claim-TSFPWTQY.js.map +1 -0
- package/dist/cli.js +38 -37
- package/dist/cli.js.map +1 -1
- package/dist/companies-P7FZNJQV.js +196 -0
- package/dist/companies-P7FZNJQV.js.map +1 -0
- package/dist/complete-SYDIHMD5.js +82 -0
- package/dist/complete-SYDIHMD5.js.map +1 -0
- package/dist/connect-COS6G45S.js +43 -0
- package/dist/conversation-UJOWMJRH.js +94 -0
- package/dist/conversation-UJOWMJRH.js.map +1 -0
- package/dist/conversions-ONOIEILU.js +138 -0
- package/dist/conversions-ONOIEILU.js.map +1 -0
- package/dist/create-DPQRYQXK.js +208 -0
- package/dist/create-DPQRYQXK.js.map +1 -0
- package/dist/create-JD76Z4A4.js +60 -0
- package/dist/create-JD76Z4A4.js.map +1 -0
- package/dist/create-NOT3HGP2.js +133 -0
- package/dist/create-NOT3HGP2.js.map +1 -0
- package/dist/create-ZYEB7SHF.js +236 -0
- package/dist/create-ZYEB7SHF.js.map +1 -0
- package/dist/creatives-LRSELC7Y.js +221 -0
- package/dist/creatives-LRSELC7Y.js.map +1 -0
- package/dist/creatives-SEQHJD2M.js +58 -0
- package/dist/credentials-LHPTUVVA.js +288 -0
- package/dist/credentials-LHPTUVVA.js.map +1 -0
- package/dist/critique-Q7GSZ5RP.js +1459 -0
- package/dist/critique-Q7GSZ5RP.js.map +1 -0
- package/dist/critique-RR2XOQCE.js +228 -0
- package/dist/critique-RR2XOQCE.js.map +1 -0
- package/dist/crm-J7EU32PL.js +319 -0
- package/dist/crm-J7EU32PL.js.map +1 -0
- package/dist/crm-MC444ZVU.js +225 -0
- package/dist/crm-MC444ZVU.js.map +1 -0
- package/dist/customers-LMSX33FO.js +57 -0
- package/dist/delete-BQBVATMF.js +55 -0
- package/dist/delete-BQBVATMF.js.map +1 -0
- package/dist/delete-K7A3AUPH.js +65 -0
- package/dist/delete-K7A3AUPH.js.map +1 -0
- package/dist/delete-VV2ICIHF.js +67 -0
- package/dist/delete-VV2ICIHF.js.map +1 -0
- package/dist/demographics-7GWUXXS6.js +139 -0
- package/dist/demographics-7GWUXXS6.js.map +1 -0
- package/dist/discard-3CLZ4DPD.js +67 -0
- package/dist/discard-3CLZ4DPD.js.map +1 -0
- package/dist/domain-ZS74BSE6.js +99 -0
- package/dist/domain-ZS74BSE6.js.map +1 -0
- package/dist/draft-J3B33RAZ.js +308 -0
- package/dist/draft-J3B33RAZ.js.map +1 -0
- package/dist/draft-MZLWVX3D.js +218 -0
- package/dist/draft-MZLWVX3D.js.map +1 -0
- package/dist/draft-R56PIXCV.js +333 -0
- package/dist/draft-R56PIXCV.js.map +1 -0
- package/dist/experiment-7RJ5X2LL.js +1397 -0
- package/dist/experiments-NOSJJMYI.js +234 -0
- package/dist/experiments-NOSJJMYI.js.map +1 -0
- package/dist/facets-E6SHYUAI.js +115 -0
- package/dist/facets-E6SHYUAI.js.map +1 -0
- package/dist/feedback-HXCQBV7S.js +107 -0
- package/dist/feedback-HXCQBV7S.js.map +1 -0
- package/dist/feedback-record-GXPYXNT6.js +261 -0
- package/dist/feedback-record-GXPYXNT6.js.map +1 -0
- package/dist/fetch-HMUGSRE4.js +177 -0
- package/dist/fetch-HMUGSRE4.js.map +1 -0
- package/dist/find-2EPXK5RF.js +134 -0
- package/dist/fit-W7UNFZT5.js +63 -0
- package/dist/flows-SO5J3M3X.js +248 -0
- package/dist/flows-SO5J3M3X.js.map +1 -0
- package/dist/fonts-N42UYWTX.js +37 -0
- package/dist/forecast-24LGJVLC.js +119 -0
- package/dist/forecast-24LGJVLC.js.map +1 -0
- package/dist/funnel-NYT36B3C.js +395 -0
- package/dist/funnel-NYT36B3C.js.map +1 -0
- package/dist/ga4-6EIQC2TG.js +55 -0
- package/dist/get-KAGO4EC5.js +80 -0
- package/dist/get-KAGO4EC5.js.map +1 -0
- package/dist/get-PZX27LQY.js +38 -0
- package/dist/get-PZX27LQY.js.map +1 -0
- package/dist/get-R5JAFHTH.js +57 -0
- package/dist/get-R5JAFHTH.js.map +1 -0
- package/dist/google-O5OI6QFU.js +136 -0
- package/dist/google-ads-6X4BHGUR.js +196 -0
- package/dist/google-ads-6X4BHGUR.js.map +1 -0
- package/dist/gsc-BM3T2GDL.js +30 -0
- package/dist/history-LGOWYLBE.js +134 -0
- package/dist/history-LGOWYLBE.js.map +1 -0
- package/dist/hubspot-LJB3ETUT.js +780 -0
- package/dist/hubspot-LJB3ETUT.js.map +1 -0
- package/dist/icon-B7DG53S5.js +137 -0
- package/dist/ideas-DYN2DMFN.js +41 -0
- package/dist/images-EQCUXEHF.js +92 -0
- package/dist/ingest-B46AY3QU.js +24 -0
- package/dist/ingest-T7ZS2R4U.js +108 -0
- package/dist/ingest-T7ZS2R4U.js.map +1 -0
- package/dist/inspect-BSNGAT2S.js +190 -0
- package/dist/inspect-BSNGAT2S.js.map +1 -0
- package/dist/inspiration-TCCKM4R7.js +53 -0
- package/dist/keyword-metrics-KNTIN4ZK.js +198 -0
- package/dist/keyword-metrics-KNTIN4ZK.js.map +1 -0
- package/dist/keywords-for-site-S4MXGXWR.js +129 -0
- package/dist/keywords-for-site-S4MXGXWR.js.map +1 -0
- package/dist/landing-WVPA7NBR.js +28 -0
- package/dist/leads-EINV5FK3.js +113 -0
- package/dist/leads-EINV5FK3.js.map +1 -0
- package/dist/learn-7Z2VR6MS.js +205 -0
- package/dist/learn-7Z2VR6MS.js.map +1 -0
- package/dist/line-item-writes-Z3TIB5KZ.js +209 -0
- package/dist/line-item-writes-Z3TIB5KZ.js.map +1 -0
- package/dist/line-items-OEWYOPFP.js +103 -0
- package/dist/link-KYHUIPJE.js +65 -0
- package/dist/link-KYHUIPJE.js.map +1 -0
- package/dist/linkedin-JVB4HXJC.js +1314 -0
- package/dist/linkedin-JVB4HXJC.js.map +1 -0
- package/dist/list-EORTO73V.js +93 -0
- package/dist/list-EORTO73V.js.map +1 -0
- package/dist/list-QQVLURKH.js +152 -0
- package/dist/list-QQVLURKH.js.map +1 -0
- package/dist/list-QWGKRUSM.js +65 -0
- package/dist/list-QWGKRUSM.js.map +1 -0
- package/dist/list-WRBWQASJ.js +50 -0
- package/dist/list-Z6NMNK3T.js +304 -0
- package/dist/list-Z6NMNK3T.js.map +1 -0
- package/dist/log-RUMKYPYK.js +93 -0
- package/dist/log-RUMKYPYK.js.map +1 -0
- package/dist/logo-QTSBKP2J.js +18 -0
- package/dist/make-IJGCQA7C.js +1354 -0
- package/dist/make-IJGCQA7C.js.map +1 -0
- package/dist/map-QZHIJFQT.js +434 -0
- package/dist/map-QZHIJFQT.js.map +1 -0
- package/dist/mcp-ZH2XDV5P.js +715 -0
- package/dist/mcp-ZH2XDV5P.js.map +1 -0
- package/dist/media-sources-SQ2RPDBO.js +35 -0
- package/dist/media-sources-SQ2RPDBO.js.map +1 -0
- package/dist/members-4YX7JEZM.js +45 -0
- package/dist/members-4YX7JEZM.js.map +1 -0
- package/dist/normalize-ABIWLRIT.js +142 -0
- package/dist/normalize-ABIWLRIT.js.map +1 -0
- package/dist/options-SVCQVTNE.js +123 -0
- package/dist/options-SVCQVTNE.js.map +1 -0
- package/dist/organization-FNKDC742.js +947 -0
- package/dist/organization-FNKDC742.js.map +1 -0
- package/dist/performance-HTU5FR2K.js +25 -0
- package/dist/plan-W2K45F7K.js +207 -0
- package/dist/posts-3DAPTBH2.js +34 -0
- package/dist/posts-3DAPTBH2.js.map +1 -0
- package/dist/promoted-tweet-writes-DD3CJNWW.js +181 -0
- package/dist/promoted-tweet-writes-DD3CJNWW.js.map +1 -0
- package/dist/promoted-tweets-TTWN5OMW.js +119 -0
- package/dist/publish-Z62KGDJ2.js +342 -0
- package/dist/publish-Z62KGDJ2.js.map +1 -0
- package/dist/reddit-6C3PT5CT.js +27 -0
- package/dist/refresh-HCQXVFVR.js +95 -0
- package/dist/refresh-HCQXVFVR.js.map +1 -0
- package/dist/refresh-ZCGH64OZ.js +42 -0
- package/dist/refresh-ZCGH64OZ.js.map +1 -0
- package/dist/release-FIHW2HCH.js +61 -0
- package/dist/release-FIHW2HCH.js.map +1 -0
- package/dist/remove-CBR7NVMI.js +51 -0
- package/dist/remove-CBR7NVMI.js.map +1 -0
- package/dist/remove-PUZP5GWN.js +49 -0
- package/dist/remove-PUZP5GWN.js.map +1 -0
- package/dist/reopen-EJGLRQWR.js +64 -0
- package/dist/reopen-EJGLRQWR.js.map +1 -0
- package/dist/rerun-TVBZXASH.js +91 -0
- package/dist/rerun-TVBZXASH.js.map +1 -0
- package/dist/research-L25D4WHQ.js +263 -0
- package/dist/research-L25D4WHQ.js.map +1 -0
- package/dist/research-YCMMQVK6.js +62 -0
- package/dist/reset-HKKCWKZ7.js +55 -0
- package/dist/reset-HKKCWKZ7.js.map +1 -0
- package/dist/reset-SRL6I6GP.js +55 -0
- package/dist/reset-SRL6I6GP.js.map +1 -0
- package/dist/resolve-POMTTAFR.js +122 -0
- package/dist/resolve-POMTTAFR.js.map +1 -0
- package/dist/retry-MEPTOAV2.js +61 -0
- package/dist/retry-MEPTOAV2.js.map +1 -0
- package/dist/retry-RNGM3KKA.js +63 -0
- package/dist/retry-RNGM3KKA.js.map +1 -0
- package/dist/revenue-X4KPTSAM.js +89 -0
- package/dist/revenue-X4KPTSAM.js.map +1 -0
- package/dist/rules-VK7YA23Q.js +97 -0
- package/dist/rules-VK7YA23Q.js.map +1 -0
- package/dist/rules-add-VG7AT6EG.js +463 -0
- package/dist/rules-add-VG7AT6EG.js.map +1 -0
- package/dist/run-DIDQSZU7.js +67 -0
- package/dist/run-DIDQSZU7.js.map +1 -0
- package/dist/run-SR7DJ7M5.js +66 -0
- package/dist/scaffold-ad-46GTFUMP.js +1512 -0
- package/dist/scaffold-ad-46GTFUMP.js.map +1 -0
- package/dist/scaffold-static-ad-U63V4UHR.js +1006 -0
- package/dist/scaffold-static-ad-U63V4UHR.js.map +1 -0
- package/dist/scaffold-video-4DNTURH6.js +884 -0
- package/dist/scaffold-video-4DNTURH6.js.map +1 -0
- package/dist/schedule-JO66N7XO.js +62 -0
- package/dist/schedule-JO66N7XO.js.map +1 -0
- package/dist/schedule-JZBIX6LH.js +67 -0
- package/dist/schedule-JZBIX6LH.js.map +1 -0
- package/dist/scheduled-agents-N63EZNY6.js +50 -0
- package/dist/schema-B2XANMEY.js +133 -0
- package/dist/schema-B2XANMEY.js.map +1 -0
- package/dist/schema-C6SGBNA6.js +69 -0
- package/dist/search-7GHS3OUZ.js +51 -0
- package/dist/search-7GHS3OUZ.js.map +1 -0
- package/dist/search-W5HZUJA2.js +175 -0
- package/dist/search-W5HZUJA2.js.map +1 -0
- package/dist/select-LMGLNFWB.js +102 -0
- package/dist/select-LMGLNFWB.js.map +1 -0
- package/dist/set-prompt-M5E3UZDM.js +194 -0
- package/dist/set-prompt-M5E3UZDM.js.map +1 -0
- package/dist/setup-links-ERBQSKAB.js +142 -0
- package/dist/setup-links-ERBQSKAB.js.map +1 -0
- package/dist/site-PNVFJRYK.js +178 -0
- package/dist/site-PNVFJRYK.js.map +1 -0
- package/dist/sources-DMZJPLKC.js +455 -0
- package/dist/sources-DMZJPLKC.js.map +1 -0
- package/dist/sources-HN3GCEDX.js +30 -0
- package/dist/stale-VWN25WTL.js +72 -0
- package/dist/stale-VWN25WTL.js.map +1 -0
- package/dist/stats-CVF6AC7R.js +34 -0
- package/dist/status-SF7DTPCJ.js +63 -0
- package/dist/status-SF7DTPCJ.js.map +1 -0
- package/dist/stock-4LPQ6SM7.js +179 -0
- package/dist/studio-NZ6WQ7OE.js +49 -0
- package/dist/suggest-WMMEQCUH.js +66 -0
- package/dist/suggest-WMMEQCUH.js.map +1 -0
- package/dist/sync-F7VNZLWY.js +55 -0
- package/dist/sync-F7VNZLWY.js.map +1 -0
- package/dist/sync-HVNDPBOD.js +55 -0
- package/dist/sync-HVNDPBOD.js.map +1 -0
- package/dist/sync-definition-CKEUYKWN.js +65 -0
- package/dist/tag-KTQ2FV5C.js +57 -0
- package/dist/tag-KTQ2FV5C.js.map +1 -0
- package/dist/tag-manager-FLXXLNKP.js +43 -0
- package/dist/tags-EUOOSAKN.js +26 -0
- package/dist/tags-KOMAP2G5.js +21 -0
- package/dist/tags-KOMAP2G5.js.map +1 -0
- package/dist/tags-TKXJGTR3.js +21 -0
- package/dist/tags-TKXJGTR3.js.map +1 -0
- package/dist/tags-VWIPDCUA.js +225 -0
- package/dist/tags-VWIPDCUA.js.map +1 -0
- package/dist/tags-XAB4HWGW.js +21 -0
- package/dist/tags-XAB4HWGW.js.map +1 -0
- package/dist/targeting-criteria-HE7K52WN.js +113 -0
- package/dist/targets-NA4XPDBF.js +104 -0
- package/dist/targets-NA4XPDBF.js.map +1 -0
- package/dist/testimonials-3Q5XM7JD.js +32 -0
- package/dist/top-companies-TKO4QGPJ.js +109 -0
- package/dist/top-companies-TKO4QGPJ.js.map +1 -0
- package/dist/translate-YVIZ5T44.js +605 -0
- package/dist/translate-YVIZ5T44.js.map +1 -0
- package/dist/triggers-QX7VW7UO.js +143 -0
- package/dist/triggers-QX7VW7UO.js.map +1 -0
- package/dist/unlink-64SRPUNG.js +68 -0
- package/dist/unlink-64SRPUNG.js.map +1 -0
- package/dist/unstage-5X2MOUMF.js +86 -0
- package/dist/unstage-5X2MOUMF.js.map +1 -0
- package/dist/update-22ZBHURE.js +81 -0
- package/dist/update-22ZBHURE.js.map +1 -0
- package/dist/update-2LTPSGWT.js +99 -0
- package/dist/update-2LTPSGWT.js.map +1 -0
- package/dist/update-DOKS7ATM.js +189 -0
- package/dist/update-DOKS7ATM.js.map +1 -0
- package/dist/update-FB6X463M.js +64 -0
- package/dist/update-FB6X463M.js.map +1 -0
- package/dist/update-QIZ7XFAM.js +153 -0
- package/dist/update-QIZ7XFAM.js.map +1 -0
- package/dist/upload-XJ7TUVIK.js +127 -0
- package/dist/upload-XJ7TUVIK.js.map +1 -0
- package/dist/url-params-KLQOLNPS.js +99 -0
- package/dist/url-params-KLQOLNPS.js.map +1 -0
- package/dist/validate-YTBJBG44.js +118 -0
- package/dist/validate-YTBJBG44.js.map +1 -0
- package/dist/videos-WAPUPJVT.js +39 -0
- package/dist/viewer-check-GHQA3UY2.js +81 -0
- package/dist/web-6JMWERTT.js +141 -0
- package/dist/web-6JMWERTT.js.map +1 -0
- package/dist/winning-ads-XCVUAIOU.js +86 -0
- package/dist/write-commands-N74CDMQM.js +1493 -0
- package/dist/write-commands-N74CDMQM.js.map +1 -0
- package/dist/x-SI4KYDEY.js +47 -0
- package/package.json +1 -1
- package/dist/account-UHNR5KTE.js +0 -79
- package/dist/account-UHNR5KTE.js.map +0 -1
- package/dist/accounts-KMLXHADA.js +0 -77
- package/dist/accounts-KMLXHADA.js.map +0 -1
- package/dist/accounts-QDGNTSTV.js +0 -611
- package/dist/accounts-QDGNTSTV.js.map +0 -1
- package/dist/actions-QL5UD2W4.js +0 -55
- package/dist/activecampaign-5OD45ROS.js +0 -935
- package/dist/activecampaign-5OD45ROS.js.map +0 -1
- package/dist/add-2F7BEVYD.js +0 -105
- package/dist/add-2F7BEVYD.js.map +0 -1
- package/dist/add-6K6LO7CM.js +0 -104
- package/dist/add-6K6LO7CM.js.map +0 -1
- package/dist/add-LYDJZDGO.js +0 -302
- package/dist/add-LYDJZDGO.js.map +0 -1
- package/dist/ads-DHPJFU52.js +0 -40
- package/dist/advertisers-23LU7GTV.js +0 -120
- package/dist/advertisers-23LU7GTV.js.map +0 -1
- package/dist/analytics-DVD4OBBR.js +0 -1976
- package/dist/analytics-DVD4OBBR.js.map +0 -1
- package/dist/analytics-HO2SLL4W.js +0 -433
- package/dist/analytics-HO2SLL4W.js.map +0 -1
- package/dist/assign-CLKJKH2B.js +0 -77
- package/dist/assign-CLKJKH2B.js.map +0 -1
- package/dist/audience-size-NNYYXODL.js +0 -73
- package/dist/audience-size-NNYYXODL.js.map +0 -1
- package/dist/audit-KB4P2XGS.js +0 -151
- package/dist/audit-KB4P2XGS.js.map +0 -1
- package/dist/autocomplete-VZD2SMTE.js +0 -111
- package/dist/autocomplete-VZD2SMTE.js.map +0 -1
- package/dist/avatars-FKOO6VZ2.js +0 -38
- package/dist/bid-pricing-6LLXOLLI.js +0 -100
- package/dist/bid-pricing-6LLXOLLI.js.map +0 -1
- package/dist/brand-NNWHBIAX.js +0 -22
- package/dist/brief-CPJQWT6W.js +0 -538
- package/dist/brief-CPJQWT6W.js.map +0 -1
- package/dist/campaign-groups-YPYNXOWU.js +0 -95
- package/dist/campaign-groups-YPYNXOWU.js.map +0 -1
- package/dist/campaign-writes-UJ4L2O6G.js +0 -165
- package/dist/campaign-writes-UJ4L2O6G.js.map +0 -1
- package/dist/campaigns-HLBZRH5A.js +0 -107
- package/dist/campaigns-N44ZDGB5.js +0 -109
- package/dist/campaigns-N44ZDGB5.js.map +0 -1
- package/dist/canvas-D64GLWUO.js +0 -46
- package/dist/capabilities-LWXCWMIY.js +0 -144
- package/dist/capabilities-LWXCWMIY.js.map +0 -1
- package/dist/chatgpt-YI6YNACI.js +0 -47
- package/dist/chats-7WGC2CVW.js +0 -276
- package/dist/chats-7WGC2CVW.js.map +0 -1
- package/dist/check-EH6BXWWL.js +0 -104
- package/dist/check-EH6BXWWL.js.map +0 -1
- package/dist/chunk-237WE5LX.js +0 -455
- package/dist/chunk-237WE5LX.js.map +0 -1
- package/dist/chunk-2B772ZEA.js +0 -169
- package/dist/chunk-2KRK667G.js +0 -51
- package/dist/chunk-2TVXJPGR.js +0 -103
- package/dist/chunk-3AMLOCXY.js +0 -392
- package/dist/chunk-3B5LPK6D.js +0 -658
- package/dist/chunk-3B5LPK6D.js.map +0 -1
- package/dist/chunk-3N5A44NQ.js +0 -122
- package/dist/chunk-3WAYZQNV.js +0 -61
- package/dist/chunk-5A257KJA.js +0 -160
- package/dist/chunk-6QGS3RQP.js +0 -363
- package/dist/chunk-AFD32O4A.js +0 -494
- package/dist/chunk-AW2GKIGS.js +0 -433
- package/dist/chunk-CYSBNCPX.js +0 -55
- package/dist/chunk-CYSBNCPX.js.map +0 -1
- package/dist/chunk-DAO63OOP.js +0 -6352
- package/dist/chunk-DAO63OOP.js.map +0 -1
- package/dist/chunk-EMQUW6JB.js +0 -942
- package/dist/chunk-EW3JEKIV.js +0 -139
- package/dist/chunk-FBFWMTOP.js +0 -19
- package/dist/chunk-GXDLWBOY.js +0 -73
- package/dist/chunk-GXDLWBOY.js.map +0 -1
- package/dist/chunk-GXGYTFZA.js +0 -8939
- package/dist/chunk-I7J7YQXZ.js +0 -142
- package/dist/chunk-IBY44U2M.js +0 -1079
- package/dist/chunk-IFXGCI33.js +0 -297
- package/dist/chunk-IKLHXGMF.js +0 -91
- package/dist/chunk-IYTPWAN3.js +0 -604
- package/dist/chunk-J3CWAERS.js +0 -3868
- package/dist/chunk-JH2L5CQD.js +0 -206
- package/dist/chunk-JUVVCA7B.js +0 -97
- package/dist/chunk-MK6XJUCQ.js +0 -197
- package/dist/chunk-N3I6ZXR7.js +0 -66
- package/dist/chunk-NBO2NSAW.js +0 -592
- package/dist/chunk-NEU5QD2C.js +0 -249
- package/dist/chunk-NKIBXOHT.js +0 -344
- package/dist/chunk-OE3MIV4F.js +0 -547
- package/dist/chunk-P2MFWJR3.js +0 -903
- package/dist/chunk-PHCIFBP3.js +0 -89
- package/dist/chunk-PTUXBO5O.js +0 -224
- package/dist/chunk-Q3LXLWZY.js +0 -275
- package/dist/chunk-Q5WBTVA7.js +0 -455
- package/dist/chunk-RDEAVCMF.js +0 -399
- package/dist/chunk-RDEAVCMF.js.map +0 -1
- package/dist/chunk-RGMKXNQP.js +0 -23
- package/dist/chunk-RZTKCCUL.js +0 -831
- package/dist/chunk-TTKBNBQF.js +0 -156
- package/dist/chunk-VB3XUR6A.js +0 -207
- package/dist/chunk-XCKINS7K.js +0 -57
- package/dist/chunk-Y6GKV7CU.js +0 -346
- package/dist/chunk-Y6GKV7CU.js.map +0 -1
- package/dist/chunk-Z2GQREJY.js +0 -159
- package/dist/chunk-ZDAVSTEE.js +0 -172
- package/dist/chunk-ZXCSOVS5.js +0 -191
- package/dist/claim-SVDCQ2AI.js +0 -197
- package/dist/claim-SVDCQ2AI.js.map +0 -1
- package/dist/companies-BYMYQK6A.js +0 -195
- package/dist/companies-BYMYQK6A.js.map +0 -1
- package/dist/complete-NEH3MWRI.js +0 -81
- package/dist/complete-NEH3MWRI.js.map +0 -1
- package/dist/connect-5PGL7ZOM.js +0 -42
- package/dist/conversation-CSOKJXDW.js +0 -93
- package/dist/conversation-CSOKJXDW.js.map +0 -1
- package/dist/conversions-4JOTTFEH.js +0 -135
- package/dist/conversions-4JOTTFEH.js.map +0 -1
- package/dist/create-2XYMBULY.js +0 -207
- package/dist/create-2XYMBULY.js.map +0 -1
- package/dist/create-56PTZABQ.js +0 -235
- package/dist/create-56PTZABQ.js.map +0 -1
- package/dist/create-D6S6TGWY.js +0 -59
- package/dist/create-D6S6TGWY.js.map +0 -1
- package/dist/create-SMW4O5PC.js +0 -132
- package/dist/create-SMW4O5PC.js.map +0 -1
- package/dist/creatives-OO76DAFS.js +0 -58
- package/dist/creatives-VJUYWJL6.js +0 -182
- package/dist/creatives-VJUYWJL6.js.map +0 -1
- package/dist/credentials-2ONYUJW6.js +0 -287
- package/dist/credentials-2ONYUJW6.js.map +0 -1
- package/dist/critique-NDDFSGPE.js +0 -1458
- package/dist/critique-NDDFSGPE.js.map +0 -1
- package/dist/critique-YXZVMLZ4.js +0 -227
- package/dist/critique-YXZVMLZ4.js.map +0 -1
- package/dist/crm-Q6CEP5XV.js +0 -224
- package/dist/crm-Q6CEP5XV.js.map +0 -1
- package/dist/crm-WRONZYDH.js +0 -318
- package/dist/crm-WRONZYDH.js.map +0 -1
- package/dist/customers-2EFYSCU2.js +0 -56
- package/dist/delete-7WEVC3FS.js +0 -66
- package/dist/delete-7WEVC3FS.js.map +0 -1
- package/dist/delete-RBWK255M.js +0 -54
- package/dist/delete-RBWK255M.js.map +0 -1
- package/dist/delete-VN4WWMQF.js +0 -64
- package/dist/delete-VN4WWMQF.js.map +0 -1
- package/dist/demographics-I5XZ435C.js +0 -138
- package/dist/demographics-I5XZ435C.js.map +0 -1
- package/dist/discard-XJLIXTNM.js +0 -66
- package/dist/discard-XJLIXTNM.js.map +0 -1
- package/dist/domain-M7AEGAYI.js +0 -98
- package/dist/domain-M7AEGAYI.js.map +0 -1
- package/dist/draft-5DQI4W5F.js +0 -306
- package/dist/draft-5DQI4W5F.js.map +0 -1
- package/dist/draft-7IIYHSY2.js +0 -332
- package/dist/draft-7IIYHSY2.js.map +0 -1
- package/dist/draft-CN6GKVBF.js +0 -217
- package/dist/draft-CN6GKVBF.js.map +0 -1
- package/dist/experiment-IDDWRCJ7.js +0 -1397
- package/dist/facets-ZLZ6LIHN.js +0 -114
- package/dist/facets-ZLZ6LIHN.js.map +0 -1
- package/dist/feedback-7LEX2P5Q.js +0 -106
- package/dist/feedback-7LEX2P5Q.js.map +0 -1
- package/dist/feedback-record-P4JJ63KA.js +0 -260
- package/dist/feedback-record-P4JJ63KA.js.map +0 -1
- package/dist/fetch-MIVCEHXZ.js +0 -176
- package/dist/fetch-MIVCEHXZ.js.map +0 -1
- package/dist/find-VHN34MWL.js +0 -134
- package/dist/fit-SS6HSZPU.js +0 -62
- package/dist/flows-UTIIHDNE.js +0 -247
- package/dist/flows-UTIIHDNE.js.map +0 -1
- package/dist/fonts-YPNN7ZJP.js +0 -36
- package/dist/forecast-OBSHG2GJ.js +0 -118
- package/dist/forecast-OBSHG2GJ.js.map +0 -1
- package/dist/funnel-Z2VLXUEQ.js +0 -394
- package/dist/funnel-Z2VLXUEQ.js.map +0 -1
- package/dist/ga4-ZPAEF2G2.js +0 -55
- package/dist/get-MDAO6I7T.js +0 -56
- package/dist/get-MDAO6I7T.js.map +0 -1
- package/dist/get-ZB553BSH.js +0 -79
- package/dist/get-ZB553BSH.js.map +0 -1
- package/dist/google-C3X7O2UO.js +0 -136
- package/dist/google-ads-FTWL772L.js +0 -195
- package/dist/google-ads-FTWL772L.js.map +0 -1
- package/dist/gsc-SDDHGTZK.js +0 -30
- package/dist/history-WKJYKDMG.js +0 -133
- package/dist/history-WKJYKDMG.js.map +0 -1
- package/dist/hubspot-EPHVEPOO.js +0 -779
- package/dist/hubspot-EPHVEPOO.js.map +0 -1
- package/dist/icon-MYPDC6FM.js +0 -137
- package/dist/ideas-3PBH7VEX.js +0 -40
- package/dist/images-J35C3WG4.js +0 -92
- package/dist/ingest-5QOPUKFE.js +0 -107
- package/dist/ingest-5QOPUKFE.js.map +0 -1
- package/dist/ingest-OKUYP632.js +0 -23
- package/dist/inspect-PMNCP6MV.js +0 -189
- package/dist/inspect-PMNCP6MV.js.map +0 -1
- package/dist/inspiration-QAL7NS7G.js +0 -53
- package/dist/keyword-metrics-R752SJIT.js +0 -197
- package/dist/keyword-metrics-R752SJIT.js.map +0 -1
- package/dist/keywords-for-site-7UWPJYQF.js +0 -128
- package/dist/keywords-for-site-7UWPJYQF.js.map +0 -1
- package/dist/landing-CBVIOGJ5.js +0 -28
- package/dist/leads-LIJS6Y5W.js +0 -90
- package/dist/leads-LIJS6Y5W.js.map +0 -1
- package/dist/learn-N6QV7GXA.js +0 -204
- package/dist/learn-N6QV7GXA.js.map +0 -1
- package/dist/line-item-writes-3WPJXKIL.js +0 -208
- package/dist/line-item-writes-3WPJXKIL.js.map +0 -1
- package/dist/line-items-ZOFKOGAA.js +0 -103
- package/dist/link-DDRQKOUL.js +0 -64
- package/dist/link-DDRQKOUL.js.map +0 -1
- package/dist/linkedin-UWZCF66X.js +0 -1057
- package/dist/linkedin-UWZCF66X.js.map +0 -1
- package/dist/list-5PLXVPLB.js +0 -151
- package/dist/list-5PLXVPLB.js.map +0 -1
- package/dist/list-RC2NX6AX.js +0 -50
- package/dist/list-VSJISE7U.js +0 -303
- package/dist/list-VSJISE7U.js.map +0 -1
- package/dist/list-WTVOBQYX.js +0 -64
- package/dist/list-WTVOBQYX.js.map +0 -1
- package/dist/log-YKKPROLZ.js +0 -92
- package/dist/log-YKKPROLZ.js.map +0 -1
- package/dist/logo-WE2UELX6.js +0 -18
- package/dist/make-RNOWBLZQ.js +0 -1353
- package/dist/make-RNOWBLZQ.js.map +0 -1
- package/dist/map-WTDPQLVO.js +0 -433
- package/dist/map-WTDPQLVO.js.map +0 -1
- package/dist/mcp-XJNSCPP3.js +0 -714
- package/dist/mcp-XJNSCPP3.js.map +0 -1
- package/dist/media-sources-JGBDDXZ5.js +0 -32
- package/dist/media-sources-JGBDDXZ5.js.map +0 -1
- package/dist/members-O3BTMRXX.js +0 -44
- package/dist/members-O3BTMRXX.js.map +0 -1
- package/dist/normalize-R5AYLA2J.js +0 -141
- package/dist/normalize-R5AYLA2J.js.map +0 -1
- package/dist/options-AILRY7JY.js +0 -122
- package/dist/options-AILRY7JY.js.map +0 -1
- package/dist/organization-KJJXZLVK.js +0 -946
- package/dist/organization-KJJXZLVK.js.map +0 -1
- package/dist/performance-7YU4HOGH.js +0 -24
- package/dist/plan-ZC4JY4IG.js +0 -207
- package/dist/promoted-tweet-writes-TNELWPVG.js +0 -180
- package/dist/promoted-tweet-writes-TNELWPVG.js.map +0 -1
- package/dist/promoted-tweets-76WKUFJQ.js +0 -119
- package/dist/publish-BKLHCKHB.js +0 -341
- package/dist/publish-BKLHCKHB.js.map +0 -1
- package/dist/reddit-YK3YUZEI.js +0 -26
- package/dist/refresh-WIII7KXB.js +0 -94
- package/dist/refresh-WIII7KXB.js.map +0 -1
- package/dist/release-ZHXYQI7G.js +0 -60
- package/dist/release-ZHXYQI7G.js.map +0 -1
- package/dist/remove-NOX4BXWK.js +0 -50
- package/dist/remove-NOX4BXWK.js.map +0 -1
- package/dist/remove-VLWRCOEZ.js +0 -48
- package/dist/remove-VLWRCOEZ.js.map +0 -1
- package/dist/reopen-NLWKK5HB.js +0 -63
- package/dist/reopen-NLWKK5HB.js.map +0 -1
- package/dist/rerun-DZWQNMZQ.js +0 -90
- package/dist/rerun-DZWQNMZQ.js.map +0 -1
- package/dist/research-Q3P76RHN.js +0 -62
- package/dist/research-UDZBCDNX.js +0 -262
- package/dist/research-UDZBCDNX.js.map +0 -1
- package/dist/reset-5UHFX7QY.js +0 -54
- package/dist/reset-5UHFX7QY.js.map +0 -1
- package/dist/reset-MTRJQUP7.js +0 -54
- package/dist/reset-MTRJQUP7.js.map +0 -1
- package/dist/resolve-DA72VT7Q.js +0 -121
- package/dist/resolve-DA72VT7Q.js.map +0 -1
- package/dist/retry-LQUBX5TK.js +0 -62
- package/dist/retry-LQUBX5TK.js.map +0 -1
- package/dist/retry-U6F4CS6O.js +0 -60
- package/dist/retry-U6F4CS6O.js.map +0 -1
- package/dist/rules-VS5PZ7VO.js +0 -96
- package/dist/rules-VS5PZ7VO.js.map +0 -1
- package/dist/rules-add-LMVZYDXE.js +0 -462
- package/dist/rules-add-LMVZYDXE.js.map +0 -1
- package/dist/run-6PRA2YSD.js +0 -65
- package/dist/run-R6COFNOR.js +0 -66
- package/dist/run-R6COFNOR.js.map +0 -1
- package/dist/scaffold-ad-3OVJ7VZQ.js +0 -1511
- package/dist/scaffold-ad-3OVJ7VZQ.js.map +0 -1
- package/dist/scaffold-static-ad-DDRA3Q5I.js +0 -1005
- package/dist/scaffold-static-ad-DDRA3Q5I.js.map +0 -1
- package/dist/scaffold-video-3JZYFYFU.js +0 -883
- package/dist/scaffold-video-3JZYFYFU.js.map +0 -1
- package/dist/schedule-BRSYHMKR.js +0 -66
- package/dist/schedule-BRSYHMKR.js.map +0 -1
- package/dist/schedule-ED2YDUPY.js +0 -61
- package/dist/schedule-ED2YDUPY.js.map +0 -1
- package/dist/scheduled-agents-5P67MVGX.js +0 -50
- package/dist/schema-4XVKERSA.js +0 -132
- package/dist/schema-4XVKERSA.js.map +0 -1
- package/dist/schema-RRAQW3OS.js +0 -69
- package/dist/search-Y2UMIQ57.js +0 -174
- package/dist/search-Y2UMIQ57.js.map +0 -1
- package/dist/select-OZ4E6VLF.js +0 -101
- package/dist/select-OZ4E6VLF.js.map +0 -1
- package/dist/set-prompt-O4YAE4CE.js +0 -193
- package/dist/set-prompt-O4YAE4CE.js.map +0 -1
- package/dist/setup-links-2GJYCV2A.js +0 -141
- package/dist/setup-links-2GJYCV2A.js.map +0 -1
- package/dist/site-47B6V2UX.js +0 -177
- package/dist/site-47B6V2UX.js.map +0 -1
- package/dist/sources-DXPZAPQ7.js +0 -454
- package/dist/sources-DXPZAPQ7.js.map +0 -1
- package/dist/sources-NDXYTASG.js +0 -30
- package/dist/stale-VLVBO2L6.js +0 -71
- package/dist/stale-VLVBO2L6.js.map +0 -1
- package/dist/stats-37OFAMPW.js +0 -34
- package/dist/status-4ODD46XY.js +0 -62
- package/dist/status-4ODD46XY.js.map +0 -1
- package/dist/stock-6R5E7MJX.js +0 -179
- package/dist/studio-LEIGL3Q7.js +0 -49
- package/dist/sync-EKGEWE53.js +0 -54
- package/dist/sync-EKGEWE53.js.map +0 -1
- package/dist/sync-TKNVBUDM.js +0 -54
- package/dist/sync-TKNVBUDM.js.map +0 -1
- package/dist/sync-definition-M5R3H3TP.js +0 -64
- package/dist/tag-manager-3Q55PBEW.js +0 -43
- package/dist/tags-4N5UUUN6.js +0 -26
- package/dist/tags-5NHIAD5A.js +0 -20
- package/dist/tags-5NHIAD5A.js.map +0 -1
- package/dist/tags-UUKWSWCN.js +0 -20
- package/dist/tags-UUKWSWCN.js.map +0 -1
- package/dist/tags-VK7B5DJF.js +0 -20
- package/dist/tags-VK7B5DJF.js.map +0 -1
- package/dist/tags-XAHIB3WA.js +0 -224
- package/dist/tags-XAHIB3WA.js.map +0 -1
- package/dist/targeting-criteria-AVARWV2G.js +0 -113
- package/dist/targets-6RYLQRID.js +0 -103
- package/dist/targets-6RYLQRID.js.map +0 -1
- package/dist/testimonials-6TF6BOFN.js +0 -32
- package/dist/top-companies-45EHRCJD.js +0 -108
- package/dist/top-companies-45EHRCJD.js.map +0 -1
- package/dist/translate-VHLBACCE.js +0 -604
- package/dist/translate-VHLBACCE.js.map +0 -1
- package/dist/triggers-ERQONJNO.js +0 -142
- package/dist/triggers-ERQONJNO.js.map +0 -1
- package/dist/unlink-TPDO6JNF.js +0 -67
- package/dist/unlink-TPDO6JNF.js.map +0 -1
- package/dist/unstage-YKKQQ7LW.js +0 -85
- package/dist/unstage-YKKQQ7LW.js.map +0 -1
- package/dist/update-43WU6X7R.js +0 -63
- package/dist/update-43WU6X7R.js.map +0 -1
- package/dist/update-CAHLAXWO.js +0 -98
- package/dist/update-CAHLAXWO.js.map +0 -1
- package/dist/update-NGH6YADN.js +0 -152
- package/dist/update-NGH6YADN.js.map +0 -1
- package/dist/update-SPJIHHLE.js +0 -188
- package/dist/update-SPJIHHLE.js.map +0 -1
- package/dist/upload-ACESIZIZ.js +0 -126
- package/dist/upload-ACESIZIZ.js.map +0 -1
- package/dist/url-params-MIXEDBF7.js +0 -98
- package/dist/url-params-MIXEDBF7.js.map +0 -1
- package/dist/validate-XJJA7ULE.js +0 -117
- package/dist/validate-XJJA7ULE.js.map +0 -1
- package/dist/videos-LBXPG7WC.js +0 -39
- package/dist/viewer-check-7VJ3GUZX.js +0 -80
- package/dist/web-EWQJC2SD.js +0 -140
- package/dist/web-EWQJC2SD.js.map +0 -1
- package/dist/winning-ads-SAOJAKEQ.js +0 -86
- package/dist/write-commands-QPDE4GWW.js +0 -1024
- package/dist/write-commands-QPDE4GWW.js.map +0 -1
- package/dist/x-LXOJPCRF.js +0 -47
- /package/dist/{actions-QL5UD2W4.js.map → actions-FMNJSOBA.js.map} +0 -0
- /package/dist/{ads-DHPJFU52.js.map → ads-OLXSDPD6.js.map} +0 -0
- /package/dist/{avatars-FKOO6VZ2.js.map → avatars-I4H3NMEJ.js.map} +0 -0
- /package/dist/{brand-NNWHBIAX.js.map → brand-3V7ECY7D.js.map} +0 -0
- /package/dist/{campaigns-HLBZRH5A.js.map → campaigns-MCB76NPQ.js.map} +0 -0
- /package/dist/{canvas-D64GLWUO.js.map → canvas-JCNKMGCG.js.map} +0 -0
- /package/dist/{chatgpt-YI6YNACI.js.map → chatgpt-XFZ42NXC.js.map} +0 -0
- /package/dist/{chunk-VB3XUR6A.js.map → chunk-2YTBPRRG.js.map} +0 -0
- /package/dist/{chunk-JUVVCA7B.js.map → chunk-3SNCMEJB.js.map} +0 -0
- /package/dist/{chunk-RGMKXNQP.js.map → chunk-7QGFO35A.js.map} +0 -0
- /package/dist/{chunk-ZXCSOVS5.js.map → chunk-AV7ALENU.js.map} +0 -0
- /package/dist/{chunk-IYTPWAN3.js.map → chunk-BRLFQ4VX.js.map} +0 -0
- /package/dist/{chunk-RZTKCCUL.js.map → chunk-DJE7UXYT.js.map} +0 -0
- /package/dist/{chunk-EW3JEKIV.js.map → chunk-EFWXYUSK.js.map} +0 -0
- /package/dist/{chunk-J3CWAERS.js.map → chunk-EONSZAZB.js.map} +0 -0
- /package/dist/{chunk-PHCIFBP3.js.map → chunk-FG3MV2XM.js.map} +0 -0
- /package/dist/{chunk-3AMLOCXY.js.map → chunk-FKG476GH.js.map} +0 -0
- /package/dist/{chunk-IFXGCI33.js.map → chunk-FUGQSIYG.js.map} +0 -0
- /package/dist/{chunk-Q3LXLWZY.js.map → chunk-HPLHAHG5.js.map} +0 -0
- /package/dist/{chunk-3N5A44NQ.js.map → chunk-I24YT2KG.js.map} +0 -0
- /package/dist/{chunk-P2MFWJR3.js.map → chunk-IFDZZOUC.js.map} +0 -0
- /package/dist/{chunk-Q5WBTVA7.js.map → chunk-JVVUI55M.js.map} +0 -0
- /package/dist/{chunk-6QGS3RQP.js.map → chunk-KKSHEPBY.js.map} +0 -0
- /package/dist/{chunk-OE3MIV4F.js.map → chunk-KQ7RCLGC.js.map} +0 -0
- /package/dist/{chunk-ZDAVSTEE.js.map → chunk-L7WMS5PW.js.map} +0 -0
- /package/dist/{chunk-FBFWMTOP.js.map → chunk-LBRO4MTL.js.map} +0 -0
- /package/dist/{chunk-PTUXBO5O.js.map → chunk-LNRPOULW.js.map} +0 -0
- /package/dist/{chunk-EMQUW6JB.js.map → chunk-LX6WC2XZ.js.map} +0 -0
- /package/dist/{chunk-I7J7YQXZ.js.map → chunk-MMGTJBM6.js.map} +0 -0
- /package/dist/{chunk-2KRK667G.js.map → chunk-OEZYSL3U.js.map} +0 -0
- /package/dist/{chunk-2TVXJPGR.js.map → chunk-OOVHBMQB.js.map} +0 -0
- /package/dist/{chunk-Z2GQREJY.js.map → chunk-PTH7VWKK.js.map} +0 -0
- /package/dist/{chunk-N3I6ZXR7.js.map → chunk-QZF4BVKL.js.map} +0 -0
- /package/dist/{chunk-3WAYZQNV.js.map → chunk-RITUSBYO.js.map} +0 -0
- /package/dist/{chunk-JH2L5CQD.js.map → chunk-SSTL3A7Z.js.map} +0 -0
- /package/dist/{chunk-2B772ZEA.js.map → chunk-TD4SO6TR.js.map} +0 -0
- /package/dist/{chunk-IKLHXGMF.js.map → chunk-UZ4RTOFG.js.map} +0 -0
- /package/dist/{chunk-NBO2NSAW.js.map → chunk-VAX7PFQV.js.map} +0 -0
- /package/dist/{chunk-AFD32O4A.js.map → chunk-VDRSZK4P.js.map} +0 -0
- /package/dist/{chunk-NKIBXOHT.js.map → chunk-VNU2EYD4.js.map} +0 -0
- /package/dist/{chunk-TTKBNBQF.js.map → chunk-WT4WDIXA.js.map} +0 -0
- /package/dist/{chunk-5A257KJA.js.map → chunk-XEX23CIB.js.map} +0 -0
- /package/dist/{chunk-GXGYTFZA.js.map → chunk-XXDF25BW.js.map} +0 -0
- /package/dist/{chunk-NEU5QD2C.js.map → chunk-YJ3LSFMX.js.map} +0 -0
- /package/dist/{chunk-MK6XJUCQ.js.map → chunk-YVK5RT3B.js.map} +0 -0
- /package/dist/{chunk-AW2GKIGS.js.map → chunk-YWWRLZUR.js.map} +0 -0
- /package/dist/{chunk-XCKINS7K.js.map → chunk-Z4S5BCVZ.js.map} +0 -0
- /package/dist/{chunk-IBY44U2M.js.map → chunk-ZYGK7GAK.js.map} +0 -0
- /package/dist/{connect-5PGL7ZOM.js.map → connect-COS6G45S.js.map} +0 -0
- /package/dist/{creatives-OO76DAFS.js.map → creatives-SEQHJD2M.js.map} +0 -0
- /package/dist/{customers-2EFYSCU2.js.map → customers-LMSX33FO.js.map} +0 -0
- /package/dist/{experiment-IDDWRCJ7.js.map → experiment-7RJ5X2LL.js.map} +0 -0
- /package/dist/{find-VHN34MWL.js.map → find-2EPXK5RF.js.map} +0 -0
- /package/dist/{fit-SS6HSZPU.js.map → fit-W7UNFZT5.js.map} +0 -0
- /package/dist/{fonts-YPNN7ZJP.js.map → fonts-N42UYWTX.js.map} +0 -0
- /package/dist/{ga4-ZPAEF2G2.js.map → ga4-6EIQC2TG.js.map} +0 -0
- /package/dist/{google-C3X7O2UO.js.map → google-O5OI6QFU.js.map} +0 -0
- /package/dist/{gsc-SDDHGTZK.js.map → gsc-BM3T2GDL.js.map} +0 -0
- /package/dist/{icon-MYPDC6FM.js.map → icon-B7DG53S5.js.map} +0 -0
- /package/dist/{ideas-3PBH7VEX.js.map → ideas-DYN2DMFN.js.map} +0 -0
- /package/dist/{images-J35C3WG4.js.map → images-EQCUXEHF.js.map} +0 -0
- /package/dist/{ingest-OKUYP632.js.map → ingest-B46AY3QU.js.map} +0 -0
- /package/dist/{inspiration-QAL7NS7G.js.map → inspiration-TCCKM4R7.js.map} +0 -0
- /package/dist/{landing-CBVIOGJ5.js.map → landing-WVPA7NBR.js.map} +0 -0
- /package/dist/{line-items-ZOFKOGAA.js.map → line-items-OEWYOPFP.js.map} +0 -0
- /package/dist/{list-RC2NX6AX.js.map → list-WRBWQASJ.js.map} +0 -0
- /package/dist/{logo-WE2UELX6.js.map → logo-QTSBKP2J.js.map} +0 -0
- /package/dist/{performance-7YU4HOGH.js.map → performance-HTU5FR2K.js.map} +0 -0
- /package/dist/{plan-ZC4JY4IG.js.map → plan-W2K45F7K.js.map} +0 -0
- /package/dist/{promoted-tweets-76WKUFJQ.js.map → promoted-tweets-TTWN5OMW.js.map} +0 -0
- /package/dist/{reddit-YK3YUZEI.js.map → reddit-6C3PT5CT.js.map} +0 -0
- /package/dist/{research-Q3P76RHN.js.map → research-YCMMQVK6.js.map} +0 -0
- /package/dist/{run-6PRA2YSD.js.map → run-SR7DJ7M5.js.map} +0 -0
- /package/dist/{scheduled-agents-5P67MVGX.js.map → scheduled-agents-N63EZNY6.js.map} +0 -0
- /package/dist/{schema-RRAQW3OS.js.map → schema-C6SGBNA6.js.map} +0 -0
- /package/dist/{sources-NDXYTASG.js.map → sources-HN3GCEDX.js.map} +0 -0
- /package/dist/{stats-37OFAMPW.js.map → stats-CVF6AC7R.js.map} +0 -0
- /package/dist/{stock-6R5E7MJX.js.map → stock-4LPQ6SM7.js.map} +0 -0
- /package/dist/{studio-LEIGL3Q7.js.map → studio-NZ6WQ7OE.js.map} +0 -0
- /package/dist/{sync-definition-M5R3H3TP.js.map → sync-definition-CKEUYKWN.js.map} +0 -0
- /package/dist/{tag-manager-3Q55PBEW.js.map → tag-manager-FLXXLNKP.js.map} +0 -0
- /package/dist/{tags-4N5UUUN6.js.map → tags-EUOOSAKN.js.map} +0 -0
- /package/dist/{targeting-criteria-AVARWV2G.js.map → targeting-criteria-HE7K52WN.js.map} +0 -0
- /package/dist/{testimonials-6TF6BOFN.js.map → testimonials-3Q5XM7JD.js.map} +0 -0
- /package/dist/{videos-LBXPG7WC.js.map → videos-WAPUPJVT.js.map} +0 -0
- /package/dist/{viewer-check-7VJ3GUZX.js.map → viewer-check-GHQA3UY2.js.map} +0 -0
- /package/dist/{winning-ads-SAOJAKEQ.js.map → winning-ads-XCVUAIOU.js.map} +0 -0
- /package/dist/{x-LXOJPCRF.js.map → x-SI4KYDEY.js.map} +0 -0
|
@@ -0,0 +1,1079 @@
|
|
|
1
|
+
import {
|
|
2
|
+
INGEST_MODES,
|
|
3
|
+
INGEST_MODE_HEADER
|
|
4
|
+
} from "./chunk-GRQ2AXDX.js";
|
|
5
|
+
import {
|
|
6
|
+
calendarDaySchema,
|
|
7
|
+
todayUtc,
|
|
8
|
+
windowTooLong
|
|
9
|
+
} from "./chunk-O37VU7FG.js";
|
|
10
|
+
|
|
11
|
+
// ../api/src/accounts/crm.ts
|
|
12
|
+
import { z } from "zod";
|
|
13
|
+
var CRM_DEAL_STATUSES = ["open", "won", "lost"];
|
|
14
|
+
var text = (max) => z.string().trim().max(max);
|
|
15
|
+
function needed(context, field, message) {
|
|
16
|
+
context.addIssue({ code: "custom", path: [field], message, params: { missing: true } });
|
|
17
|
+
}
|
|
18
|
+
var ISO_INSTANT = /^(\d{4}-\d{2}-\d{2})([T ]\d{2}:\d{2}(?::\d{2}(?:\.\d+)?)?)?(Z|[+-]\d{2}:?\d{2})?$/;
|
|
19
|
+
var instantSchema = z.string().transform((value, context) => {
|
|
20
|
+
const slashed = /^(\d{1,2})[/.](\d{1,2})[/.](\d{4})$/.exec(value);
|
|
21
|
+
if (slashed) {
|
|
22
|
+
const [, first, second, year] = slashed;
|
|
23
|
+
context.addIssue({
|
|
24
|
+
code: "custom",
|
|
25
|
+
message: `${value} could be either day first or month first \u2014 write it as ${year}-${second?.padStart(2, "0")}-${first?.padStart(2, "0")} or ${year}-${first?.padStart(2, "0")}-${second?.padStart(2, "0")}`
|
|
26
|
+
});
|
|
27
|
+
return z.NEVER;
|
|
28
|
+
}
|
|
29
|
+
const iso = ISO_INSTANT.exec(value);
|
|
30
|
+
const ms = iso ? Date.parse(`${iso[1]}${iso[2]?.replace(" ", "T") ?? "T00:00:00"}${iso[3] ?? "Z"}`) : Number.NaN;
|
|
31
|
+
if (!Number.isFinite(ms)) {
|
|
32
|
+
context.addIssue({ code: "custom", message: `${value} is not a date \u2014 use YYYY-MM-DD or an ISO 8601 time` });
|
|
33
|
+
return z.NEVER;
|
|
34
|
+
}
|
|
35
|
+
return new Date(ms).toISOString();
|
|
36
|
+
});
|
|
37
|
+
var amountSchema = z.union([z.number(), z.string().trim()]).transform((value, context) => {
|
|
38
|
+
const amount = typeof value === "number" ? value : Number(value);
|
|
39
|
+
if (!Number.isFinite(amount) || amount < 0 || typeof value === "string" && value === "") {
|
|
40
|
+
context.addIssue({ code: "custom", message: `${value} is not an amount \u2014 send a number like 12000.50` });
|
|
41
|
+
return z.NEVER;
|
|
42
|
+
}
|
|
43
|
+
return amount;
|
|
44
|
+
});
|
|
45
|
+
var companyFields = z.strictObject({
|
|
46
|
+
id: text(128).optional(),
|
|
47
|
+
name: text(300).optional(),
|
|
48
|
+
domain: text(253).optional(),
|
|
49
|
+
linkedinPage: text(300).optional(),
|
|
50
|
+
deleted: z.boolean().optional()
|
|
51
|
+
});
|
|
52
|
+
var companySchema = companyFields.superRefine((company, context) => {
|
|
53
|
+
if (company.id || company.domain || company.linkedinPage) return;
|
|
54
|
+
needed(context, "id", "needed \u2014 or the company's website or LinkedIn page, to know it by");
|
|
55
|
+
});
|
|
56
|
+
var dealFields = z.strictObject({
|
|
57
|
+
id: text(128).min(1),
|
|
58
|
+
companyId: text(128).optional(),
|
|
59
|
+
companyDomain: text(253).optional(),
|
|
60
|
+
/** The company's name, for a deal sent with `companyDomain` and no company of its own. */
|
|
61
|
+
companyName: text(300).optional(),
|
|
62
|
+
/** The company's LinkedIn page, likewise — the surest match of all. */
|
|
63
|
+
companyLinkedinPage: text(300).optional(),
|
|
64
|
+
name: text(300).optional(),
|
|
65
|
+
amount: amountSchema.nullable().optional(),
|
|
66
|
+
currency: z.string().trim().regex(/^[A-Za-z]{3}$/, "use a three-letter currency code like EUR").transform((code) => code.toUpperCase()).optional(),
|
|
67
|
+
pipeline: text(128).optional(),
|
|
68
|
+
stage: text(128).optional(),
|
|
69
|
+
status: z.enum(CRM_DEAL_STATUSES).optional(),
|
|
70
|
+
createdAt: instantSchema.optional(),
|
|
71
|
+
closedAt: instantSchema.nullable().optional(),
|
|
72
|
+
deleted: z.boolean().optional()
|
|
73
|
+
});
|
|
74
|
+
var dealSchema = dealFields.superRefine((deal, context) => {
|
|
75
|
+
if (deal.deleted === true) return;
|
|
76
|
+
if (deal.createdAt === void 0) needed(context, "createdAt", "needed \u2014 the day the deal was created");
|
|
77
|
+
if ((deal.status === "won" || deal.status === "lost") && !deal.closedAt) {
|
|
78
|
+
needed(context, "closedAt", "needed when status is won or lost");
|
|
79
|
+
}
|
|
80
|
+
});
|
|
81
|
+
var CRM_REJECTION_CODES = ["personal_data", "unknown_field", "missing_field", "invalid_field"];
|
|
82
|
+
var PERSON_FIELD = /e-?mail|phone|mobile|first_?name|last_?name|full_?name|contact|person|owner|address|birth/i;
|
|
83
|
+
var EMAIL_IN_TEXT = /[^\s@]+@[^\s@]+\.[^\s@]+/;
|
|
84
|
+
var FIELDS = {
|
|
85
|
+
company: Object.keys(companyFields.shape),
|
|
86
|
+
deal: Object.keys(dealFields.shape)
|
|
87
|
+
};
|
|
88
|
+
function personIn(raw) {
|
|
89
|
+
if (raw === null || typeof raw !== "object") return null;
|
|
90
|
+
for (const [field, value] of Object.entries(raw)) {
|
|
91
|
+
if (PERSON_FIELD.test(field)) return `${field} names a person \u2014 Baker takes companies and deals, never people`;
|
|
92
|
+
if (typeof value === "string" && EMAIL_IN_TEXT.test(value)) {
|
|
93
|
+
return `${field} holds an email address \u2014 Baker takes companies and deals, never people`;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
return null;
|
|
97
|
+
}
|
|
98
|
+
function issueMessage(issue) {
|
|
99
|
+
const field = issue.path.join(".");
|
|
100
|
+
return field === "" ? issue.message : `${field}: ${issue.message}`;
|
|
101
|
+
}
|
|
102
|
+
function rejectionFor(kind, issues) {
|
|
103
|
+
const unknown = issues.find((issue) => issue.code === "unrecognized_keys");
|
|
104
|
+
if (unknown && unknown.code === "unrecognized_keys") {
|
|
105
|
+
return {
|
|
106
|
+
code: "unknown_field",
|
|
107
|
+
message: `unknown field ${unknown.keys.join(", ")} \u2014 send only ${FIELDS[kind].join(", ")}`
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
const missing = issues.find(
|
|
111
|
+
(issue) => issue.code === "invalid_type" && issue.input === void 0 || issue.code === "custom" && issue.params?.missing === true
|
|
112
|
+
);
|
|
113
|
+
return {
|
|
114
|
+
code: missing ? "missing_field" : "invalid_field",
|
|
115
|
+
message: issues.map(issueMessage).join("; ")
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
function recordId(raw) {
|
|
119
|
+
const id = raw?.id;
|
|
120
|
+
return typeof id === "string" ? id : "";
|
|
121
|
+
}
|
|
122
|
+
function judgeRecord(kind, schema, raw, index, rejected) {
|
|
123
|
+
const base = { kind, index, id: recordId(raw) };
|
|
124
|
+
const person = personIn(raw);
|
|
125
|
+
if (person !== null) {
|
|
126
|
+
rejected.push({ ...base, code: "personal_data", message: person });
|
|
127
|
+
return null;
|
|
128
|
+
}
|
|
129
|
+
const parsed = schema.safeParse(raw);
|
|
130
|
+
if (!parsed.success) {
|
|
131
|
+
rejected.push({ ...base, ...rejectionFor(kind, parsed.error.issues) });
|
|
132
|
+
return null;
|
|
133
|
+
}
|
|
134
|
+
return parsed.data;
|
|
135
|
+
}
|
|
136
|
+
function judgeCrmBatch(batch) {
|
|
137
|
+
const judged = { companies: [], deals: [], rejected: [] };
|
|
138
|
+
(batch.companies ?? []).forEach((raw, index) => {
|
|
139
|
+
const company = judgeRecord("company", companySchema, raw, index, judged.rejected);
|
|
140
|
+
if (company === null) return;
|
|
141
|
+
judged.companies.push({
|
|
142
|
+
id: company.id ?? "",
|
|
143
|
+
name: company.name ?? "",
|
|
144
|
+
domain: company.domain ?? "",
|
|
145
|
+
linkedinPage: company.linkedinPage ?? "",
|
|
146
|
+
deleted: company.deleted === true
|
|
147
|
+
});
|
|
148
|
+
});
|
|
149
|
+
(batch.deals ?? []).forEach((raw, index) => {
|
|
150
|
+
const deal = judgeRecord("deal", dealSchema, raw, index, judged.rejected);
|
|
151
|
+
if (deal === null) return;
|
|
152
|
+
judged.deals.push({
|
|
153
|
+
id: deal.id,
|
|
154
|
+
companyId: deal.companyId ?? "",
|
|
155
|
+
companyDomain: deal.companyDomain ?? "",
|
|
156
|
+
companyName: deal.companyName ?? "",
|
|
157
|
+
companyLinkedinPage: deal.companyLinkedinPage ?? "",
|
|
158
|
+
name: deal.name ?? "",
|
|
159
|
+
amount: deal.amount ?? null,
|
|
160
|
+
currency: deal.currency ?? "",
|
|
161
|
+
pipeline: deal.pipeline ?? "",
|
|
162
|
+
stage: deal.stage ?? "",
|
|
163
|
+
status: deal.status ?? null,
|
|
164
|
+
createdAt: deal.createdAt ?? null,
|
|
165
|
+
closedAt: deal.closedAt ?? null,
|
|
166
|
+
deleted: deal.deleted === true
|
|
167
|
+
});
|
|
168
|
+
});
|
|
169
|
+
return judged;
|
|
170
|
+
}
|
|
171
|
+
function sheetDelimiter(text2) {
|
|
172
|
+
const header = text2.split(/\r?\n/, 1)[0] ?? "";
|
|
173
|
+
const count = (mark) => header.split(mark).length - 1;
|
|
174
|
+
return [",", ";", " "].reduce((best, mark) => count(mark) > count(best) ? mark : best, ",");
|
|
175
|
+
}
|
|
176
|
+
function sheetAmount(cell) {
|
|
177
|
+
if (/^-?\d+(\.\d+)?e[+-]?\d+$/i.test(cell)) return cell;
|
|
178
|
+
const compact = cell.replace(/[\s\u00a0]/g, "").replace(/[^\d.,-]/g, "");
|
|
179
|
+
const decimal = /[.,](\d{1,2}|\d{4,})$/.exec(compact);
|
|
180
|
+
if (!decimal) return compact.replace(/[.,]/g, "");
|
|
181
|
+
const whole = compact.slice(0, decimal.index).replace(/[.,]/g, "");
|
|
182
|
+
return `${whole}.${decimal[1]}`;
|
|
183
|
+
}
|
|
184
|
+
var CRM_SHEET_COLUMNS = {
|
|
185
|
+
deals: [
|
|
186
|
+
{
|
|
187
|
+
header: "Deal ID",
|
|
188
|
+
field: "id",
|
|
189
|
+
need: "required",
|
|
190
|
+
takes: "Your CRM's id for the deal. The same id again updates the row instead of adding one.",
|
|
191
|
+
example: "deal-001",
|
|
192
|
+
example2: "deal-002"
|
|
193
|
+
},
|
|
194
|
+
{
|
|
195
|
+
header: "Created date",
|
|
196
|
+
field: "createdAt",
|
|
197
|
+
need: "required",
|
|
198
|
+
takes: "The day the deal was created, like 2026-06-15. It dates the deal as pipeline.",
|
|
199
|
+
example: "2026-06-15",
|
|
200
|
+
example2: "2026-02-01"
|
|
201
|
+
},
|
|
202
|
+
{
|
|
203
|
+
header: "Website",
|
|
204
|
+
field: "companyDomain",
|
|
205
|
+
need: "required",
|
|
206
|
+
takes: "The website of the deal's company, like acme.com. It is how Baker finds the company among those your ads reached.",
|
|
207
|
+
note: "or Company LinkedIn",
|
|
208
|
+
example: "acme.com",
|
|
209
|
+
example2: "globex.com"
|
|
210
|
+
},
|
|
211
|
+
{
|
|
212
|
+
header: "Amount",
|
|
213
|
+
field: "amount",
|
|
214
|
+
need: "recommended",
|
|
215
|
+
takes: "The deal's value, like 24000. Without it the deal counts but adds no value.",
|
|
216
|
+
example: "24000",
|
|
217
|
+
example2: "8000"
|
|
218
|
+
},
|
|
219
|
+
{
|
|
220
|
+
header: "Currency",
|
|
221
|
+
field: "currency",
|
|
222
|
+
need: "recommended",
|
|
223
|
+
takes: "Three letters: EUR, USD, GBP\u2026",
|
|
224
|
+
example: "EUR",
|
|
225
|
+
example2: "EUR"
|
|
226
|
+
},
|
|
227
|
+
{
|
|
228
|
+
header: "Status",
|
|
229
|
+
field: "status",
|
|
230
|
+
need: "recommended",
|
|
231
|
+
takes: "open, won or lost. Without it, you choose which stages mean won and lost.",
|
|
232
|
+
example: "open",
|
|
233
|
+
example2: "won"
|
|
234
|
+
},
|
|
235
|
+
{
|
|
236
|
+
header: "Close date",
|
|
237
|
+
field: "closedAt",
|
|
238
|
+
need: "recommended",
|
|
239
|
+
takes: "The day it was won or lost. Needed once Status is won or lost.",
|
|
240
|
+
example: "",
|
|
241
|
+
example2: "2026-04-20"
|
|
242
|
+
},
|
|
243
|
+
{
|
|
244
|
+
header: "Company",
|
|
245
|
+
field: "companyName",
|
|
246
|
+
need: "optional",
|
|
247
|
+
takes: "The company's name, as the Accounts screen shows it.",
|
|
248
|
+
example: "Acme Inc",
|
|
249
|
+
example2: "Globex"
|
|
250
|
+
},
|
|
251
|
+
{
|
|
252
|
+
header: "Company LinkedIn",
|
|
253
|
+
field: "companyLinkedinPage",
|
|
254
|
+
need: "optional",
|
|
255
|
+
takes: "The company's LinkedIn page. The surest match of all, and enough without a Website.",
|
|
256
|
+
example: "https://www.linkedin.com/company/acme-inc",
|
|
257
|
+
example2: ""
|
|
258
|
+
},
|
|
259
|
+
{
|
|
260
|
+
header: "Deal name",
|
|
261
|
+
field: "name",
|
|
262
|
+
need: "optional",
|
|
263
|
+
takes: "The deal's name.",
|
|
264
|
+
example: "Acme annual plan",
|
|
265
|
+
example2: "Globex pilot"
|
|
266
|
+
},
|
|
267
|
+
{
|
|
268
|
+
header: "Pipeline",
|
|
269
|
+
field: "pipeline",
|
|
270
|
+
need: "optional",
|
|
271
|
+
takes: "Its pipeline, if you use several.",
|
|
272
|
+
example: "Sales",
|
|
273
|
+
example2: "Sales"
|
|
274
|
+
},
|
|
275
|
+
{
|
|
276
|
+
header: "Stage",
|
|
277
|
+
field: "stage",
|
|
278
|
+
need: "optional",
|
|
279
|
+
takes: "Its stage.",
|
|
280
|
+
example: "Proposal",
|
|
281
|
+
example2: "Closed Won"
|
|
282
|
+
}
|
|
283
|
+
],
|
|
284
|
+
companies: [
|
|
285
|
+
{
|
|
286
|
+
header: "Website",
|
|
287
|
+
field: "domain",
|
|
288
|
+
need: "required",
|
|
289
|
+
takes: "The company's website, like acme.com. It is how Baker finds the company among those your ads reached.",
|
|
290
|
+
note: "or LinkedIn page",
|
|
291
|
+
example: "acme.com",
|
|
292
|
+
example2: "globex.com"
|
|
293
|
+
},
|
|
294
|
+
{
|
|
295
|
+
header: "Company name",
|
|
296
|
+
field: "name",
|
|
297
|
+
need: "recommended",
|
|
298
|
+
takes: "The company's name, as the Accounts screen shows it.",
|
|
299
|
+
example: "Acme Inc",
|
|
300
|
+
example2: "Globex"
|
|
301
|
+
},
|
|
302
|
+
{
|
|
303
|
+
header: "LinkedIn page",
|
|
304
|
+
field: "linkedinPage",
|
|
305
|
+
need: "optional",
|
|
306
|
+
takes: "The company's LinkedIn page. The surest match of all, and enough without a Website.",
|
|
307
|
+
example: "https://www.linkedin.com/company/acme-inc",
|
|
308
|
+
example2: ""
|
|
309
|
+
},
|
|
310
|
+
{
|
|
311
|
+
header: "Company ID",
|
|
312
|
+
field: "id",
|
|
313
|
+
need: "optional",
|
|
314
|
+
takes: "Your CRM's id for the company. Only needed when your deals name their company by this id.",
|
|
315
|
+
example: "acct-001",
|
|
316
|
+
example2: ""
|
|
317
|
+
}
|
|
318
|
+
]
|
|
319
|
+
};
|
|
320
|
+
function sheetTemplate(columns) {
|
|
321
|
+
return [
|
|
322
|
+
columns.map((column) => column.header).join(","),
|
|
323
|
+
columns.map((column) => column.example).join(","),
|
|
324
|
+
columns.map((column) => column.example2 ?? "").join(","),
|
|
325
|
+
""
|
|
326
|
+
].join("\n");
|
|
327
|
+
}
|
|
328
|
+
var CRM_SHEET_TEMPLATE = sheetTemplate(CRM_SHEET_COLUMNS.deals);
|
|
329
|
+
var CRM_COMPANY_SHEET_TEMPLATE = sheetTemplate(CRM_SHEET_COLUMNS.companies);
|
|
330
|
+
var DATE_FIELDS = /* @__PURE__ */ new Set(["createdAt", "closedAt"]);
|
|
331
|
+
var SLASHED_DAY = /^(\d{1,2})[/.](\d{1,2})[/.](\d{4})$/;
|
|
332
|
+
var SHEET_EPOCH_MS = Date.UTC(1899, 11, 30);
|
|
333
|
+
var DAY_MS = 864e5;
|
|
334
|
+
function slashOrder(cells) {
|
|
335
|
+
for (const cell of cells) {
|
|
336
|
+
const parts = SLASHED_DAY.exec(cell);
|
|
337
|
+
if (!parts) continue;
|
|
338
|
+
if (Number(parts[1]) > 12) return "dmy";
|
|
339
|
+
if (Number(parts[2]) > 12) return "mdy";
|
|
340
|
+
}
|
|
341
|
+
return null;
|
|
342
|
+
}
|
|
343
|
+
function sheetDate(cell, order) {
|
|
344
|
+
if (/^\d{5}(\.\d+)?$/.test(cell)) {
|
|
345
|
+
return new Date(SHEET_EPOCH_MS + Math.round(Number(cell) * DAY_MS)).toISOString().slice(0, 10);
|
|
346
|
+
}
|
|
347
|
+
const parts = SLASHED_DAY.exec(cell);
|
|
348
|
+
if (!parts || order === null) return cell;
|
|
349
|
+
const [, first = "", second = "", year] = parts;
|
|
350
|
+
const [day, month] = order === "dmy" ? [first, second] : [second, first];
|
|
351
|
+
return `${year}-${month.padStart(2, "0")}-${day.padStart(2, "0")}`;
|
|
352
|
+
}
|
|
353
|
+
function sheetCell(field, cell, order) {
|
|
354
|
+
if (field === "amount") return sheetAmount(cell);
|
|
355
|
+
if (field === "status") return cell.toLowerCase();
|
|
356
|
+
if (DATE_FIELDS.has(field)) return sheetDate(cell, order);
|
|
357
|
+
return cell;
|
|
358
|
+
}
|
|
359
|
+
function sheetRecords(rows, columns) {
|
|
360
|
+
const cells = (field) => rows.flatMap(
|
|
361
|
+
(row) => Object.entries(row).filter(([column]) => columns[column] === field).map(([, cell]) => String(cell ?? "").trim())
|
|
362
|
+
);
|
|
363
|
+
const order = slashOrder([...DATE_FIELDS].flatMap(cells));
|
|
364
|
+
return rows.map((row) => {
|
|
365
|
+
const record = {};
|
|
366
|
+
for (const [column, raw] of Object.entries(row)) {
|
|
367
|
+
const field = columns[column];
|
|
368
|
+
const cell = String(raw ?? "").trim();
|
|
369
|
+
if (field === void 0 || cell === "" || record[field] !== void 0) continue;
|
|
370
|
+
record[field] = sheetCell(field, cell, order);
|
|
371
|
+
}
|
|
372
|
+
return record;
|
|
373
|
+
});
|
|
374
|
+
}
|
|
375
|
+
function sheetHeaders(rows) {
|
|
376
|
+
return [...new Set(rows.flatMap((row) => Object.keys(row)))];
|
|
377
|
+
}
|
|
378
|
+
var CRM_COLUMN_FIELDS = [
|
|
379
|
+
"id",
|
|
380
|
+
"name",
|
|
381
|
+
"companyId",
|
|
382
|
+
"companyName",
|
|
383
|
+
"companyDomain",
|
|
384
|
+
"companyLinkedinPage",
|
|
385
|
+
"amount",
|
|
386
|
+
"currency",
|
|
387
|
+
"pipeline",
|
|
388
|
+
"stage",
|
|
389
|
+
"status",
|
|
390
|
+
"createdAt",
|
|
391
|
+
"closedAt"
|
|
392
|
+
];
|
|
393
|
+
var COMPANY_AS_DEAL = {
|
|
394
|
+
id: "companyId",
|
|
395
|
+
name: "companyName",
|
|
396
|
+
domain: "companyDomain",
|
|
397
|
+
linkedinPage: "companyLinkedinPage"
|
|
398
|
+
};
|
|
399
|
+
var COMPANY_FIELD = {
|
|
400
|
+
companyId: "id",
|
|
401
|
+
companyName: "name",
|
|
402
|
+
companyDomain: "domain",
|
|
403
|
+
companyLinkedinPage: "linkedinPage"
|
|
404
|
+
};
|
|
405
|
+
var DEAL_ONLY = /* @__PURE__ */ new Set([
|
|
406
|
+
"id",
|
|
407
|
+
"name",
|
|
408
|
+
"amount",
|
|
409
|
+
"pipeline",
|
|
410
|
+
"stage",
|
|
411
|
+
"status",
|
|
412
|
+
"closedAt"
|
|
413
|
+
]);
|
|
414
|
+
var headerKey = (header) => header.toLowerCase().replace(/[^\p{L}\p{N}]/gu, "");
|
|
415
|
+
var SHARED_NAMES = /* @__PURE__ */ new Set(["id", "name"]);
|
|
416
|
+
var isSharedName = (header) => SHARED_NAMES.has(headerKey(header));
|
|
417
|
+
var EXACT = new Map([
|
|
418
|
+
...CRM_COLUMN_FIELDS.map((field) => [headerKey(field), field]),
|
|
419
|
+
[headerKey("domain"), "companyDomain"],
|
|
420
|
+
[headerKey("linkedinPage"), "companyLinkedinPage"],
|
|
421
|
+
...CRM_SHEET_COLUMNS.deals.map((column) => [headerKey(column.header), column.field]),
|
|
422
|
+
...CRM_SHEET_COLUMNS.companies.map((column) => [
|
|
423
|
+
headerKey(column.header),
|
|
424
|
+
COMPANY_AS_DEAL[column.field]
|
|
425
|
+
])
|
|
426
|
+
]);
|
|
427
|
+
function exactCrmColumns(headers) {
|
|
428
|
+
const meanings = {};
|
|
429
|
+
for (const header of headers) {
|
|
430
|
+
const field = EXACT.get(headerKey(header));
|
|
431
|
+
if (field !== void 0) meanings[header] = field;
|
|
432
|
+
}
|
|
433
|
+
return meanings;
|
|
434
|
+
}
|
|
435
|
+
function crmColumnReading(meanings, kind) {
|
|
436
|
+
const entries = Object.entries(meanings);
|
|
437
|
+
const read = kind ?? (entries.some(([header, field]) => DEAL_ONLY.has(field) && !isSharedName(header)) ? "deals" : "companies");
|
|
438
|
+
const columns = {};
|
|
439
|
+
for (const [header, field] of entries) {
|
|
440
|
+
const target = read === "deals" ? field : isSharedName(header) ? field : COMPANY_FIELD[field];
|
|
441
|
+
if (target !== void 0) columns[header] = target;
|
|
442
|
+
}
|
|
443
|
+
return { kind: read, columns };
|
|
444
|
+
}
|
|
445
|
+
function crmBatchFromSheet(rows, reading) {
|
|
446
|
+
const headers = sheetHeaders(rows);
|
|
447
|
+
const { kind, columns } = typeof reading === "object" ? reading : crmColumnReading(exactCrmColumns(headers), reading);
|
|
448
|
+
const records = sheetRecords(rows, columns);
|
|
449
|
+
return {
|
|
450
|
+
kind,
|
|
451
|
+
batch: kind === "deals" ? { deals: records } : { companies: records },
|
|
452
|
+
ignoredColumns: headers.filter((header) => columns[header] === void 0)
|
|
453
|
+
};
|
|
454
|
+
}
|
|
455
|
+
var CRM_PUSH_PATH = "/v1/accounts/crm";
|
|
456
|
+
var CRM_PUSH_BATCH_MAX = 500;
|
|
457
|
+
function crmPushUrl(brandedUrl, convexSiteUrl) {
|
|
458
|
+
return `${(brandedUrl || convexSiteUrl).replace(/\/$/, "")}${CRM_PUSH_PATH}`;
|
|
459
|
+
}
|
|
460
|
+
var crmPushRequestSchema = z.strictObject({
|
|
461
|
+
companies: z.array(z.unknown()).optional(),
|
|
462
|
+
deals: z.array(z.unknown()).optional()
|
|
463
|
+
}).refine((body) => (body.companies?.length ?? 0) + (body.deals?.length ?? 0) > 0, {
|
|
464
|
+
message: "send at least one company or deal"
|
|
465
|
+
}).refine((body) => (body.companies?.length ?? 0) + (body.deals?.length ?? 0) <= CRM_PUSH_BATCH_MAX, {
|
|
466
|
+
message: `at most ${CRM_PUSH_BATCH_MAX} companies and deals per request \u2014 split the batch`
|
|
467
|
+
});
|
|
468
|
+
var crmRejectionSchema = z.object({
|
|
469
|
+
kind: z.enum(["company", "deal"]),
|
|
470
|
+
index: z.number().int().nonnegative(),
|
|
471
|
+
id: z.string(),
|
|
472
|
+
code: z.enum(CRM_REJECTION_CODES),
|
|
473
|
+
message: z.string()
|
|
474
|
+
});
|
|
475
|
+
var crmPushResponseSchema = z.object({
|
|
476
|
+
/** Echoed from `X-Baker-Mode`: a `test` request is judged in full and stores nothing. */
|
|
477
|
+
mode: z.enum(INGEST_MODES),
|
|
478
|
+
received: z.object({ companies: z.number().int(), deals: z.number().int() }),
|
|
479
|
+
/** Passed the checks: stored in a live send, only judged in a test. */
|
|
480
|
+
accepted: z.object({ companies: z.number().int(), deals: z.number().int() }),
|
|
481
|
+
deleted: z.object({ companies: z.number().int(), deals: z.number().int() }),
|
|
482
|
+
rejected: z.array(crmRejectionSchema)
|
|
483
|
+
});
|
|
484
|
+
var crmContentsSchema = z.object({
|
|
485
|
+
companies: z.number().int(),
|
|
486
|
+
deals: z.number().int(),
|
|
487
|
+
stages: z.array(
|
|
488
|
+
z.object({
|
|
489
|
+
pipeline: z.string(),
|
|
490
|
+
stage: z.string(),
|
|
491
|
+
deals: z.number().int(),
|
|
492
|
+
/** Sent as `status: won`. */
|
|
493
|
+
won: z.number().int(),
|
|
494
|
+
/** Sent as `status: lost`. */
|
|
495
|
+
lost: z.number().int()
|
|
496
|
+
})
|
|
497
|
+
)
|
|
498
|
+
});
|
|
499
|
+
var CRM_SEND_VIAS = ["api", "upload", "sheet"];
|
|
500
|
+
var crmPushSummarySchema = z.object({
|
|
501
|
+
at: z.number(),
|
|
502
|
+
via: z.enum(CRM_SEND_VIAS),
|
|
503
|
+
companies: z.number().int(),
|
|
504
|
+
deals: z.number().int(),
|
|
505
|
+
deleted: z.number().int(),
|
|
506
|
+
rejected: z.number().int(),
|
|
507
|
+
samples: z.array(
|
|
508
|
+
z.object({ kind: z.enum(["company", "deal"]), id: z.string(), code: z.string(), message: z.string() })
|
|
509
|
+
)
|
|
510
|
+
});
|
|
511
|
+
var crmSheetLinkSchema = z.object({
|
|
512
|
+
id: z.string(),
|
|
513
|
+
spreadsheetName: z.string(),
|
|
514
|
+
/** Where the sheet opens — for a person, or a scenario that writes its rows. */
|
|
515
|
+
url: z.string().optional(),
|
|
516
|
+
tab: z.string(),
|
|
517
|
+
kind: z.enum(["deals", "companies"]),
|
|
518
|
+
lastRead: z.object({
|
|
519
|
+
at: z.number(),
|
|
520
|
+
ok: z.boolean(),
|
|
521
|
+
companies: z.number().int(),
|
|
522
|
+
deals: z.number().int(),
|
|
523
|
+
/** Records the sheet no longer has, removed from Baker. */
|
|
524
|
+
removed: z.number().int(),
|
|
525
|
+
rejected: z.number().int(),
|
|
526
|
+
/** Why the read failed or what was held back, in words. */
|
|
527
|
+
message: z.string().optional()
|
|
528
|
+
}).nullable()
|
|
529
|
+
});
|
|
530
|
+
var accountsCrmStatusResponseSchema = z.object({
|
|
531
|
+
ok: z.literal(true),
|
|
532
|
+
data: z.object({
|
|
533
|
+
/**
|
|
534
|
+
* Always true, for CLIs from when Account insights was a per-company
|
|
535
|
+
* switch: they read its absence as "switched off". Drop it once no
|
|
536
|
+
* Runtime runs one of them.
|
|
537
|
+
*/
|
|
538
|
+
enabled: z.literal(true).optional(),
|
|
539
|
+
/** `hubspot` (Baker reads it), `api` (the client sends it), or null before anyone chose. */
|
|
540
|
+
source: z.enum(["hubspot", "api"]).nullable(),
|
|
541
|
+
/** Where a client's system sends. */
|
|
542
|
+
url: z.string(),
|
|
543
|
+
lastLive: crmPushSummarySchema.nullable(),
|
|
544
|
+
lastTest: crmPushSummarySchema.nullable(),
|
|
545
|
+
/** Google Sheets Baker reads every night, with how the last read went. */
|
|
546
|
+
sheets: z.array(crmSheetLinkSchema),
|
|
547
|
+
/** What the sent CRM holds; null unless the source is `api`. */
|
|
548
|
+
contents: crmContentsSchema.nullable()
|
|
549
|
+
})
|
|
550
|
+
});
|
|
551
|
+
var accountsCrmSheetRequestSchema = z.object({
|
|
552
|
+
/** The Google Drive connection to make it with, when the company has more than one. */
|
|
553
|
+
account: z.string().optional()
|
|
554
|
+
});
|
|
555
|
+
var accountsCrmSheetResponseSchema = z.object({
|
|
556
|
+
ok: z.literal(true),
|
|
557
|
+
data: z.object({
|
|
558
|
+
/** False when the company already had the sheet: it is handed back, never made twice. */
|
|
559
|
+
created: z.boolean(),
|
|
560
|
+
spreadsheetName: z.string(),
|
|
561
|
+
url: z.string(),
|
|
562
|
+
tabs: z.array(z.string())
|
|
563
|
+
})
|
|
564
|
+
});
|
|
565
|
+
var CRM_PUSH_EXAMPLE = {
|
|
566
|
+
companies: [{ id: "acct-001", name: "Acme Inc", domain: "acme.com", linkedinPage: "acme-inc" }],
|
|
567
|
+
deals: [
|
|
568
|
+
{
|
|
569
|
+
id: "deal-001",
|
|
570
|
+
companyId: "acct-001",
|
|
571
|
+
name: "Acme \u2014 annual plan",
|
|
572
|
+
amount: 24e3,
|
|
573
|
+
currency: "EUR",
|
|
574
|
+
stage: "Proposal",
|
|
575
|
+
status: "open",
|
|
576
|
+
createdAt: "2026-06-15"
|
|
577
|
+
}
|
|
578
|
+
]
|
|
579
|
+
};
|
|
580
|
+
var MODE_HINT = `
|
|
581
|
+
# Check it first: add -H '${INGEST_MODE_HEADER}: test' \u2014 judged the same way, nothing stored.`;
|
|
582
|
+
var PEOPLE_NOTE = "Anything naming a person \u2014 a contact, an owner, an email or phone \u2014 is refused, never stored.";
|
|
583
|
+
var CRM_COMPANY_FIELDS = [
|
|
584
|
+
{
|
|
585
|
+
name: "id",
|
|
586
|
+
need: "conditional",
|
|
587
|
+
takes: "Your CRM's id for the company (1\u2013128 characters).",
|
|
588
|
+
note: "Without one, Baker knows the company by its domain (or LinkedIn page) \u2014 fine for a plain list of target companies."
|
|
589
|
+
},
|
|
590
|
+
{ name: "name", need: "optional", takes: "The company's name, as the Accounts screen shows it." },
|
|
591
|
+
{
|
|
592
|
+
name: "domain",
|
|
593
|
+
need: "optional",
|
|
594
|
+
takes: "Its website \u2014 acme.com or https://www.acme.com both work.",
|
|
595
|
+
note: "The main way a company is matched to the LinkedIn companies your ads reached. Send it whenever you have it."
|
|
596
|
+
},
|
|
597
|
+
{
|
|
598
|
+
name: "linkedinPage",
|
|
599
|
+
need: "optional",
|
|
600
|
+
takes: "Its LinkedIn page: the URL or the part after /company/.",
|
|
601
|
+
note: "The surest match of all when the website is shared or missing."
|
|
602
|
+
},
|
|
603
|
+
{ name: "deleted", need: "optional", takes: "true to remove a company sent before. Only the id is needed." }
|
|
604
|
+
];
|
|
605
|
+
var CRM_DEAL_FIELDS = [
|
|
606
|
+
{
|
|
607
|
+
name: "id",
|
|
608
|
+
need: "required",
|
|
609
|
+
takes: "Your CRM's id for the deal (1\u2013128 characters). Sending it again updates it."
|
|
610
|
+
},
|
|
611
|
+
{
|
|
612
|
+
name: "createdAt",
|
|
613
|
+
need: "required",
|
|
614
|
+
takes: "The day it was created: 2026-06-15 or an ISO 8601 time.",
|
|
615
|
+
note: "What dates it as pipeline."
|
|
616
|
+
},
|
|
617
|
+
{
|
|
618
|
+
name: "companyId",
|
|
619
|
+
need: "conditional",
|
|
620
|
+
takes: "The id of its company, as sent in companies.",
|
|
621
|
+
note: "Or send companyDomain (and companyName) instead and skip companies altogether. Use one way consistently. A deal with neither is kept but cannot be influenced."
|
|
622
|
+
},
|
|
623
|
+
{ name: "companyDomain", need: "conditional", takes: "Its company's website, when you send no companies." },
|
|
624
|
+
{ name: "companyName", need: "optional", takes: "Its company's name, with companyDomain." },
|
|
625
|
+
{
|
|
626
|
+
name: "companyLinkedinPage",
|
|
627
|
+
need: "optional",
|
|
628
|
+
takes: "Its company's LinkedIn page, with companyDomain: the surest match."
|
|
629
|
+
},
|
|
630
|
+
{ name: "name", need: "optional", takes: "The deal's name." },
|
|
631
|
+
{
|
|
632
|
+
name: "amount",
|
|
633
|
+
need: "optional",
|
|
634
|
+
takes: 'Its value: 24000 or "24000.00". Left out, the deal counts but adds no value.'
|
|
635
|
+
},
|
|
636
|
+
{ name: "currency", need: "optional", takes: "Three letters: EUR, USD, GBP\u2026" },
|
|
637
|
+
{ name: "pipeline", need: "optional", takes: "Its pipeline's name or id, if you use several." },
|
|
638
|
+
{ name: "stage", need: "optional", takes: "Its stage's name or id." },
|
|
639
|
+
{
|
|
640
|
+
name: "status",
|
|
641
|
+
need: "optional",
|
|
642
|
+
takes: "open, won or lost.",
|
|
643
|
+
note: "Send it and Baker needs nothing else to tell won from lost. Without it, choose which stages mean won and lost in Measure \u2192 Accounts."
|
|
644
|
+
},
|
|
645
|
+
{
|
|
646
|
+
name: "closedAt",
|
|
647
|
+
need: "conditional",
|
|
648
|
+
takes: "The day it was won or lost.",
|
|
649
|
+
note: "Needed when status is won or lost: it dates the revenue."
|
|
650
|
+
},
|
|
651
|
+
{ name: "deleted", need: "optional", takes: "true to remove a deal sent before. Only the id is needed." }
|
|
652
|
+
];
|
|
653
|
+
var CRM_RESPONSE_FIELDS = [
|
|
654
|
+
{ name: "mode", need: "required", takes: "live or test, echoed from X-Baker-Mode." },
|
|
655
|
+
{ name: "received", need: "required", takes: "How many companies and deals arrived." },
|
|
656
|
+
{ name: "accepted", need: "required", takes: "How many passed the checks \u2014 stored, unless it was a test." },
|
|
657
|
+
{ name: "deleted", need: "required", takes: "How many removals were accepted." },
|
|
658
|
+
{
|
|
659
|
+
name: "rejected",
|
|
660
|
+
need: "required",
|
|
661
|
+
takes: "Each refused record: kind, index, id, code and a message saying what to fix.",
|
|
662
|
+
note: `Codes: ${CRM_REJECTION_CODES.join(", ")}. ${PEOPLE_NOTE}`
|
|
663
|
+
}
|
|
664
|
+
];
|
|
665
|
+
function fieldTable(fields) {
|
|
666
|
+
return [
|
|
667
|
+
"| Field | Need | Takes |",
|
|
668
|
+
"| --- | --- | --- |",
|
|
669
|
+
...fields.map(
|
|
670
|
+
(field) => `| \`${field.name}\` | ${field.need} | ${field.takes}${field.note ? ` ${field.note}` : ""} |`
|
|
671
|
+
)
|
|
672
|
+
].join("\n");
|
|
673
|
+
}
|
|
674
|
+
function crmPushBrief(url) {
|
|
675
|
+
return `# Sending your CRM to Baker
|
|
676
|
+
|
|
677
|
+
Baker compares the companies your LinkedIn ads reached with your deals. When Baker cannot read
|
|
678
|
+
your CRM itself, your system sends the companies and deals here \u2014 only what you choose to send.
|
|
679
|
+
|
|
680
|
+
\`POST ${url}\` with \`Authorization: Bearer <key>\` and \`Content-Type: application/json\`.
|
|
681
|
+
|
|
682
|
+
1. **Use a key that can only send CRM data.** Create it in Baker \u2192 Measure \u2192 Accounts \u2192 Deal
|
|
683
|
+
settings (or Settings \u2192 API keys, "Sending CRM data only"). Never put it in source or a chat;
|
|
684
|
+
read it from an environment variable.
|
|
685
|
+
2. **Send \`${INGEST_MODE_HEADER}: test\` while you build.** It is judged exactly the same way and
|
|
686
|
+
stores nothing.
|
|
687
|
+
3. **Send everything once, then what changes.** Sending a record again with the same \`id\`
|
|
688
|
+
updates it; \`"deleted": true\` removes it. Up to ${CRM_PUSH_BATCH_MAX} records per request; a
|
|
689
|
+
nightly job of your deals changed since the last run is plenty.
|
|
690
|
+
4. **Companies and deals only.** ${PEOPLE_NOTE}
|
|
691
|
+
|
|
692
|
+
Body: \`{ "companies": [ \u2026 ], "deals": [ \u2026 ] }\` \u2014 either list may be left out.
|
|
693
|
+
|
|
694
|
+
## Companies
|
|
695
|
+
|
|
696
|
+
${fieldTable(CRM_COMPANY_FIELDS)}
|
|
697
|
+
|
|
698
|
+
## Deals
|
|
699
|
+
|
|
700
|
+
${fieldTable(CRM_DEAL_FIELDS)}
|
|
701
|
+
|
|
702
|
+
## The answer
|
|
703
|
+
|
|
704
|
+
A \`200\` with \`{ "ok": true, "data": { \u2026 } }\`. One bad record never refuses the others: read
|
|
705
|
+
\`rejected\`.
|
|
706
|
+
|
|
707
|
+
${fieldTable(CRM_RESPONSE_FIELDS)}
|
|
708
|
+
|
|
709
|
+
## Example
|
|
710
|
+
|
|
711
|
+
\`\`\`json
|
|
712
|
+
${JSON.stringify(CRM_PUSH_EXAMPLE, null, 2)}
|
|
713
|
+
\`\`\`
|
|
714
|
+
`;
|
|
715
|
+
}
|
|
716
|
+
|
|
717
|
+
// ../api/src/accounts/crm-columns.ts
|
|
718
|
+
var COLUMN_HELD = 0.7;
|
|
719
|
+
var SAMPLE_CHARS = 60;
|
|
720
|
+
var EMAIL = /[^\s@]+@[^\s@]+\.[^\s@]+/g;
|
|
721
|
+
var CRITERIA = {
|
|
722
|
+
id: "The deal's own unique id or number in the CRM (a deal, opportunity or record id of the deal), not the company's id",
|
|
723
|
+
name: "The deal's own title (a deal or opportunity name), not the name of the company or of a person",
|
|
724
|
+
companyId: "The CRM's unique id (or record id) of the company or account the row is about or the deal is with",
|
|
725
|
+
companyName: "The name of the company, account or organization the row is about or the deal is with",
|
|
726
|
+
companyDomain: "The company's website or web domain, like acme.com",
|
|
727
|
+
companyLinkedinPage: "The company's LinkedIn page address",
|
|
728
|
+
amount: "The deal's own value in money (its amount, value or size), not a weighted or forecast amount, not a company's revenue or turnover, not a probability, a percentage or a count",
|
|
729
|
+
currency: "The currency the amount is in, like EUR or USD",
|
|
730
|
+
pipeline: "Which sales pipeline the deal belongs to, not its stage",
|
|
731
|
+
stage: "The deal's stage or state in the sales pipeline, in any words (like Proposal, Negotiation, Closed Won, Ganado), not the status of a lead or a contact",
|
|
732
|
+
status: "Whether the deal is open, won or lost, written as exactly the English word open, won or lost",
|
|
733
|
+
createdAt: "The date the deal or the company was created, opened or added to the CRM",
|
|
734
|
+
closedAt: "The date the deal was closed (won or lost) or is expected to close",
|
|
735
|
+
none: "Anything else: a person (an owner, a contact, a person's name, email or phone), who created or last changed the record, a probability, a weighted amount, a company's revenue or size, a lead's or contact's status, a next step, a source, notes, an industry, a date of last activity, or any other field"
|
|
736
|
+
};
|
|
737
|
+
var QUESTION = "`column` is the header of a column in a spreadsheet exported from a CRM, in any language or in the CRM's own wording, and `cells` are values from that column. `sheet` lists every header of the spreadsheet, for context. Which field does `column` hold?";
|
|
738
|
+
function sampleCell(cell) {
|
|
739
|
+
return cell.replace(EMAIL, "<email address>").slice(0, SAMPLE_CHARS);
|
|
740
|
+
}
|
|
741
|
+
function crmColumnQuestions(columns, headers = columns.map((column) => column.header)) {
|
|
742
|
+
const sheet = headers.join(" | ");
|
|
743
|
+
return columns.map(({ header, samples }) => ({
|
|
744
|
+
type: "choice",
|
|
745
|
+
instructions: {
|
|
746
|
+
sheet,
|
|
747
|
+
column: header,
|
|
748
|
+
cells: samples.length > 0 ? samples.map(sampleCell).join(" | ") : "(empty)",
|
|
749
|
+
question: QUESTION
|
|
750
|
+
},
|
|
751
|
+
criteria: CRITERIA
|
|
752
|
+
}));
|
|
753
|
+
}
|
|
754
|
+
var isCrmColumnField = (choice) => CRM_COLUMN_FIELDS.includes(choice);
|
|
755
|
+
var isStatusCell = (cell) => CRM_DEAL_STATUSES.includes(cell.trim().toLowerCase());
|
|
756
|
+
function crmColumnMeanings(columns, answers, held = COLUMN_HELD) {
|
|
757
|
+
const meanings = {};
|
|
758
|
+
columns.forEach(({ header, samples }, index) => {
|
|
759
|
+
const answer = answers[index];
|
|
760
|
+
if (answer === void 0 || !("choice" in answer)) return;
|
|
761
|
+
const { choice, probabilities } = answer;
|
|
762
|
+
if (!isCrmColumnField(choice) || (probabilities[choice] ?? 0) < held) return;
|
|
763
|
+
meanings[header] = choice === "status" && !samples.every(isStatusCell) ? "stage" : choice;
|
|
764
|
+
});
|
|
765
|
+
return meanings;
|
|
766
|
+
}
|
|
767
|
+
|
|
768
|
+
// ../api/src/accounts/index.ts
|
|
769
|
+
import { z as z2 } from "zod";
|
|
770
|
+
var INFLUENCE_MODEL_KINDS = ["engagement", "awareness", "intent"];
|
|
771
|
+
var INFLUENCE_METRICS = ["impressions", "engagements", "clicks"];
|
|
772
|
+
var DEFAULT_LOOKBACK_MONTHS = 12;
|
|
773
|
+
var MATCH_CONFIDENCES = ["high", "low"];
|
|
774
|
+
var MODEL_METRIC = {
|
|
775
|
+
engagement: { metric: "engagements", threshold: 3 },
|
|
776
|
+
awareness: { metric: "impressions", threshold: 7 },
|
|
777
|
+
intent: { metric: "clicks", threshold: 3 }
|
|
778
|
+
};
|
|
779
|
+
function influenceParams(settings, override = {}) {
|
|
780
|
+
const kind = override.model ?? settings.model.kind;
|
|
781
|
+
const model = MODEL_METRIC[kind];
|
|
782
|
+
const wholeAtLeastOne = (value) => value !== void 0 && Number.isInteger(value) && value >= 1;
|
|
783
|
+
const threshold = override.threshold ?? (override.model === void 0 ? settings.model.threshold : void 0);
|
|
784
|
+
return {
|
|
785
|
+
metric: model.metric,
|
|
786
|
+
threshold: wholeAtLeastOne(threshold) ? threshold : model.threshold,
|
|
787
|
+
lookbackMonths: wholeAtLeastOne(settings.lookbackMonths) ? settings.lookbackMonths : DEFAULT_LOOKBACK_MONTHS
|
|
788
|
+
};
|
|
789
|
+
}
|
|
790
|
+
var ACCOUNTS_MAX_MONTHS = 24;
|
|
791
|
+
var windowFields = {
|
|
792
|
+
/** Calendar months including the current one. */
|
|
793
|
+
lastMonths: z2.number().int().min(1).max(ACCOUNTS_MAX_MONTHS).optional(),
|
|
794
|
+
start: calendarDaySchema.optional(),
|
|
795
|
+
end: calendarDaySchema.optional()
|
|
796
|
+
};
|
|
797
|
+
var ruleOverrideFields = {
|
|
798
|
+
model: z2.enum(INFLUENCE_MODEL_KINDS).optional(),
|
|
799
|
+
threshold: z2.number().int().min(1).optional()
|
|
800
|
+
};
|
|
801
|
+
function windowRules(req, ctx) {
|
|
802
|
+
if (req.start !== void 0 && req.lastMonths !== void 0) {
|
|
803
|
+
ctx.addIssue({ code: "custom", path: ["lastMonths"], message: "pass lastMonths or start/end, not both" });
|
|
804
|
+
}
|
|
805
|
+
if (req.end !== void 0 && req.start === void 0) {
|
|
806
|
+
ctx.addIssue({ code: "custom", path: ["end"], message: "end needs a start" });
|
|
807
|
+
}
|
|
808
|
+
if (req.start !== void 0 && req.end !== void 0 && req.end < req.start) {
|
|
809
|
+
ctx.addIssue({ code: "custom", path: ["end"], message: "end is before start" });
|
|
810
|
+
return;
|
|
811
|
+
}
|
|
812
|
+
const tooLong = req.start === void 0 ? null : windowTooLong(req.start, req.end ?? todayUtc(), ACCOUNTS_MAX_MONTHS);
|
|
813
|
+
if (tooLong !== null) ctx.addIssue({ code: "custom", path: ["start"], message: tooLong });
|
|
814
|
+
}
|
|
815
|
+
var accountsWindowSchema = z2.object({ start: z2.string(), end: z2.string() });
|
|
816
|
+
var influenceParamsSchema = z2.object({
|
|
817
|
+
metric: z2.enum(INFLUENCE_METRICS),
|
|
818
|
+
threshold: z2.number(),
|
|
819
|
+
lookbackMonths: z2.number()
|
|
820
|
+
});
|
|
821
|
+
var ACCOUNTS_ENGAGEMENT_DEFAULT_LIMIT = 500;
|
|
822
|
+
var ACCOUNTS_ENGAGEMENT_MAX_LIMIT = 5e3;
|
|
823
|
+
var accountEngagementRowSchema = z2.object({
|
|
824
|
+
/** LinkedIn organization id; `urn:li:organization:<orgId>` on LinkedIn. */
|
|
825
|
+
orgId: z2.string(),
|
|
826
|
+
/** Empty until the nightly sync has looked the company up. */
|
|
827
|
+
name: z2.string(),
|
|
828
|
+
domain: z2.string(),
|
|
829
|
+
impressions: z2.number(),
|
|
830
|
+
clicks: z2.number(),
|
|
831
|
+
engagements: z2.number(),
|
|
832
|
+
videoViews: z2.number(),
|
|
833
|
+
/** LinkedIn does not always report spend per company; 0 then. */
|
|
834
|
+
costLocal: z2.number(),
|
|
835
|
+
currency: z2.string(),
|
|
836
|
+
/** Months in the window the company saw or did anything. */
|
|
837
|
+
monthsActive: z2.number(),
|
|
838
|
+
lastMonth: z2.string().nullable(),
|
|
839
|
+
/** The same-length period just before the window. */
|
|
840
|
+
previous: z2.object({ impressions: z2.number(), clicks: z2.number(), engagements: z2.number() }),
|
|
841
|
+
/** By engagements against the previous period. */
|
|
842
|
+
flag: z2.enum(["new", "rising"]).nullable(),
|
|
843
|
+
crmCompanyId: z2.string().nullable(),
|
|
844
|
+
/** The matched CRM company's name; null without a match. Optional for older servers. */
|
|
845
|
+
crmCompanyName: z2.string().nullable().optional(),
|
|
846
|
+
matchConfidence: z2.enum(MATCH_CONFIDENCES).nullable(),
|
|
847
|
+
hasOpenDeal: z2.boolean(),
|
|
848
|
+
hasWonDeal: z2.boolean(),
|
|
849
|
+
hasLostDeal: z2.boolean(),
|
|
850
|
+
/** When the company's most recent lost deal closed (created, when it has no close date), ISO; null without one. */
|
|
851
|
+
lastLostAt: z2.string().nullable(),
|
|
852
|
+
/**
|
|
853
|
+
* People whose work email named the company's domain on the website or the
|
|
854
|
+
* API in the period, and how many became leads — the touches beside the ads.
|
|
855
|
+
* Null when none did; absent from older servers.
|
|
856
|
+
*/
|
|
857
|
+
website: z2.object({ people: z2.number(), leads: z2.number() }).nullable().optional()
|
|
858
|
+
});
|
|
859
|
+
var accountWebsiteRowSchema = z2.object({
|
|
860
|
+
domain: z2.string(),
|
|
861
|
+
people: z2.number(),
|
|
862
|
+
leads: z2.number(),
|
|
863
|
+
/** ISO. */
|
|
864
|
+
firstSeen: z2.string(),
|
|
865
|
+
/** ISO. */
|
|
866
|
+
lastSeen: z2.string()
|
|
867
|
+
});
|
|
868
|
+
function accountDealStatus(row) {
|
|
869
|
+
if (row.hasWonDeal) return "won";
|
|
870
|
+
if (row.hasOpenDeal) return "open";
|
|
871
|
+
if (row.hasLostDeal) return "lost";
|
|
872
|
+
return "none";
|
|
873
|
+
}
|
|
874
|
+
var LOST_DEAL_COOLDOWN_MONTHS = 6;
|
|
875
|
+
function monthsBefore(day, months) {
|
|
876
|
+
const [year, month, date] = day.split("-").map(Number);
|
|
877
|
+
const index = (year ?? 1970) * 12 + ((month ?? 1) - 1) - months;
|
|
878
|
+
const lastDate = new Date(Date.UTC(Math.floor(index / 12), index % 12 + 1, 0)).getUTCDate();
|
|
879
|
+
return new Date(Date.UTC(Math.floor(index / 12), index % 12, Math.min(date ?? 1, lastDate))).toISOString().slice(0, 10);
|
|
880
|
+
}
|
|
881
|
+
function warmAccounts(rows, today, options = {}) {
|
|
882
|
+
const cooldownStart = monthsBefore(today, LOST_DEAL_COOLDOWN_MONTHS);
|
|
883
|
+
const { minimum } = options;
|
|
884
|
+
return rows.filter(
|
|
885
|
+
(row) => row.flag !== null && (minimum === void 0 || row[minimum.metric] >= minimum.value) && !row.hasOpenDeal && !row.hasWonDeal && !(row.lastLostAt !== null && row.lastLostAt.slice(0, 10) >= cooldownStart)
|
|
886
|
+
);
|
|
887
|
+
}
|
|
888
|
+
var accountsEngagementRequestSchema = z2.object({
|
|
889
|
+
...windowFields,
|
|
890
|
+
/** One campaign's companies; every campaign together when absent. */
|
|
891
|
+
campaignId: z2.string().regex(/^\d+$/, "use the numeric campaign id").optional(),
|
|
892
|
+
/** Companies per page. */
|
|
893
|
+
limit: z2.number().int().min(1).max(ACCOUNTS_ENGAGEMENT_MAX_LIMIT).default(ACCOUNTS_ENGAGEMENT_DEFAULT_LIMIT),
|
|
894
|
+
/** Which page, 1-based, most engaged first. */
|
|
895
|
+
page: z2.number().int().min(1).default(1)
|
|
896
|
+
}).superRefine(windowRules);
|
|
897
|
+
var accountsEngagementResponseSchema = z2.object({
|
|
898
|
+
ok: z2.literal(true),
|
|
899
|
+
data: z2.object({
|
|
900
|
+
window: accountsWindowSchema,
|
|
901
|
+
previousWindow: accountsWindowSchema,
|
|
902
|
+
companies: z2.array(accountEngagementRowSchema),
|
|
903
|
+
/** True when more companies were reached than this page and the ones before it hold. */
|
|
904
|
+
truncated: z2.boolean(),
|
|
905
|
+
/** Which page this is, and how many companies there are in all. Absent from older servers. */
|
|
906
|
+
pageInfo: z2.object({ page: z2.number(), pageSize: z2.number(), total: z2.number(), hasMore: z2.boolean() }).optional(),
|
|
907
|
+
/** The company's influence rule (the default one before setup): the minimum `baker accounts warm` applies. */
|
|
908
|
+
rule: influenceParamsSchema.optional()
|
|
909
|
+
})
|
|
910
|
+
});
|
|
911
|
+
var INFLUENCE_BASES = ["pipeline", "revenue"];
|
|
912
|
+
var accountDealRowSchema = z2.object({
|
|
913
|
+
dealId: z2.string(),
|
|
914
|
+
dealName: z2.string(),
|
|
915
|
+
crmCompanyId: z2.string(),
|
|
916
|
+
companyName: z2.string(),
|
|
917
|
+
domain: z2.string(),
|
|
918
|
+
/** Null when the deal has no amount — unknown, not zero. */
|
|
919
|
+
amount: z2.number().nullable(),
|
|
920
|
+
currency: z2.string(),
|
|
921
|
+
/** Created (pipeline) or closed won (revenue), ISO. The date the lookback counts back from. */
|
|
922
|
+
referenceAt: z2.string(),
|
|
923
|
+
/** By the won and lost stages chosen in the settings. */
|
|
924
|
+
status: z2.enum(["open", "won", "lost"]),
|
|
925
|
+
/** The model's metric, summed over the company's lookback months. */
|
|
926
|
+
touchValue: z2.number(),
|
|
927
|
+
/** The first month inside the lookback the company was reached, `YYYY-MM-01`. */
|
|
928
|
+
firstTouchMonth: z2.string().nullable(),
|
|
929
|
+
/** How surely the CRM company is the LinkedIn one; null when no LinkedIn company matched. */
|
|
930
|
+
matchConfidence: z2.enum(MATCH_CONFIDENCES).nullable(),
|
|
931
|
+
/** The company crossed the threshold — whatever the match confidence. */
|
|
932
|
+
influenced: z2.boolean()
|
|
933
|
+
});
|
|
934
|
+
var moneyByCurrencySchema = z2.record(z2.string(), z2.number());
|
|
935
|
+
var influenceSummarySchema = z2.object({
|
|
936
|
+
/** Every deal in the window for this basis. */
|
|
937
|
+
deals: z2.number(),
|
|
938
|
+
/** Influenced, confirmed matches only — the headline. */
|
|
939
|
+
influencedDeals: z2.number(),
|
|
940
|
+
influencedValue: moneyByCurrencySchema,
|
|
941
|
+
/** Influenced deals with no amount entered: counted, not valued. */
|
|
942
|
+
dealsWithoutAmount: z2.number(),
|
|
943
|
+
/** Influenced through a match nobody confirmed yet; not in the headline. */
|
|
944
|
+
lowConfidenceDeals: z2.number(),
|
|
945
|
+
lowConfidenceValue: moneyByCurrencySchema,
|
|
946
|
+
/** LinkedIn spend on the companies reached in the window, per currency. */
|
|
947
|
+
spend: moneyByCurrencySchema,
|
|
948
|
+
/** Influenced value per 1 of spend — only when both are in the same single currency. */
|
|
949
|
+
valuePerSpend: z2.object({ currency: z2.string(), value: z2.number() }).nullable()
|
|
950
|
+
});
|
|
951
|
+
var accountsInfluencedRequestSchema = z2.object({
|
|
952
|
+
...windowFields,
|
|
953
|
+
/** `pipeline`: deals created in the window and not won. `revenue`: deals closed won in the window. */
|
|
954
|
+
basis: z2.enum(INFLUENCE_BASES).default("pipeline"),
|
|
955
|
+
/** Every deal in the window, influenced or not; compact returns the influenced ones. */
|
|
956
|
+
full: z2.boolean().default(false),
|
|
957
|
+
...ruleOverrideFields
|
|
958
|
+
}).superRefine(windowRules);
|
|
959
|
+
var accountsInfluencedResponseSchema = z2.object({
|
|
960
|
+
ok: z2.literal(true),
|
|
961
|
+
data: z2.object({
|
|
962
|
+
window: accountsWindowSchema,
|
|
963
|
+
basis: z2.enum(INFLUENCE_BASES),
|
|
964
|
+
rule: influenceParamsSchema,
|
|
965
|
+
summary: influenceSummarySchema,
|
|
966
|
+
/** Influenced deals on confirmed matches; with `full`, every deal in the window. */
|
|
967
|
+
deals: z2.array(accountDealRowSchema),
|
|
968
|
+
/** Influenced through a match nobody confirmed yet. Not in `summary`'s headline. */
|
|
969
|
+
lowConfidence: z2.array(accountDealRowSchema),
|
|
970
|
+
/** True when the window held more deals than one read returns. */
|
|
971
|
+
truncated: z2.boolean()
|
|
972
|
+
})
|
|
973
|
+
});
|
|
974
|
+
var accountsCompanyRequestSchema = z2.object({
|
|
975
|
+
/** LinkedIn organization id, or its `urn:li:organization:` URN. */
|
|
976
|
+
orgId: z2.string().transform((value) => value.replace(/^urn:li:organization:/, "")).pipe(z2.string().regex(/^\d+$/, "use the LinkedIn company id or its urn:li:organization URN")).optional(),
|
|
977
|
+
/** The company's website domain, `acme.com`. */
|
|
978
|
+
domain: z2.string().min(3).max(253).transform(
|
|
979
|
+
(value) => value.trim().toLowerCase().replace(/^https?:\/\//, "").replace(/^www\./, "").replace(/\/.*$/, "")
|
|
980
|
+
).optional()
|
|
981
|
+
}).refine((req) => req.orgId === void 0 !== (req.domain === void 0), {
|
|
982
|
+
message: "Give a LinkedIn company id or a domain, one of the two."
|
|
983
|
+
});
|
|
984
|
+
var accountCompanyMonthSchema = z2.object({
|
|
985
|
+
orgId: z2.string(),
|
|
986
|
+
/** Empty for the whole ad account; a campaign id otherwise. */
|
|
987
|
+
campaignId: z2.string(),
|
|
988
|
+
/** LinkedIn's name for the campaign; null for the account-wide row, or when LinkedIn could not be asked. */
|
|
989
|
+
campaignName: z2.string().nullable(),
|
|
990
|
+
month: z2.string(),
|
|
991
|
+
impressions: z2.number(),
|
|
992
|
+
clicks: z2.number(),
|
|
993
|
+
engagements: z2.number()
|
|
994
|
+
});
|
|
995
|
+
var accountCompanyDealSchema = z2.object({
|
|
996
|
+
dealId: z2.string(),
|
|
997
|
+
dealName: z2.string(),
|
|
998
|
+
amount: z2.number().nullable(),
|
|
999
|
+
currency: z2.string(),
|
|
1000
|
+
status: z2.enum(["open", "won", "lost"]),
|
|
1001
|
+
createdAt: z2.string(),
|
|
1002
|
+
closedAt: z2.string().nullable(),
|
|
1003
|
+
/**
|
|
1004
|
+
* The rule's metric over the lookback ending with the deal's reference month
|
|
1005
|
+
* (created; closed for a won deal), from the pages in `orgs`. Absent before
|
|
1006
|
+
* setup or when the company matched no CRM company.
|
|
1007
|
+
*/
|
|
1008
|
+
touchValue: z2.number().optional(),
|
|
1009
|
+
/** `touchValue` reached the rule's threshold. */
|
|
1010
|
+
influenced: z2.boolean().optional()
|
|
1011
|
+
});
|
|
1012
|
+
var accountCompanyOrgSchema = z2.object({
|
|
1013
|
+
orgId: z2.string(),
|
|
1014
|
+
name: z2.string(),
|
|
1015
|
+
domain: z2.string(),
|
|
1016
|
+
crmCompanyId: z2.string().nullable(),
|
|
1017
|
+
matchConfidence: z2.enum(MATCH_CONFIDENCES).nullable()
|
|
1018
|
+
});
|
|
1019
|
+
var accountsCompanyResponseSchema = z2.object({
|
|
1020
|
+
ok: z2.literal(true),
|
|
1021
|
+
data: z2.object({
|
|
1022
|
+
/** Usually one; a domain can name several LinkedIn pages of the same company. */
|
|
1023
|
+
orgs: z2.array(accountCompanyOrgSchema),
|
|
1024
|
+
/** Month by month, per campaign (and the account-wide row, `campaignId: ""`), oldest first. */
|
|
1025
|
+
months: z2.array(accountCompanyMonthSchema),
|
|
1026
|
+
/** Deals of the matched CRM company, oldest first. */
|
|
1027
|
+
deals: z2.array(accountCompanyDealSchema),
|
|
1028
|
+
/** The rule `influenced` and `touchValue` on each deal were read with; absent before setup. */
|
|
1029
|
+
rule: influenceParamsSchema.optional()
|
|
1030
|
+
})
|
|
1031
|
+
});
|
|
1032
|
+
var accountsCampaignsRequestSchema = z2.object({ ...windowFields, ...ruleOverrideFields, basis: z2.enum(INFLUENCE_BASES).default("pipeline") }).superRefine(windowRules);
|
|
1033
|
+
var accountCampaignRowSchema = z2.object({
|
|
1034
|
+
campaignId: z2.string(),
|
|
1035
|
+
/** LinkedIn's name for the campaign; null when LinkedIn could not be asked or no longer lists it. */
|
|
1036
|
+
campaignName: z2.string().nullable(),
|
|
1037
|
+
/** Companies that saw at least one impression in the window. */
|
|
1038
|
+
companiesReached: z2.number(),
|
|
1039
|
+
/** Companies with at least one engagement in the window. */
|
|
1040
|
+
companiesEngaged: z2.number(),
|
|
1041
|
+
/** Influenced deals (of the read's basis) this campaign touched in their lookback. Overlaps other campaigns. */
|
|
1042
|
+
influencedDeals: z2.number(),
|
|
1043
|
+
influencedValue: moneyByCurrencySchema
|
|
1044
|
+
});
|
|
1045
|
+
var accountsCampaignsResponseSchema = z2.object({
|
|
1046
|
+
ok: z2.literal(true),
|
|
1047
|
+
data: z2.object({
|
|
1048
|
+
window: accountsWindowSchema,
|
|
1049
|
+
/** Optional for older servers, which read pipeline only. */
|
|
1050
|
+
basis: z2.enum(INFLUENCE_BASES).optional(),
|
|
1051
|
+
rule: influenceParamsSchema,
|
|
1052
|
+
campaigns: z2.array(accountCampaignRowSchema)
|
|
1053
|
+
})
|
|
1054
|
+
});
|
|
1055
|
+
var ACCOUNTS_NO_SETTINGS_MESSAGE = "Account insights are not set up yet: in Measure \u2192 Accounts, say where your deals are (HubSpot or another CRM) and what won and lost mean.";
|
|
1056
|
+
|
|
1057
|
+
export {
|
|
1058
|
+
judgeCrmBatch,
|
|
1059
|
+
sheetDelimiter,
|
|
1060
|
+
exactCrmColumns,
|
|
1061
|
+
crmColumnReading,
|
|
1062
|
+
crmBatchFromSheet,
|
|
1063
|
+
crmPushUrl,
|
|
1064
|
+
crmPushRequestSchema,
|
|
1065
|
+
crmPushBrief,
|
|
1066
|
+
crmColumnQuestions,
|
|
1067
|
+
crmColumnMeanings,
|
|
1068
|
+
INFLUENCE_MODEL_KINDS,
|
|
1069
|
+
influenceParams,
|
|
1070
|
+
ACCOUNTS_ENGAGEMENT_MAX_LIMIT,
|
|
1071
|
+
accountDealStatus,
|
|
1072
|
+
warmAccounts,
|
|
1073
|
+
accountsEngagementRequestSchema,
|
|
1074
|
+
accountsInfluencedRequestSchema,
|
|
1075
|
+
accountsCompanyRequestSchema,
|
|
1076
|
+
accountsCampaignsRequestSchema,
|
|
1077
|
+
ACCOUNTS_NO_SETTINGS_MESSAGE
|
|
1078
|
+
};
|
|
1079
|
+
//# sourceMappingURL=chunk-ZYGK7GAK.js.map
|