Set up Paisaify for UPI

Take UPI payments straight into your bank account with no gateway fee. Pick your setup and follow the steps.

WordPress and WooCommerce

No server to run. The plugin does everything inside your site.

  1. In WordPress open Plugins, Add New, Upload Plugin. Choose paisaify-wp-plugin.zip, press Install Now, then Activate.
  2. Open Paisaify, Settings. Fill in Your UPI ID and Payee name, tick Enable, and press Save. You will see a small "Saved" message at the bottom.
  3. Shop checkout: open WooCommerce, Settings, Payments and switch on Paisaify for UPI (zero fee).
  4. Donations: in Paisaify, Settings, Donations choose Take donations: Yes, then put [paisaify_donate] on any page. Skip this step if you do not take donations.
  5. Connect the phone that receives your bank SMS (next section).
  6. Test with a small order or a ₹1 payment link from Paisaify, Transactions, New payment link. Pay it from a UPI app and watch it turn Paid.
  7. Optional: switch on alerts in Paisaify, Settings (ntfy and Telegram are free). Each group has step-by-step help.

Any other website

A small server (Node.js) watches your bank SMS and tells your site when a payment arrives. You set it up once and it can serve many sites.

1. Get a place to run it

You need Node.js 22.13 or newer (24 is best), a folder that is kept between restarts, and a https address. Pick any host below. The upload steps differ a little, and the settings are the same everywhere.

Hostinger (Node.js Web Apps)
  1. Websites, Add website, Node.js Apps. Upload paisaify-core-deploy.zip.
  2. Choose Node 22 or 24. Set the entry file to server.js.
  3. Add the settings as environment variables, then deploy. Point a subdomain such as pay.yourshop.com at the app.
cPanel hosts ("Setup Node.js App")
  1. In File Manager upload the zip into a new folder, for example paisaify, and Extract it.
  2. Open Software, Setup Node.js App, Create Application. Node version 22 or newer (if only older versions are offered, use a VPS), mode Production, application root paisaify, your subdomain as the application URL, startup file server.js.
  3. Add the settings under Environment variables on the same screen. Press Create, then Restart. There is nothing to install: Paisaify uses no extra packages.
A VPS (Hetzner, DigitalOcean, Contabo, Lightsail)
  1. On Ubuntu install Node 24, then unzip the file into /opt/paisaify and copy .env.example to .env. Fill in the settings.
  2. Keep it running with systemd. Save this as /etc/systemd/system/paisaify.service:
[Unit]
Description=Paisaify
After=network.target
[Service]
WorkingDirectory=/opt/paisaify
ExecStart=/usr/bin/node server.js
Restart=always
Environment=PORT=4900
[Install]
WantedBy=multi-user.target

Run systemctl enable --now paisaify. For https, install Caddy and use this Caddyfile (it gets the certificate by itself):

pay.yourshop.com {
  reverse_proxy localhost:4900
}

Set TRUST_PROXY=yes because Caddy sits in front.

Railway, Render or Fly.io

Create a service from the zip or your repository. Start command node server.js, Node 22 or newer. Add the settings as variables. Attach a persistent volume (for example at /data) and set DB_PATH=/data/paisaify.sqlite, otherwise payments are lost on every deploy. Choose a plan that stays awake: a service that sleeps will miss your phone's messages.

Your own computer (to start)

Run node server.js and expose it with a Cloudflare Tunnel to get a https address. It works while the computer and internet stay on, so use a proper host before real customers.

What will not work

Plain PHP-only shared hosting (no Node.js), and serverless or edge platforms such as Cloudflare Workers and Vercel functions (no long-running process or writable disk). On PHP hosting use the WordPress plugin if your site is WordPress.

2. Upload and start

  1. Upload paisaify-core-deploy.zip to the host. On Hostinger: Websites, Add website, Node.js Apps, upload the zip, choose Node 22 or 24, and set the entry file to server.js.
  2. Add the settings below as environment variables in the host's panel.
  3. Deploy. Open your-address/admin and sign in with your ADMIN_TOKEN. If you see the dashboard, the server works.
