Pixel Tracker is a lightweight serverless service that provides a 1×1 invisible tracking pixel. It logs each request (email open / image load) and stores metadata for later analysis.
- Provide a simple tracking pixel endpoint
- Log every request with metadata
- Run fully on serverless (no backend server)
- Easy deployment and local development
- Endpoint:
/api/track?id=<id> - Returns: 1×1 transparent PNG
- Logs:
- ID
- Timestamp
- IP Address
- User-Agent
- Endpoint:
/api/logs - Returns last 100 records
- Uses Redis (Upstash recommended)
- Logs stored as list
Client (Email/Web) ↓ /api/track ↓ Serverless Function (Vercel) ↓ Redis Storage
npx create-next-app@latest pixel-tracker
cd pixel-tracker
npm install @upstash/redis
Create .env.local
UPSTASH_REDIS_REST_URL=your_url
UPSTASH_REDIS_REST_TOKEN=your_token
pixel-tracker/
├── pages/
│ └── api/
│ ├── track.js
│ └── logs.js
├── lib/
│ └── redis.js
lib/redis.js
import { Redis } from "@upstash/redis";
export const redis = new Redis({
url: process.env.UPSTASH_REDIS_REST_URL,
token: process.env.UPSTASH_REDIS_REST_TOKEN,
});pages/api/track.js
import { redis } from "../../lib/redis";
export default async function handler(req, res) {
const id = req.query.id || "unknown";
const log = {
id,
time: new Date().toISOString(),
ip: req.headers["x-forwarded-for"] || "unknown",
userAgent: req.headers["user-agent"] || "unknown",
};
try {
await redis.lpush("logs", JSON.stringify(log));
} catch (err) {
console.error(err);
}
const pixel = Buffer.from(
"iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR4nGNgYAAAAAMAASsJTYQAAAAASUVORK5CYII=",
"base64"
);
res.setHeader("Content-Type", "image/png");
res.setHeader("Cache-Control", "no-store, no-cache, must-revalidate");
res.status(200).end(pixel);
}pages/api/logs.js
import { redis } from "../../lib/redis";
export default async function handler(req, res) {
try {
const logs = await redis.lrange("logs", 0, 100);
res.status(200).json(logs.map(JSON.parse));
} catch (err) {
res.status(500).json({ error: "Failed to fetch logs" });
}
}npm run dev
Test endpoints:
<img src="http://localhost:3000/api/track?id=user123" width="1" height="1" />- Push code to GitHub
- Import into Vercel
- Add environment variables
- Deploy
- Email clients may cache images
- Apple Mail preloads images
- GitHub README may cache requests
- Dashboard UI
- Campaign tracking
- Click tracking
- Webhooks
- Analytics charts
- Pixel returns 200
- Logs stored correctly
- Logs API returns data
- Works locally and after deployment