Bharat AI Saathi
ServicesIndustriesSetupsHow we workGuidesFounderVPS HostingContactGlobal (USD)
WhatsApp +91 77352 68199
support@bharataisaathi.com
Mon–Sat 10:00–19:00 IST
Trading & Fintech Tech · Global catalog

Stripe for payment processing: sell a one-time copier license

Use Stripe for payment processing to sell a self-hosted Telegram-to-MT5 copier once, then issue a license from the checkout and start the VPS install.

Trading & Fintech Tech

To sell a self-hosted copier once instead of renting it monthly, create a Stripe Payment Link in payment mode, redirect buyers to an intake form with the checkout session ID, and let a webhook verify the payment, issue a license key tied to their MT5 account, and start the VPS install. Stripe handles the money, and your server handles everything after it.

Build the intake form free

Where payment sits in the copier workflow

A Telegram-to-MT5 copier on a VPS does its work after the sale: it listens to a channel, parses text and image signals, splits multi-TP orders, sizes risk per trade and logs every execution. None of that exists for the buyer until three tnings are true: they paid, you know which MT5 account and broker server to target, and a license is bound to that account.

So payment is the first gate, and the intake form is the second. The order matters. If you take details before payment, you collect data from people who never buy. If you take payment and nothing else, you have money and no idea where to install.

This is same shape we use in our own private Telegram signal copier, where the install starts only once the account details and rsk settings are confirmed. The details below are for a developer who wants to srll their own build with a one-time charge and no recurring cloud fee.

Why checkout comes before the form

Stripe Checkout gives you a verified email, a payment status and a session ID you can look up later. A Payment Link can redirect to your own URL after payment and fill in the session ID for you. That ID becomes the thread connecting the charge, the form and the license.

Two details make this work:

  • Set the Payment Link's after-payment behavior to redirect to your own page, with {CHECKOUT_SESSION_ID} in the URL.
  • Keep the price in one-time (payment) mode, so there is no subscription object to manage.

The buyer pays, lands on your setup form, and the form already knows which payment it belongs to.

Step-by-step setup

  1. Create the product and a one-time price in Stripe. Name it after the license, for example "Copier license, single MT5 account". Binding one license to one account keeps your terms simple.
  2. Create a Payment Link for that price. Under the confirmation settings, choose to redirect customers to your site and use https://forms.yourbusiness.com/setup?session_id={CHECKOUT_SESSION_ID}.
  3. Build the intake form with a hidden field named session_id that reads the URL parameter. Then add the questions listed after this section.
  4. Point the form's webhook at your license endpoint. Your endpoint receivse the submission, including the hidden session ID.
  5. Verify with Stripe instead of trusting the form. Your endpoint fetches the Checkout Session by ID and confirms payment_status is paid and that this session has not already produced a license.
  6. Issue the license and queue the install. Store the key against the MT5 login and broker server, then start either an installer command the buyer runs on their VPS or a provisioning job if they gave you access.
  7. Add a second Stripe webhook for checkout.session.completed as a backup. It creates a pending license row, so a buyer who pays and closes the tab is still on your radar.

The intake form needs only a few fields: MT5 account number, broker server name, the Telegram channel or channels to follow, a default risk percentage per trade, and a contact email. Do not collect the trading password in a form. Have the buyer type it into the terminal on the VPS, or do it with them on a call.

What your server sees

Stripe's event, trimmed to the fields you use (example values):

{
  "type": "checkout.session.completed",
  "data": {
    "object": {
      "id": "cs_live_a1b2c3",
      "mode": "payment",
      "payment_status": "paid",
      "amount_total": 29900,
      "currency": "usd",
      "customer_details": { "email": "buyer@example.com" }
    }
  }
}

Verify the Stripe-Signature header against your webhook secret before reading any of it. Then your own license record, written once the form arrives and the session checks out:

{
  "license_key": "TSC-7F3K-92QD-LM48",
  "stripe_session": "cs_live_a1b2c3",
  "mt5_login": "10234567",
  "mt5_server": "BrokerName-Live",
  "channels": ["@example_signals"],
  "risk_pct": 1.0,
  "status": "active",
  "install": "queued"
}