PUBLIC_URLThe https address of your Paisaify server, for example https://pay.yourshop.com. No slash at the end.
VPAYour own UPI ID where money should arrive, for example yourname@okhdfcbank.
PAYEEThe name customers see in their UPI app.
WEBHOOK_SECRETA long random password (40 or more characters). Your phone uses it. Make one with a password generator.
ADMIN_TOKENAnother long random password. This is how you sign in to your dashboard at /admin. Keep it private.
ALLOWED_ORIGINSThe websites allowed to use this server, for example https://yourshop.com. Separate several with commas.
DB_PATHA folder that survives restarts, for example /home/YOURUSER/paisaify-data/paisaify.sqlite. Create the folder first.
PRODUCTSWhat you sell: slug|price|Title|thank-you page. Example: report|499|My Report|https://yourshop.com/thanks. Several items separated by a semicolon.

Everything else is optional. Donations, email, alerts and WhatsApp are set later from the dashboard, with no file editing.

3. Activate with your key

Open your-address/admin, sign in with your ADMIN_TOKEN, and you will see Activate your copy. Paste the key that came with your purchase (it looks like PSFY-XXXX-XXXX-XXXX-XXXX) and press Activate. One key works on one installation. Without activation the dashboard stays locked, and after 7 days payments stop too.

4. Put the pay box on your site

Selling one thing from a static site (the price always comes from your server, so nobody can change it in the browser):

const r = await fetch('https://pay.yourshop.com/api/checkout', {
  method: 'POST', headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({ product: 'report', consent: true, fields: { name, email, phone } }),
});
const { ok, html, error } = await r.json(); // html is the pay box. Show it on your page.

Donations (add your site to ALLOWED_ORIGINS and switch on donations in Settings):

<div data-paisaify-donate data-api="https://pay.yourshop.com/api"></div>
<script src="https://pay.yourshop.com/assets/donate.js" defer></script>

A shop that has its own server can create payments with the API. See the API section below.

5. Connect the phone, set alerts, test

Use the next sections. Then make a ₹1 payment link from Transactions, New payment link, pay it, and watch it turn Paid.

Connect your phone

Your phone is the eye of the system. It sees the "money received" text from your bank and tells the server. Use the phone that receives your bank SMS and keep it on with signal.

Android app

Download from this server's app page. Open your dashboard, find Paisaify app, press Show pairing code, then scan it in the app. Allow notification access and set battery to Unrestricted.

Android, no app

Install the free MacroDroid from Google Play. In your dashboard press Download rule file, send it to the phone, open it with MacroDroid and switch the rule on.

iPhone

iPhone cannot run the app. Use the Shortcuts app: Automation, Message contains credited, Run Immediately, action Get Contents of URL with the link from your dashboard. The dashboard shows the exact steps.

Keep the Paisaify app running (by phone brand)

Many phones stop apps they think you are not using. That would stop bank SMS reaching the server. The app has a Keep running screen that finds your brand and opens the right settings. The short version:

  • Xiaomi, Redmi, Poco: Security app, Autostart, switch Paisaify on. Settings, Apps, Paisaify, Battery saver, No restrictions. Open Recents, pull the Paisaify card down and tap the lock.
  • Realme, Oppo: Settings, Apps, Paisaify, allow Auto launch and Allow background activity. Battery, Unrestricted. Lock the card in Recents.
  • Vivo, iQOO: Settings, Battery, Background power consumption, Paisaify, Allow. Also allow Autostart in the i Manager app. Lock the card in Recents.
  • Samsung: Settings, Apps, Paisaify, Battery, Unrestricted. Settings, Battery, Background usage limits: take Paisaify out of Sleeping apps. Lock the card in Recents.
  • OnePlus: Settings, Apps, Paisaify, Battery, Allow background activity. Lock the card in Recents.
  • Motorola and stock Android (Pixel, Nokia): Settings, Apps, Paisaify, Battery, Unrestricted.

