
Security News
The Hidden Blast Radius of the Axios Compromise
The Axios compromise shows how time-dependent dependency resolution makes exposure harder to detect and contain.
@tinytapanalytics/sdk
Advanced tools
Behavioral psychology platform that detects visitor frustration, predicts abandonment, and helps you save at-risk conversions in real-time
Behavioral psychology platform that detects visitor frustration, predicts abandonment, and helps you save at-risk conversions in real-time.
Stop guessing why visitors leave. Know in real-time.
Unlike traditional analytics that tell you what happened after visitors leave, TinyTap Analytics detects how users are feeling while they're still on your site - giving you the chance to intervene before they abandon.
Track HOW users interact with your site, not just what they click:
// Automatically detects:
// - Rage clicks (frustrated rapid clicking on non-responsive elements)
// - Hesitation duration (hovering 3+ seconds before acting)
// - Form anxiety (excessive backspaces, slow fill speed)
// - Error encounters (form validation failures, broken elements)
// - Cursor distance (erratic movements indicating confusion)
Real-time behavioral analysis generates actionable scores:
{
frustrationScore: 0.85, // High frustration (rage clicks, errors)
confidenceScore: 0.32, // Low confidence (hesitation, backspaces)
engagementScore: 0.61, // Moderate engagement (scroll patterns)
abandonmentRisk: 0.78, // 78% likely to abandon
conversionProbability: 0.15 // 15% likely to convert
}
Get notified when sessions need intervention:
{
alertType: 'frustration',
riskScore: 0.85,
triggerReason: '4 rage clicks, 3 errors encountered, high hesitation',
suggestedIntervention: 'Show live chat offer',
pageUrl: '/checkout',
sessionId: 'session-123'
}
npm install @tinytapanalytics/sdk
<!-- Option 1: Direct script tag (minimal version - 1.0 KB gzipped) -->
<script src="https://cdn.tinytapanalytics.com/sdk/tinytapanalytics-minimal.min.js"
data-api-key="your-api-key"
data-website-id="your-website-id"></script>
<!-- Option 2: NPM/ES modules -->
<script type="module">
import TinyTap Analytics from '@tinytapanalytics/sdk/minimal';
const ciq = new TinyTap Analytics({
apiKey: 'your-api-key',
websiteId: 'your-website-id'
});
// Page views and conversions tracked automatically
// Micro-interactions detected automatically
// Optional: Track custom events
ciq.track('custom_event', { key: 'value' });
</script>
import TinyTap Analytics from '@tinytapanalytics/sdk';
import { MicroInteractionTracking } from '@tinytapanalytics/sdk/features/MicroInteractionTracking';
const ciq = new TinyTap Analytics({
apiKey: 'your-api-key',
websiteId: 'your-website-id',
// Enable behavioral psychology features
enableMicroInteractions: true,
batchInterval: 5000, // Send behavioral data every 5 seconds
// Privacy settings
enablePrivacyMode: true
});
// Initialize micro-interaction tracking
const microTracking = new MicroInteractionTracking(ciq);
microTracking.start({
trackRageClicks: true,
trackHesitation: true,
trackFormAnxiety: true,
trackScrollPatterns: true
});
TinyTap Analytics offers multiple bundle options optimized for different use cases:
| Bundle | Size (Gzipped) | Features | Best For |
|---|---|---|---|
| Minimal | 1.0 KB | Core tracking only | Basic event tracking |
| Core | 14.2 KB | Full SDK with behavioral features | Most applications |
| Full | 14.2 KB | All features pre-loaded | Feature-rich apps |
| Micro-Interactions | 10.8 KB | Psychology tracking module | E-commerce, SaaS |
// Import only what you need
import { MinimalTinyTap Analytics } from '@tinytapanalytics/sdk/minimal';
import { MicroInteractionTracking } from '@tinytapanalytics/sdk/features/MicroInteractionTracking';
// Or use dynamic imports for code splitting
const loadPsychologyFeatures = async () => {
const { MicroInteractionTracking } = await import('@tinytapanalytics/sdk/features/MicroInteractionTracking');
return new MicroInteractionTracking(config);
};
// hooks/useTinyTap Analytics.js
import { useEffect, useRef } from 'react';
import TinyTap Analytics from '@tinytapanalytics/sdk';
export function useTinyTap Analytics(config) {
const sdk = useRef(null);
useEffect(() => {
sdk.current = new TinyTap Analytics({
...config,
enableMicroInteractions: true // Enable behavioral psychology
});
return () => {
// Cleanup if needed
};
}, [config]);
return {
track: (event, data) => sdk.current?.track(event, data),
trackConversion: (value, currency, metadata) =>
sdk.current?.trackConversion(value, currency, metadata)
};
}
// Component usage
function CheckoutPage() {
const { trackConversion } = useTinyTap Analytics({
apiKey: process.env.REACT_APP_CONVERSION_IQ_API_KEY,
websiteId: process.env.REACT_APP_CONVERSION_IQ_WEBSITE_ID
});
const handlePurchase = async (orderData) => {
// Process payment...
// Track conversion
await trackConversion(orderData.total, 'USD', {
orderId: orderData.id,
items: orderData.items
});
};
return (
<button onClick={() => handlePurchase(order)}>
Complete Purchase
</button>
);
}
// composables/useTinyTap Analytics.js
import { ref, onMounted } from 'vue';
import TinyTap Analytics from '@tinytapanalytics/sdk';
export function useTinyTap Analytics(config) {
const sdk = ref(null);
onMounted(() => {
sdk.value = new TinyTap Analytics({
...config,
enableMicroInteractions: true
});
});
const track = (event, data) => sdk.value?.track(event, data);
const trackConversion = (value, currency = 'USD', metadata = {}) => {
sdk.value?.trackConversion(value, currency, metadata);
};
return { track, trackConversion };
}
// lib/tinytapanalytics.js
import TinyTap Analytics from '@tinytapanalytics/sdk';
let sdk = null;
export function initTinyTap Analytics() {
if (typeof window !== 'undefined' && !sdk) {
sdk = new TinyTap Analytics({
apiKey: process.env.NEXT_PUBLIC_CONVERSION_IQ_API_KEY,
websiteId: process.env.NEXT_PUBLIC_CONVERSION_IQ_WEBSITE_ID,
enableMicroInteractions: true, // Enable behavioral psychology
debug: process.env.NODE_ENV === 'development'
});
}
return sdk;
}
// pages/_app.js
import { useEffect } from 'react';
import { useRouter } from 'next/router';
import { initTinyTap Analytics } from '../lib/tinytapanalytics';
export default function App({ Component, pageProps }) {
const router = useRouter();
useEffect(() => {
const ciq = initTinyTap Analytics();
const handleRouteChange = () => {
ciq?.trackPageView();
};
router.events.on('routeChangeComplete', handleRouteChange);
handleRouteChange(); // Track initial page view
return () => {
router.events.off('routeChangeComplete', handleRouteChange);
};
}, [router.events]);
return <Component {...pageProps} />;
}
import TinyTap Analytics from '@tinytapanalytics/sdk';
import { MicroInteractionTracking } from '@tinytapanalytics/sdk/features/MicroInteractionTracking';
const ciq = new TinyTap Analytics({
apiKey: 'your-api-key',
websiteId: 'your-website-id',
enableMicroInteractions: true
});
const microTracking = new MicroInteractionTracking(ciq);
// Start tracking checkout behavior
microTracking.start();
// Listen for high-risk abandonment alerts
microTracking.on('abandonmentRisk', (alert) => {
if (alert.riskScore > 0.7 && alert.pageUrl.includes('/checkout')) {
// Show intervention
showExitIntentPopup({
message: 'Having trouble? Chat with us!',
offer: '10% off if you complete your order now'
});
}
});
// Detect users struggling with onboarding
microTracking.on('frustrationDetected', (session) => {
if (session.frustrationScore > 0.8 && isOnboardingPage()) {
// Trigger helpful intervention
showContextualHelp({
message: 'Need help getting started?',
action: 'Schedule 15-min onboarding call'
});
}
});
// Track form hesitation on demo request
microTracking.on('formAnxiety', (data) => {
if (data.backspaceCount > 5 && data.hesitationDuration > 3000) {
// Reduce form friction
showInlineChatAssist({
message: 'Questions about the demo? Ask away!'
});
}
});
Indicates user frustration based on:
Interpretation:
Indicates user confidence based on:
Interpretation:
Predictive score based on:
Intervention Thresholds:
import TinyTap Analytics from '@tinytapanalytics/sdk';
const sdk = new TinyTap Analytics({
// Required
apiKey: 'your-api-key',
websiteId: 'your-website-id',
// Behavioral Psychology Features
enableMicroInteractions: true,
// Batching & Performance
batchSize: 10, // Events per batch
batchInterval: 5000, // Send behavioral data every 5s
timeout: 5000, // Request timeout (ms)
// Privacy & Compliance
enablePrivacyMode: true, // GDPR/CCPA compliance
// Retry configuration
retry: {
maxAttempts: 3,
baseDelay: 1000,
maxDelay: 10000
},
// Debugging
debug: false
});
TinyTap Analytics is privacy-first by design:
// Check privacy status
const privacyStatus = sdk.getPrivacyStatus();
console.log(privacyStatus); // { analytics: false, microInteractions: true }
// Update consent
sdk.updatePrivacyConsent({
essential: true, // Always required
analytics: true, // Usage analytics
microInteractions: true // Behavioral psychology
});
// Conditional tracking based on consent
if (privacyStatus.microInteractions) {
microTracking.start();
}
Google Analytics tells you what happened after visitors leave. TinyTap Analytics tells you why they're leaving and alerts you in real-time.
Use together: GA for traffic analytics, TinyTap Analytics for behavioral insights.
Hotjar shows where users click with heatmaps and session recordings. TinyTap Analytics shows how they're feeling without privacy-invasive recordings.
The difference: Psychology signals vs. video surveillance.
FullStory records everything for debugging. TinyTap Analytics detects what matters without storing sensitive data.
The difference: Behavioral intelligence, not session replay.
Heap tracks feature usage and product analytics. TinyTap Analytics detects emotional state and abandonment risk.
The difference: Product analytics vs. behavioral psychology.
// Enable debug mode
const sdk = new TinyTap Analytics({
apiKey: 'your-api-key',
websiteId: 'your-website-id',
debug: true // Logs all SDK activity
});
// Handle errors gracefully
sdk.track('purchase', purchaseData).catch(error => {
console.warn('TinyTap Analytics tracking failed:', error);
// Continue with user flow - never block conversions
});
// Check SDK health
if (window.TinyTap Analytics) {
console.log('TinyTap Analytics SDK loaded');
console.log('Config:', window.TinyTap Analytics.config);
}
import TinyTap Analytics, {
TinyTap AnalyticsConfig,
MicroInteractionEvent,
SessionPsychologyProfile,
AbandonmentAlert
} from '@tinytapanalytics/sdk';
const config: TinyTap AnalyticsConfig = {
apiKey: 'your-api-key',
websiteId: 'your-website-id',
enableMicroInteractions: true
};
const sdk = new TinyTap Analytics(config);
// Type-safe event tracking
const eventData: MicroInteractionEvent = {
type: 'rage_click',
elementSelector: 'button#checkout',
clickCount: 5,
timestamp: Date.now()
};
sdk.track('micro_interaction', eventData);
const sdk = new TinyTap Analytics({
apiKey: 'your-api-key',
websiteId: 'your-website-id',
batchSize: 10, // Send 10 events at once
batchInterval: 5000 // Or every 5 seconds
});
// Load psychology features only on key pages
if (isCheckoutPage()) {
const { MicroInteractionTracking } = await import('@tinytapanalytics/sdk/features/MicroInteractionTracking');
const tracker = new MicroInteractionTracking(config);
tracker.start();
}
import TinyTap Analytics from '@tinytapanalytics/sdk/minimal';
global.fetch = jest.fn();
describe('TinyTap Analytics SDK', () => {
let sdk;
beforeEach(() => {
fetch.mockClear();
sdk = new TinyTap Analytics({
apiKey: 'test-key',
websiteId: 'test-site'
});
});
test('tracks micro-interactions with correct payload', async () => {
fetch.mockResolvedValueOnce({
ok: true,
json: async () => ({ success: true })
});
await sdk.track('rage_click', {
elementSelector: 'button#submit',
clickCount: 5
});
expect(fetch).toHaveBeenCalledWith(
expect.stringContaining('/micro-interactions'),
expect.objectContaining({
method: 'POST'
})
);
});
});
// Check configuration
console.log('SDK Config:', sdk.config);
// Enable debug mode
const sdk = new TinyTap Analytics({
apiKey: 'your-api-key',
websiteId: 'your-website-id',
debug: true // This will log all SDK activity
});
// Verify network requests in DevTools > Network tab
// Ensure feature is enabled
const sdk = new TinyTap Analytics({
apiKey: 'your-api-key',
websiteId: 'your-website-id',
enableMicroInteractions: true // Must be true
});
// Verify module is loaded
import { MicroInteractionTracking } from '@tinytapanalytics/sdk/features/MicroInteractionTracking';
const tracker = new MicroInteractionTracking(sdk);
tracker.start(); // Must call start()
new TinyTap Analytics(config)Creates a new SDK instance with behavioral psychology features.
Parameters:
config.apiKey (string, required): Your TinyTap Analytics API keyconfig.websiteId (string, required): Your website IDconfig.enableMicroInteractions (boolean): Enable behavioral psychology (default: false)config.batchInterval (number): Batch send interval in ms (default: 5000)track(eventType, data)Track custom events or micro-interactions.
Returns: Promise
trackConversion(value, currency, metadata)Track conversion events with value.
Returns: Promise
updatePrivacyConsent(consents)Update privacy consent for behavioral tracking.
Parameters:
consents.microInteractions (boolean): Allow micro-interaction trackingFor complete API documentation, visit docs.tinytapanalytics.com.
We welcome contributions! Please see our Contributing Guide for details.
MIT License. See LICENSE for details.
Built with behavioral psychology by the TinyTap Analytics Team
FAQs
Behavioral psychology platform that detects visitor frustration, predicts abandonment, and helps you save at-risk conversions in real-time
The npm package @tinytapanalytics/sdk receives a total of 5 weekly downloads. As such, @tinytapanalytics/sdk popularity was classified as not popular.
We found that @tinytapanalytics/sdk demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Security News
The Axios compromise shows how time-dependent dependency resolution makes exposure harder to detect and contain.

Research
A supply chain attack on Axios introduced a malicious dependency, plain-crypto-js@4.2.1, published minutes earlier and absent from the project’s GitHub releases.

Research
Malicious versions of the Telnyx Python SDK on PyPI delivered credential-stealing malware via a multi-stage supply chain attack.