Yield ties every visit, referrer and campaign to the payment it produced — on your own server. One number leads every report: what a visitor is actually worth.
1.8 KB gzipped script · no external requests · your database
The core loop
A first-party id, or a daily-rotating anonymous one in cookieless mode.
Every pageview, referrer, UTM set and goal is tied to that id.
The id is stamped onto the checkout link, or set by your server.
The payment webhook arrives and is matched back to the visit.
Revenue per visitor, by channel, campaign and landing page.
What you get
The headline number is what each visitor is actually worth. Pageviews are context, not the point.
The visitor id rides into the payment provider and comes back on the webhook, so revenue lands on the campaign that earned it.
See who is on the site now, what they are reading, and which sessions look like the ones that pay.
Ordered, multi-step funnels with per-step drop-off, and a reserved goal vocabulary your provider fills in automatically.
A daily-rotating anonymous id derived server-side. No cookie, no consent banner, same revenue reporting.
Share a read-only report with a client or your audience. Password protect it, or hide revenue entirely.
Web and mobile
A Livewire dashboard for the desk and a Flutter app for iOS and Android. Figures are formatted on the server, so the two surfaces can never disagree about what you earned.
Points at this demo install. iOS ships as source in the package; build it against your own server.
Signature-verified webhooks, with a generic Payment API for anything else.
Reserved goals, understood out of the box
On your server, in your database. Yield is a script you install — nothing about your visitors or your revenue is sent anywhere else.
The tracking script is 1.8 KB gzipped, loads deferred, and never blocks rendering. The endpoint it posts to validates and queues, then returns.
Only to see revenue. Traffic reporting works on its own. Stripe, Paddle, Lemon Squeezy, Polar and Paystack have native handlers, and anything else can post to the Payment API.
It is still recorded, flagged as unattributed, and shown in the webhook log with the reason. A scheduled job retries attribution as soon as the missing identifier appears.
Yes. It needs PHP 8.2+, MySQL or MariaDB, one cron entry and a queue worker. Mail goes over HTTPS rather than SMTP, which is what usually breaks on shared hosts.