PAYIN DOCUMENTATION

Payment Links

Payment Links are a PayIn Cloud no-code feature for accepting cryptocurrency payments with shareable links. PayIn Open does not ship this no-code feature or a dashboard app; self-hosted deployments should use the Order Payment API or build their own console-backed link flow.

Payment Links are PayIn Cloud no-code dashboard features. PayIn Open does not ship a no-code dashboard app; for self-hosted deployments, create equivalent payment flows through the Order Payment API or your own console.

Key Characteristics:

  • 🚫 Cloud-only no-code flow - Not shipped in PayIn Open
  • πŸ”— Share anywhere - Email, WhatsApp, social media, QR code
  • πŸ’° Flexible pricing - Fixed amount or custom amount
  • 🌐 Multi-chain - Support multiple networks and tokens
  • πŸ“Š Track payments - Monitor payments in the PayIn Cloud dashboard
  • πŸ“¦ Inventory control - Limit quantity for tickets/products

Understanding when to use Payment Links:

Feature Payment Links Order Payment API
Setup PayIn Cloud no-code flow Requires development
Sharing Public URL/QR code Programmatic integration
Use Case Manual sharing, simple needs Automated systems, e-commerce
Customization Limited (via UI) Full control (via code)
Payment Tracking Dashboard only Dashboard + Webhooks + API
Best For Freelancers, small businesses Developers, businesses with systems

When to use Payment Links:

  • Freelancer invoicing
  • Event ticket sales
  • Course enrollment fees
  • Consulting service payments
  • Donation collections
  • Small business payments
  • One-time product sales

Quick Start

  1. Log in to PayIn Cloud (Cloud-only feature)
  2. Navigate to Payment Links in the sidebar
  3. Click Create Payment Link
  4. Fill in the details:
    • Title: "Consulting Service - 1 Hour"
    • Amount: 50 USDT
    • Currency: Select USDT
    • Chains: Select ethereum-sepolia, polygon-amoy
  5. Click Create Draft

Step 2: Customize (Optional)

  • Add a Description: Explain what the payment is for
  • Set Inventory: Limit to specific quantity (e.g., 10 tickets)
  • Set Expiration: Auto-expire after a date
  • Add Metadata: Track internal information

Step 3: Publish

  1. Click Publish on your payment link
  2. A unique URL is generated (e.g., payin.com/p/abc123XYZ)
  3. Copy the link or QR code

Step 4: Share

Share your payment link via:

  • πŸ“§ Email: Copy and paste the link
  • πŸ’¬ Messaging: WhatsApp, Telegram, etc.
  • πŸ“± QR Code: Download and print
  • 🌐 Website: Add link to your site
  • πŸ“± Social Media: Share on Twitter, Facebook

Step 5: Get Paid

  1. Customer clicks your link
  2. Customer selects chain and pays
  3. You receive notification
  4. Payment appears in the PayIn Cloud dashboard

tip Test First Use testnet links to test the complete flow before sharing mainnet links to customers.

Minimum required fields:

{
  "title": "Consulting Service - 1 Hour",
  "amount": "50",
  "currencies": [
    {
      "currency": "USDT",
      "chainOptions": ["ethereum-sepolia", "polygon-amoy"],
      "is_primary": true
    }
  ]
}

What customers see:

  • Title: "Consulting Service - 1 Hour"
  • Price: 50 USDT
  • Available chains: Ethereum Sepolia, Polygon Amoy
  • Customer selects chain and pays
{
  "title": "Web Development Course",
  "description": "Complete 12-week course including:\nβ€’ Frontend development\nβ€’ Backend APIs\nβ€’ Deployment guide\nβ€’ Lifetime access",
  "amount": "299",
  "currencies": [
    {
      "currency": "USDT",
      "chainOptions": ["ethereum-sepolia", "polygon-amoy"],
      "is_primary": true
    }
  ]
}

Benefits:

  • Clear explanation of what they're paying for
  • Builds trust and reduces confusion
  • Supports markdown formatting
{
  "title": "Premium Membership",
  "amount": "99",
  "currencies": [
    {
      "currency": "USDT",
      "chainOptions": ["ethereum-sepolia", "polygon-amoy"],
      "is_primary": true
    },
    {
      "currency": "USDC",
      "chainOptions": ["ethereum-sepolia", "polygon-amoy"],
      "amount": "99"
    }
  ]
}

What customers see:

  • Can choose between USDT or USDC
  • Same price in both currencies
  • All supported chains available
{
  "title": "VIP Event Ticket",
  "description": "Annual Tech Conference 2025\nDate: June 15-17\nVenue: San Francisco",
  "amount": "500",
  "inventoryTotal": 100,
  "currencies": [
    {
      "currency": "USDT",
      "chainOptions": ["ethereum-sepolia"],
      "is_primary": true
    }
  ]
}

