Razorpay revenue analytics for WordPress
This guide adds ProductLense to a WordPress site and connects Razorpay, so every Razorpay payment is attributed to the channel, campaign and landing page that first brought the customer. It takes four steps and about ten minutes.
1. Add ProductLense to WordPress
The script goes in a header code plugin, or wp_head in functions.php. Replace SITE_ID with the id from Settings → Sites.
<?php
add_action('wp_head', function () {
echo '<script defer data-site="SITE_ID" src="https://api.productlense.app/a.js"></script>' . "\n";
});2. Identify signed-in users
<?php
add_action('wp_footer', function () {
if (!is_user_logged_in()) return;
$user = wp_get_current_user();
printf(
'<script>window.productlense=window.productlense||function(){(window.productlense.q=window.productlense.q||[]).push(arguments)};window.productlense("identify",%s,{email:%s});</script>',
wp_json_encode((string) $user->ID),
wp_json_encode($user->user_email)
);
});3. Connect Razorpay
Setup steps
- In Razorpay, open Account & Settings → API Keys and generate a live key pair.
- In ProductLense, open Settings → Billing connections → Razorpay and paste the key id and secret.
- In Razorpay Dashboard → Webhooks, add a webhook endpoint with the URL ProductLense shows after you save the connection (pattern https://api.productlense.app/api/webhooks/{provider}/{connection_id}).
- Set a webhook secret, tick the events listed below, and paste the same secret into ProductLense.
- ProductLense backfills 12 months of payments and refunds. INR amounts are converted to USD at the ECB daily rate and kept in INR too.
Credentials and permissions
| Field | Secret | Where to find it |
|---|---|---|
| Key ID | No | rzp_live_... from Razorpay Dashboard → Account & Settings → API Keys. |
| Key secret | Yes, encrypted at rest | The secret paired with the key id. |
| Webhook secret | Yes, encrypted at rest | The secret you set when creating the webhook in Razorpay Dashboard → Webhooks. |
Webhook
URL pattern, shown with your connection id after you save:
https://api.productlense.app/api/webhooks/razorpay/{connection_id}Events: payment.captured, payment.failed, refund.processed, subscription.activated, subscription.charged, subscription.cancelled
Verification: X-Razorpay-Signature header: HMAC-SHA256 of the raw body.
What ProductLense reads
- Customers
- Customers with email.
- Subscriptions
- Subscriptions; each plan is fetched once and cached for its amount and interval.
- Payments
- Captured payments.
- Refunds
- Processed refunds.
- Fees
- The fee on each payment, which includes GST.
What ProductLense never touches
- Never creates, changes, refunds or cancels anything: read-only API calls and incoming webhooks only.
- Never moves money, issues payouts, or reads bank account details.
- Never sees full card numbers; providers do not expose them.
- Never sends your customer data to the AI model: Ask and the daily insight see aggregates only.
Match payments to your users
Add pl_user_id to the notes of Razorpay customers or payments to match by id rather than email.
const rzp = new Razorpay({
key: 'rzp_live_...',
order_id: order.id,
prefill: { email: user.email },
notes: { pl_user_id: user.id },
});
rzp.open();Razorpay on WordPress: questions
- Where does the ProductLense script go in WordPress?
- In a header code plugin, or wp_head in functions.php. With a header and footer code plugin (for example WPCode), paste the script tag into the site-wide header box and save. The script is about 2.3 KB, loads with defer, sets no cookies, and records route changes in single-page apps through the history API, so no extra router code is needed.
- How do I identify users in WordPress?
- Call window.productlense('identify', userId) once the signed-in user is known, as in the functions.php example on this page. Use the same id you store on Razorpay as pl_user_id, so Razorpay payments match by id rather than by email.
- Does ProductLense work with Razorpay?
- Yes. ProductLense connects to Razorpay with key ID, key secret, webhook secret, backfills 12 months of history, and stays current through signed webhooks plus a nightly reconcile. One connection is included on Starter; Growth and Scale allow every provider at once on the same site.
- What data does ProductLense read from Razorpay?
- Customers, subscriptions, payments, refunds and fees, read-only. Payments: captured payments. Refunds: processed refunds. Fees: the fee on each payment, which includes GST.
- Can ProductLense change anything in my Razorpay account?
- No. ProductLense only makes read calls and receives webhooks. It never creates, changes, refunds or cancels anything, never moves money, and never sees card numbers. Credentials are encrypted at rest, and the AI features only ever see aggregated numbers, never your customers’ data.
Free up to 10k events a month. No card.
Add the script, connect Stripe or any of 14 other billing providers, and see revenue by channel the same day.