npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

nextjs-whatsapp-cta

v0.1.0

Published

Zero-dependency React components and utilities for WhatsApp CTAs on Next.js sites: button, floating widget, click tracking.

Readme

Next.js WhatsApp CTA

Zero-dependency React components for WhatsApp CTAs on Next.js sites. Button, floating widget and URL builder with UTM tracking and GA4 click events. Copy the files, or use as reference.

Preview

Built from the pattern used in production on real luxury yacht charter sites where WhatsApp is the primary conversion channel.

Why

  • Most WhatsApp button libraries pull in styling frameworks, icon packs and analytics wrappers you do not need
  • These components are ~200 lines total, use inline SVG icons, work with Tailwind or plain CSS
  • URL builder handles phone number normalization, message templating and UTM injection
  • Click tracking auto-fires GA4 events when window.gtag is present, no-ops otherwise

Install

npm install nextjs-whatsapp-cta

Or copy src/lib.ts, src/WhatsAppButton.tsx and src/WhatsAppFloating.tsx directly into your project.

Usage

Inline button

import { WhatsAppButton } from "./components/WhatsAppButton";

<WhatsAppButton
  phone="+971 50 182 4077"
  message="Hi, I would like to book a charter for 6 guests."
  utm={{ source: "website", medium: "hero", campaign: "summer-2026" }}
  trackingLabel="hero-cta"
>
  Book a Yacht
</WhatsAppButton>

Site-wide floating widget

Add once in your root layout:

import { WhatsAppFloating } from "./components/WhatsAppFloating";

export default function Layout({ children }) {
  return (
    <html>
      <body>
        {children}
        <WhatsAppFloating
          phone="+971501824077"
          message="Hi, coming from your website."
          position="bottom-right"
        />
      </body>
    </html>
  );
}

Just the URL builder

import { buildWhatsAppUrl } from "./lib/whatsapp";

const url = buildWhatsAppUrl({
  phone: "+971501824077",
  message: "Quote request",
  utm: { source: "newsletter", medium: "email" },
});

API

buildWhatsAppUrl(options)

| Option | Type | Description | |---|---|---| | phone | string | Any format. Non-digits are stripped. Required. | | message | string? | Pre-fills the WhatsApp chat message. | | utm | object? | UTM parameters appended to the message body in parentheses. |

Returns a https://wa.me/... URL.

<WhatsAppButton>

All buildWhatsAppUrl options plus:

| Prop | Type | Default | |---|---|---| | children | ReactNode | "Chat on WhatsApp" | | className | string? | Tailwind default (green pill) | | trackingLabel | string? | "button" |

<WhatsAppFloating>

All buildWhatsAppUrl options plus:

| Prop | Type | Default | |---|---|---| | position | "bottom-right" \| "bottom-left" | "bottom-right" | | offset | number | 24 | | size | number | 56 | | ariaLabel | string | "Chat on WhatsApp" |

trackWhatsAppClick(label)

Fires gtag("event", "whatsapp_click", { event_label: label }) if window.gtag exists. Silent no-op otherwise. Called automatically by both components.

License

MIT.


Built by Nazir Abbas. Web Developer and SEO Specialist for luxury brands.