Features:

  • Limited to 100 tickets
  • Shows "X remaining" to customers
  • Automatically stops accepting payments when sold out
  • Tracks reserved (pending payment) vs sold (completed)
{
  "title": "Early Bird Discount",
  "description": "Limited time offer - ends Dec 31, 2025",
  "amount": "79",
  "expiresAt": "2025-12-31T23:59:59Z",
  "currencies": [
    {
      "currency": "USDT",
      "chainOptions": ["ethereum-sepolia", "polygon-amoy"],
      "is_primary": true
    }
  ]
}

Features:

  • Automatically expires at specified date/time
  • Customers cannot pay after expiration
  • Shows countdown timer on payment page
{
  "title": "Donation",
  "description": "Support our open source project",
  "amount": "0",
  "currencies": [
    {
      "currency": "USDT",
      "chainOptions": ["ethereum-sepolia", "polygon-amoy"],
      "is_primary": true
    }
  ]
}

Features:

  • Customer enters their own amount
  • Useful for donations, tips, variable pricing
  • Set amount to "0" for custom amount

warning Custom Amount Validation Set minimum amount validation on payment page to avoid very small payments that might not cover transaction costs.

Payment links have two states:

1. Draft (draft)

  • Not publicly accessible
  • Can be edited freely
  • No slug/URL assigned yet
  • For preparation and testing

2. Published (published)

  • Publicly accessible via unique URL
  • Limited editing (cannot change pricing fundamentals)
  • Has unique slug (e.g., abc123XYZ)
  • Ready for customers

tip Publishing Workflow Create links as drafts β†’ Test internally β†’ Publish when ready β†’ Share with customers

Can always edit:

  • βœ… Title
  • βœ… Description
  • βœ… Inventory total (can increase or decrease)
  • βœ… Expiration date
  • βœ… Metadata

Cannot edit after publishing:

  • ❌ Amount (create new link instead)
  • ❌ Currencies
  • ❌ Chain options
  • ❌ Slug (auto-generated on publish)

To make major changes:

  1. Archive the old link
  2. Create a new link with updated details
  3. Publish and share new link

Archive payment links that are no longer needed:

When to archive:

  • Event is over
  • Product is sold out permanently
  • Promotion has ended
  • Service no longer offered

Effects of archiving:

  • Link becomes inaccessible
  • Existing payments remain in history
  • Can be restored if needed
  • Helps keep your PayIn Cloud dashboard organized

Viewing Payment History

For a specific link:

  1. Go to the PayIn Cloud Payment Links dashboard
  2. Click on a payment link
  3. View Orders tab
  4. See all payments for this link

Statistics shown:

  • Total orders: All payment attempts
  • Completed orders: Successful payments
  • Pending orders: Awaiting payment/confirmation
  • Expired orders: Timed out or expired
  • Total revenue: Sum of completed payments
  • Reserved inventory: Pending payments
  • Sold inventory: Completed payments

Use Cases

Freelancer Invoice

Scenario: Web developer invoicing a client for completed work.

{
  "title": "Website Development - Project Alpha",
  "description": "Delivered items:\nβ€’ Homepage design\nβ€’ 5 content pages\nβ€’ Contact form\nβ€’ 2 rounds of revisions\n\nPayment due within 7 days",
  "amount": "2500",
  "expiresAt": "2025-02-07T23:59:59Z",
  "currencies": [
    {
      "currency": "USDT",
      "chainOptions": ["ethereum", "polygon"],
      "is_primary": true
    },
    {
      "currency": "USDC",
      "chainOptions": ["ethereum", "polygon"],
      "amount": "2500"
    }
  ],
  "metadata": {
    "project_id": "proj_alpha_2025",
    "client_name": "Acme Corp",
    "invoice_number": "INV-2025-001"
  }
}

Workflow:

  1. Create payment link for project
  2. Email link to client: "Pay invoice via crypto: [link]"
  3. Client pays using their preferred chain
  4. Receive notification when paid
  5. Mark invoice as paid in your system

Event Ticket Sales

Scenario: Tech conference selling 500 VIP tickets.

{
  "title": "TechConf 2025 - VIP Pass",
  "description": "Includes:\nβ€’ All conference sessions\nβ€’ VIP networking events\nβ€’ Speaker dinner\nβ€’ Conference swag bag\n\nDates: June 15-17, 2025\nVenue: San Francisco Convention Center",
  "amount": "499",
  "inventoryTotal": 500,
  "expiresAt": "2025-06-01T00:00:00Z",
  "currencies": [
    {
      "currency": "USDT",
      "chainOptions": ["ethereum", "polygon"],
      "is_primary": true
    }
  ],
  "metadata": {
    "event_id": "techconf_2025",
    "ticket_type": "vip",
    "venue": "SF Convention Center"
  }
}