The menu names change a little between software versions. If the server sees no sign of a phone for 30 minutes during the day (7am to 11pm), it sends you an alert, and another when the phone is back. Background tips inspired by dontkillmyapp.com.

Alerts and receipts

All optional. Each one is free to start, and each has step-by-step help with links inside Settings.

Phone alerts (ntfy)

Free, no account. Install the ntfy app, then press Turn on phone alerts on the dashboard and scan the code.

Telegram

Free. Make a bot with @BotFather, paste its token in Settings, and press Start on your bot.

Email receipts

Create a Resend account, verify your domain, paste the API key in Settings. Receipts then go out as PDFs.

WhatsApp receipts

Free one-tap sending is built in. For automatic messages connect your own WhatsApp Business account in Settings. Meta charges per message.

Alerts carry only the amount and a reference number, never a customer's name, phone or email.

For developers: the API

Create a payment from your own server and get told when it is paid.

Add MERCHANT_API_KEY to the server settings, then:

curl -X POST https://pay.yourshop.com/api/v1/payments \
  -H "Authorization: Bearer $MERCHANT_API_KEY" -H "Content-Type: application/json" \
  -d '{"amount":"999","reference":"ORD-1042","callback_url":"https://yourshop.com/hooks/upi","return_url":"https://yourshop.com/thanks"}'

Send the customer to the pay_url in the reply. The amount can be up to 99 paise above what you asked, which is how two orders of the same price stay apart. When paid, your callback_url receives a signed message. The full details are in the README inside the zip.

If something is not working

The payment stays "Waiting" after paying
  • Open the dashboard. Is the phone shown as connected, and did a recent SMS arrive?
  • The customer must pay the exact amount with the paise, for example 499.03. That is how we match it.
  • Is the bank's sender code allowed? 87 bank sender codes are built in. Add others under allowed senders in Settings.
  • Set the phone's battery for the app to Unrestricted so Android does not stop it.
GPay or PhonePe says the payment is refused or over the limit

Some apps refuse payment links to a personal UPI ID. Scanning the QR code with the camera, or typing your UPI ID in the "Pay to UPI ID" box on the pay page, both work. A business UPI ID from your bank avoids this. Ask your bank how it settles and whether it sends a text for each payment.

Android says it blocked the app

Allow your browser to install unknown apps (Settings, Apps, your browser). On Samsung also switch off Auto Blocker while installing. Open the download page again after that.

No alerts arrive

Press Send a test alert on the dashboard. It lists any channel that failed. For Telegram, open your bot and press Start. For ntfy, check the topic in the app matches.

Email receipts do not arrive

The sender address must be on a domain you verified in Resend. Use Send test email in Settings to see the exact error.

The dashboard says "Activate your copy", or payments stopped
  • Paste your key and press Activate. It must be a key from your purchase and it works on one installation.
  • "Already in use on another site" means the key is active on another server. On that server open Settings, Licence, Move this licence, then activate here. You can move a key up to 3 times in 30 days. For anything else, contact Flying Star.
  • If your server cannot reach the internet for a while, nothing breaks: a licence stays valid for 30 days without contact, plus 7 days of grace.
  • Moving to a new server or domain? Move the licence first, then activate on the new one.
I lost the admin token, or I changed phones

The token is the ADMIN_TOKEN in your host's settings. For a new phone, make a fresh pairing code, then remove the old phone from the Paisaify app card.

Good to know

  • Money goes straight from the customer to your bank. Paisaify never holds it and never sees UPI PINs, cards or bank logins.
  • It is not a payment gateway. It confirms a payment by reading your bank's credit SMS, so it needs the connected phone to stay on.
  • UPI limits still apply, usually ₹1,00,000 per payment.
  • Keep the dashboard private. Your ADMIN_TOKEN opens it.
  • Your key is checked once a day. Flying Star sees only the key, your domain and the app version. Never a payment, a customer or a bank detail.

Paisaify for UPI, a Flying Star product.