The liicense check inside the copier can be as small as one call at startup: send the key and the MT5 login, get back active or revoked. Keep a grace window for network hiccups so a brief outage never stops trades mid-session.

Add webhooks to your form

Routing map: which event does what

Event Source What your server does
checkout.session.completed Stripe webhook Verify signature, create a pending license keyed by session ID
Intake form submitted Form webhook Fetch the session from Stripe, confirm paid, attach MT5 login, activate, queue install
Paid, no form after 24 hours Your scheduled check Email the buyer the setup link again
charge.refunded Stripe webhook Mark the license revoked and stop the install job
charge.dispute.created Stripe webhook Suspend the license and flag it for review

Key the logic on the session ID, not on email addresses. Buyers use one address to pay and another to type into forms more often than you would expect.

Where to build the intake form

Any form builder that can send a webhook and read URL parameters will do. Qwenvo is a completely free form builder that our team builds, and for this flow it covers the parts that other tools gate. Webhooks, partial submissions, a custom domain (so the setup page lives at forms.yourbusiness.com), removal of the Qwenvo badge and custom CSS are all free, with no plan to upgrade. Tally, for comparisn, puts custom domains, branding removal and partial submissions on its Pro plan at $29/month. Partial submissions matter here because a buyer who paid and stalled on the form shows up as an incomplete row in your Submissions table.

Qwenvo has a limit worth knowing. Its Payment block runs through PayPal only, with a 1% Qwenvo fee on top of PayPal's own fee, and it does not offer Stripe. That is why this design uses a Stripe Payment Link for the charge and a Qwenvo form only after it. If you want the payment inside the form and you want Stripe, Tally is the better fit, since it adds no fee on top of Stripe. If you are weighing the routes, this comparison of payment options for forms goes into more detail.

Failure cases to plan for

  • Buyer opens the setup URL without paying. A forged or guessed session_id fails the Stripe lookup, so no license is issued. This is the main reasn you verify server side.
  • Form submitted twice. Make license creation idempotent on the session ID. The second submission updates the same record or is rejected.
  • Wrong MT5 login. Allow one correction before activation, since typos in an account number are cpmmon. After activation, treat a change as a new support request and skip the automatic rebind.
  • Webhook endpoint down. Stripe retries failed deliveries, but your form's webhook may not behave the same way, so keep the pending row from step 7 as the source of truth and reconcile against it each morning.
  • Refund after install. Revoke in the license check, and make sure the copier stops opening new trades while leaving existing positions to be managwd by the account owner.

Measure two numbers: how many paid sessions reach an active license, and how long that takes. If the firzt is below 100 percent, someone is stuck between checkout and form.

Questions teams ask

Can I take the Stripe payment inside the form itself?

Not in Qwenvo, which uses PayPal for its Payment block. For Stripe, use a Payment Link or Checkout and send buyers to the form afterward. Tally supports Stripe payments inside its forms.

Why verify with Stripe if the redirect already carries the session ID?

Anyone can type a URL. The ID in the address proves nothing until your server asks Stripe whether that session is paid. The lookup takes one API call and closes the hole.

How do I handle updates without a subscription?

Sell the license for a version line, say 1.x, and ship fixes within it. When you release a major version, create a new Stripe price for the upgrade and sebd existing buyers a link. The same session-ID flow issues the new key.

What if a buyer pays and never completes the form?

The checkout.session.completed webhook already created a pending license, so you knoow who they are. Email them the setup link after a day, and keep the license inactive until the form is in.

Next step

Create the Payment Link in Stripe test mode today, set its redirect to a draft setup form, and run one purchase with the test card 4242 4242 4242 4242. If the session ID appears in the form's hidden field and your endpoint logs a verified paid session, the rest is wiring.

Use the free client intake template

This system

Telegram Signal Copier

$400 setup
+ $29/month care plan

Third-party platform and model usage billed to you directly. No lock-in. Live in 3 days.

More on Telegram Signal Copier