Workflow:

  1. Create payment link for tickets
  2. Add link to event website
  3. Share on social media
  4. Monitor sales in the PayIn Cloud dashboard
  5. Send ticket fulfillment emails (manual or automated)

Online Course Enrollment

Scenario: Educational platform selling course access.

{
  "title": "Complete Python Bootcamp",
  "description": "Learn Python from zero to hero!\n\nβœ“ 60 hours of video content\nβœ“ 200+ coding exercises\nβœ“ 12 real-world projects\nβœ“ Certificate of completion\nβœ“ Lifetime access\nβœ“ Money-back guarantee",
  "amount": "149",
  "currencies": [
    {
      "currency": "USDT",
      "chainOptions": ["ethereum", "polygon", "tron"],
      "is_primary": true
    },
    {
      "currency": "USDC",
      "chainOptions": ["ethereum", "polygon"],
      "amount": "149"
    }
  ],
  "metadata": {
    "course_id": "python_bootcamp",
    "platform": "learn.example.com",
    "access_duration": "lifetime"
  }
}

Workflow:

  1. Create payment link for course
  2. Add to course landing page
  3. Customer clicks "Enroll Now" β†’ redirects to payment link
  4. After payment, receive webhook (if configured)
  5. Auto-grant course access via webhook handler

Donation Collection

Scenario: Open source project accepting donations.

{
  "title": "Support PayIn Development",
  "description": "Help us build better crypto payment infrastructure!\n\nYour donation helps us:\nβ€’ Maintain and improve PayIn\nβ€’ Add support for more chains\nβ€’ Keep the service free for small businesses\nβ€’ Build developer-friendly tools\n\nEvery contribution matters. Thank you! πŸ™",
  "amount": "0",
  "currencies": [
    {
      "currency": "USDT",
      "chainOptions": ["ethereum", "polygon", "tron"],
      "is_primary": true
    },
    {
      "currency": "USDC",
      "chainOptions": ["ethereum", "polygon"],
    }
  ],
  "metadata": {
    "campaign": "open_source_support",
    "project": "payin"
  }
}

Features:

  • Custom amount (donors choose amount)
  • Multiple chain options for convenience
  • Heartfelt description to encourage donations

Best Practices

Use clear, descriptive titles:

Good Examples:

Consulting Call - 30 Minutes
Web Design Services - Homepage Package
Conference Ticket - Early Bird Price
Python Course - Full Access

Avoid:

Payment          // Too generic
Link 1           // No context
Service          // Vague
Product A        // Unclear

Description Guidelines

Do:

  • βœ… Clearly explain what they're paying for
  • βœ… List specific deliverables or features
  • βœ… Include relevant dates/deadlines
  • βœ… Add terms or conditions if needed
  • βœ… Use bullet points for readability

Don't:

  • ❌ Leave description empty
  • ❌ Use overly technical jargon
  • ❌ Write walls of text
  • ❌ Forget important details

Pricing Strategy

Fixed Amount:

{
  "amount": "99.00",
  "currencies": [
    {
      "currency": "USDT",
      "chainOptions": ["ethereum", "polygon"]
    }
  ]
}
  • Use for: Products, services, tickets with fixed pricing
  • Benefit: Clear expectations, no confusion

Custom Amount:

{
  "amount": "0",
  "currencies": [...]
}
  • Use for: Donations, tips, variable pricing
  • Benefit: Flexibility for customers
  • Warning: Set minimum amount to avoid dust payments

Multi-Chain Strategy

Offer multiple chains for convenience:

{
  "currencies": [
    {
      "currency": "USDT",
      "chainOptions": [
        "ethereum",      // High security
        "polygon",       // Low fees
        "tron"          // Very low fees
      ],
      "is_primary": true
    }
  ]
}

Benefits:

  • Customers choose based on their preference
  • Lower fees on some chains = happier customers
  • Higher conversion rates

Recommendation:

  • Include at least 2 chains
  • Polygon/Tron for low-value payments (< $100)
  • Ethereum for high-value payments (> $1000)

Inventory Management

For limited availability:

{
  "inventoryTotal": 50,
  "title": "Early Bird Special - Limited to 50"
}

Monitor in real-time:

  • Check the PayIn Cloud dashboard for available/reserved/sold counts
  • Update inventory if you add more capacity
  • Archive when sold out

Best practices:

  • Set realistic inventory numbers
  • Mention scarcity in title/description
  • Update customers if sold out

Always test before sharing:

  1. Create testnet link - Use testnet environment first
  2. Test payment flow - Complete a test payment yourself
  3. Verify notifications - Check PayIn Cloud dashboard updates
  4. Check mobile - Test on mobile devices
  5. Share internally - Have team test before public launch

