UNPKG

@tinytapanalytics/sdk

Version:

Behavioral psychology platform that detects visitor frustration, predicts abandonment, and helps you save at-risk conversions in real-time

1 lines 5.47 kB
var e={d:function(t,s){for(var n in s)e.o(s,n)&&!e.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:s[n]})},o:function(e,t){return Object.prototype.hasOwnProperty.call(e,t)}},t={};e.d(t,{v:function(){return s}});class s{constructor(e,t){this.userJourney=[],this.heatmapData=new Map,this.config=e,this.sdk=t,this.sessionData=this.initializeSession(),this.startSessionTracking()}initializeSession(){const e=Date.now();return{id:this.generateSessionId(),startTime:e,lastActivity:e,pageViews:0,events:0,duration:0}}startSessionTracking(){document.addEventListener("visibilitychange",()=>{document.hidden||this.updateSessionActivity()}),["click","scroll","keydown","mousemove"].forEach(e=>{document.addEventListener(e,()=>{this.updateSessionActivity()},{passive:!0,once:!1})}),window.addEventListener("beforeunload",()=>{this.endSession()})}updateSessionActivity(){const e=Date.now();this.sessionData.lastActivity=e,this.sessionData.duration=e-this.sessionData.startTime}trackPageView(e){this.sessionData.pageViews++,this.updateSessionActivity();const t={url:e||window.location.href,title:document.title,referrer:document.referrer,timestamp:Date.now(),viewport:{width:window.innerWidth,height:window.innerHeight},screen:{width:screen.width,height:screen.height},sessionId:this.sessionData.id,pageNumber:this.sessionData.pageViews};this.userJourney.push({timestamp:Date.now(),event:"page_view",data:t}),this.sdk.track("enhanced_page_view",t)}trackEngagement(){const e={timeOnPage:Date.now()-this.sessionData.lastActivity,scrollDepth:this.calculateScrollDepth(),clickCount:this.getSessionClickCount(),sessionDuration:this.sessionData.duration,pageViews:this.sessionData.pageViews,sessionId:this.sessionData.id};this.sdk.track("user_engagement",e)}setupFunnelAnalysis(e){const t={steps:e,conversions:new Array(e.length).fill(0),dropoffs:new Array(e.length-1).fill(0),conversionRate:0};e.forEach((e,s)=>{e.selector?this.observeFunnelStep(e,s,t):e.url&&this.trackURLFunnelStep(e,s,t)})}observeFunnelStep(e,t,s){if(!e.selector)return;const n=new MutationObserver(()=>{const i=document.querySelector(e.selector);i&&(i.addEventListener("click",()=>{this.recordFunnelStep(e,t,s)}),n.disconnect())});n.observe(document.body,{childList:!0,subtree:!0});const i=document.querySelector(e.selector);i&&(i.addEventListener("click",()=>{this.recordFunnelStep(e,t,s)}),n.disconnect())}trackURLFunnelStep(e,t,s){e.url&&window.location.href.includes(e.url)&&this.recordFunnelStep(e,t,s)}recordFunnelStep(e,t,s){if(s.conversions[t]++,t>0){const e=s.conversions[t-1],n=s.conversions[t];s.dropoffs[t-1]=e-n}const n=s.conversions[0],i=s.conversions[s.conversions.length-1];s.conversionRate=n>0?i/n*100:0,this.sdk.track("funnel_step",{stepName:e.name,stepIndex:t,funnelData:s,sessionId:this.sessionData.id})}trackCohort(e,t={}){const s={cohortName:e,userAttributes:t,sessionId:this.sessionData.id,firstVisit:this.isFirstVisit(),timestamp:Date.now()};this.sdk.track("cohort_analysis",s)}trackAttribution(){const e={source:this.getTrafficSource(),medium:this.getTrafficMedium(),campaign:this.getCampaign(),referrer:document.referrer,landingPage:window.location.href,sessionId:this.sessionData.id,timestamp:Date.now()};this.sdk.track("attribution",e)}trackConversionFunnel(e,t,s){const n={funnelName:e,stepName:t,value:s||0,sessionId:this.sessionData.id,userJourney:this.getUserJourneySnapshot(),timestamp:Date.now()};this.sdk.track("conversion_funnel",n)}trackUserSegment(e,t={}){const s={segment:e,properties:t,sessionId:this.sessionData.id,sessionData:this.sessionData,timestamp:Date.now()};this.sdk.track("user_segment",s)}getUserJourneySnapshot(){return this.userJourney.slice(-10)}calculateScrollDepth(){const e=window.innerHeight,t=document.documentElement.scrollHeight,s=window.pageYOffset||document.documentElement.scrollTop;return Math.round(s/(t-e)*100)}getSessionClickCount(){return this.userJourney.filter(e=>"click"===e.event).length}isFirstVisit(){try{return!localStorage.getItem("tinytapanalytics_visited")&&(localStorage.setItem("tinytapanalytics_visited","true"),!0)}catch{return!1}}getTrafficSource(){const e=document.referrer;if(!e)return"direct";const t=new URL(e).hostname.toLowerCase();return t.includes("google")?"google":t.includes("bing")?"bing":t.includes("yahoo")?"yahoo":t.includes("facebook")?"facebook":t.includes("twitter")?"twitter":t.includes("linkedin")?"linkedin":t.includes("instagram")?"instagram":"referral"}getTrafficMedium(){const e=new URLSearchParams(window.location.search).get("utm_medium");if(e)return e;const t=this.getTrafficSource();return["google","bing","yahoo"].includes(t)?"organic":["facebook","twitter","linkedin","instagram"].includes(t)?"social":"referral"===t?"referral":"direct"}getCampaign(){const e=new URLSearchParams(window.location.search);return e.get("utm_campaign")||e.get("campaign")||null}endSession(){this.sessionData.duration=Date.now()-this.sessionData.startTime;const e={...this.sessionData,userJourney:this.getUserJourneySnapshot(),finalUrl:window.location.href,endTime:Date.now()};this.sdk.track("session_end",e)}generateSessionId(){return`ciq_session_${Date.now()}_${Math.random().toString(36).substring(2,11)}`}getSessionData(){return{...this.sessionData}}getUserJourney(){return[...this.userJourney]}addToUserJourney(e,t){this.userJourney.push({timestamp:Date.now(),event:e,data:t}),this.userJourney.length>50&&(this.userJourney=this.userJourney.slice(-50)),this.sessionData.events++}}var n=t.v;export{n as AdvancedAnalytics};