warning Test With Real Amounts Test with realistic amounts to ensure the UX is good. Testing with $0.01 won't reveal issues with $1000 payments.

Email Template:

Hi [Customer Name],

Thank you for your interest in [Product/Service]!

To complete your payment, please click the link below:
[Payment Link URL]

Or scan this QR code:
[QR Code Image]

Payment details:
β€’ Amount: $X USDT/USDC
β€’ Supported networks: Ethereum, Polygon
β€’ Payment window: [if time-limited]

Questions? Reply to this email.

Best regards,
[Your Name]

Social Media Post:

πŸŽ‰ Now accepting crypto payments!

Get [Product/Service Name] with USDT/USDC:
[Payment Link]

βœ… Instant confirmation
βœ… Multiple chains supported
βœ… Secure & transparent

Limited slots available! πŸ‘‡

Troubleshooting

Problem: Customer gets error when accessing link.

Causes:

  • Link is still in draft status (not published)
  • Link has been archived
  • Typo in URL

Solutions:

  1. Verify link status in the PayIn Cloud dashboard (should be "Published")
  2. Check if link is archived (restore if needed)
  3. Copy a fresh URL from the PayIn Cloud dashboard

Payment Not Detected

Problem: Customer paid but payment is not showing in the PayIn Cloud dashboard.

Causes:

  • Wrong network (paid on different chain than selected)
  • Wrong token (paid ETH instead of USDT)
  • Transaction still pending
  • Paid to wrong address

Solutions:

  1. Check transaction on block explorer
  2. Verify correct network and token
  3. Wait for required confirmations
  4. Contact support with transaction hash

Inventory Not Updating

Problem: Inventory count not updating after payment.

Expected Behavior:

  • Reserved: Increments when order created (payment pending)
  • Sold: Increments when payment confirmed
  • Available: Decreases when reserved

If stuck:

  • Check order status (might still be pending)
  • Wait for blockchain confirmations
  • Refresh the PayIn Cloud dashboard

Problem: Need to change amount but link is published.

Solution:

  1. Archive current link
  2. Create new link with updated amount
  3. Publish new link
  4. Share new URL with customers
  5. Inform existing customers of change

tip Keep Old Link Active If customers already have the old link, keep it active until transition is complete. Then archive after grace period.

QR Code Not Working

Problem: Scanning QR code doesn't open payment page.

Causes:

  • QR code contains wrong URL
  • URL is too long for QR code
  • QR code image quality too low

Solutions:

  1. Regenerate the QR code from the PayIn Cloud dashboard
  2. Use URL shortener if needed
  3. Test QR code with multiple apps
  4. Increase QR code size/quality

Advanced Features

Metadata for Tracking

Attach custom data to payment links:

{
  "title": "Consulting Service",
  "amount": "500",
  "metadata": {
    "client_id": "client_12345",
    "project_code": "PROJ-2025-Q1",
    "service_category": "consulting",
    "sales_rep": "john@example.com",
    "campaign": "email_blast_jan_2025"
  }
}

Use metadata for:

  • Internal tracking and reporting
  • Client/project association
  • Sales attribution
  • Campaign tracking
  • Integration with your systems

Access metadata:

  • View in payment link details
  • Included in webhook events
  • Searchable via API

Webhook Integration

Configure webhooks to automate fulfillment:

Event types:

  • paymentlink.order.completed - Payment confirmed
  • paymentlink.order.expired - Order expired without payment

Example webhook handler:

app.post('/webhooks/payin', async (req, res) => {
  const event = req.body;

  if (event.type === 'paymentlink.order.completed') {
    const { paymentLinkId, buyerEmail, amount } = event.data;

    // Auto-fulfill based on payment link
    if (paymentLinkId === 'link_course_python') {
      await grantCourseAccess(buyerEmail);
      await sendWelcomeEmail(buyerEmail);
    } else if (paymentLinkId === 'link_ticket_conference') {
      await generateTicket(buyerEmail);
      await sendTicketEmail(buyerEmail);
    }
  }

  res.status(200).send('OK');
});

API Access

Manage payment links programmatically:

Create via API:

curl -X POST https://your-payin.example.com/api/v1/payment-links \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Product Name",
    "amount": "99",
    "currencies": [...]
  }'

List all links:

curl https://your-payin.example.com/api/v1/payment-links \
  -H "Authorization: Bearer YOUR_API_KEY"

Useful for:

  • Bulk link creation
  • Integration with your CMS
  • Dynamic link generation
  • Automated reporting

Next Steps

Enhance Your Setup

For Developers

Resources

Support

Need help with Payment Links?

  • πŸ“§ Email: support@payin.com
  • πŸ’¬ Discord: Join our community
  • πŸ“š PayIn Cloud dashboard: Built-in help and tutorials for Cloud-only Payment Links