Procare Pay Integration Service

Complete API Documentation for Payment Processing

Value Added Services for Transaction Processing

Overview: Value Added Services are optional features that enhance your transaction processing capabilities, reduce costs, and improve the payment experience for your customers. These services work automatically when enabled on your transaction sale requests, providing intelligent protection and insights without requiring additional coding or complexity.

POST /v1/rest/merchants/{merchantId}/transactions (with value-added services enabled)
Cost Savings & Benefits:

Value Added Services can save your business money while protecting your customers from common payment issues. Enable these services on your transaction requests to automatically receive these benefits at no additional cost.

Available Value Added Services

1. Category 1 Decline Reattempt Protection Save $0.10 per declined reattempt

What is this service?

Category 1 Decline Reattempt Protection prevents you from wasting money on transactions that will never succeed. When a credit card or bank account transaction is declined by the card network or bank, the decline comes with a specific reason code. Some of these reason codes indicate permanent problems that will never be resolved by simply trying again—for example, a lost or stolen card, a closed account, or an invalid card number.

Despite this, many payment systems automatically retry failed transactions multiple times, hoping they'll eventually go through. Every retry attempt costs money in processing fees (typically $0.10 or more per attempt), even though the transaction will never succeed. This service intelligently identifies these "Category 1" declines and prevents wasteful retry attempts.

Real-World Example:

Imagine you run a subscription service that bills 10,000 customers monthly. If 200 customers have expired or cancelled cards, and your system retries each one 3 times before giving up, that's 600 unnecessary transaction attempts at $0.10 each = $60 wasted per month or $720 per year. Category 1 Decline Reattempt Protection eliminates these wasteful retries.

How It Works

When you submit a transaction, the payment processor returns a decline code if the transaction cannot be completed. Category 1 Decline Reattempt Protection analyzes this code and categorizes it:

Category 1 Declines (DO NOT RETRY - Will Never Succeed):
  • Lost or Stolen Card: Card has been reported as lost or stolen by the cardholder
  • Card Restricted: Card has been blocked or restricted by the issuing bank
  • Invalid Card Number: Card number is mathematically invalid or doesn't exist
  • Closed Account: The bank account or credit card account has been closed
  • Expired Card: Card has expired and is no longer valid
  • Invalid CVV: Security code is incorrect (unlikely to succeed on retry)
  • Card Not Activated: New card hasn't been activated by cardholder yet
  • Do Not Honor: Bank explicitly declined the transaction permanently
Category 2 Declines (MAY RETRY - Temporary Issues):
  • Insufficient Funds: Customer might add money and retry could succeed
  • Communication Error: Technical issue that might resolve on retry
  • Issuer Unavailable: Bank's system is temporarily down
  • Daily Limit Exceeded: Customer might retry tomorrow successfully

Response Information

When Category 1 Decline Reattempt Protection identifies a permanent decline, the transaction response includes:

Field Description Example Value
declineCategory The category of decline (1 = do not retry, 2 = may retry) "1" or "2"
declineCategoryDescription Human-readable explanation of the category "Do Not Retry - Permanent Decline"
responseCode Original decline code from the processor "14" (Invalid Card Number)
responseMessage Description of why the transaction was declined "Invalid card number"

Benefits

  • Cost Savings: Save $0.10 per reattempt on permanently declined transactions
  • Reduced Processing Time: Stop wasting time retrying transactions that will never succeed
  • Better Customer Experience: Notify customers immediately of permanent issues instead of repeatedly charging them
  • Lower Churn: Proactively reach out to update payment methods instead of failed retry emails
  • Cleaner Reporting: Reduce noise in your decline reports by excluding hopeless retries
  • Automatic Intelligence: No coding required - service automatically analyzes every decline

Comparison: With vs. Without Protection

Scenario Without Protection With Protection
Expired card is declined System retries 3 times over 3 days
Cost: 3 × $0.10 = $0.30
Result: Still failed
System recognizes Category 1
Cost: $0.00 (no retries)
Result: Customer notified immediately
Lost/stolen card is declined System retries 3 times
Cost: 3 × $0.10 = $0.30
Result: Still failed
System recognizes Category 1
Cost: $0.00 (no retries)
Result: Customer contacted for new card
Insufficient funds decline System retries after customer adds funds
Result: Transaction succeeds on retry
System recognizes Category 2
Allows intelligent retry
Result: Transaction succeeds on retry

How to Use This Service

Category 1 Decline Reattempt Protection is automatically enabled on all transaction requests. When you receive a declined transaction response, check the declineCategory field:

{
  "status": "Declined",
  "responseCode": "14",
  "responseMessage": "Invalid card number",
  "declineCategory": "1",
  "declineCategoryDescription": "Do Not Retry - Permanent Decline",
  "transactionId": "123456789",
  // ... other fields
}
        

In Your Code:

if (response.Status == "Declined") {
    if (response.DeclineCategory == "1") {
        // Category 1: Do NOT retry this transaction
        // Contact customer to update payment method
        NotifyCustomerOfPermanentDecline(customer, response.ResponseMessage);
        UpdatePaymentMethodStatus(paymentMethod, "Invalid");
    } else if (response.DeclineCategory == "2") {
        // Category 2: Temporary issue - may retry later
        ScheduleRetryAttempt(transaction, retryInHours: 24);
    }
}
        

2. Duplicate Check

What is this service?

Duplicate Check protects your customers from being accidentally charged multiple times for the same purchase. This can happen when a customer double-clicks a "Pay Now" button, when a network error causes a page to reload and resubmit, or when your system experiences a temporary glitch that sends the same transaction request twice.

Getting charged twice for the same item is frustrating for customers and creates extra work for your support team to process refunds. Even worse, it damages customer trust and can lead to chargebacks. Duplicate Check automatically detects and prevents these duplicate transactions before they're processed.

Without Duplicate Check:

A customer with a $500 shopping cart experiences a network timeout error. They click "Submit Payment" again, not realizing the first transaction went through. Result: Customer is charged $1,000 instead of $500. Customer sees two charges on their credit card statement, calls your support line upset, and you have to process a refund and explain what happened. Customer trust is damaged.

With Duplicate Check:

The second identical transaction is automatically detected and blocked within seconds of the first. The customer sees a message: "This transaction has already been processed." Their card shows only one $500 charge. No refund needed. No support call. Customer is happy.

How It Works

Duplicate Check analyzes each incoming transaction and compares it against recent transactions (typically within the last 5 minutes) using multiple data points:

Duplicate Detection Criteria (All Must Match):
  • Same Merchant: Transaction is for the same merchant account
  • Same Amount: Transaction amount matches exactly (e.g., both are $99.99)
  • Same Payment Method: Same credit card or bank account is used
  • Same Time Window: Transactions occur within a short time period (typically 5 minutes)
  • Same Transaction Type: Both are sales (not refunds or voids)

If all criteria match, the second transaction is flagged as a duplicate and rejected before processing, preventing the double charge from ever occurring.

Response Information

When a duplicate transaction is detected, you receive a specific response indicating the duplication:

Field Description Example Value
status Transaction status "Declined"
responseCode Specific code indicating duplicate "19" (Duplicate Transaction)
responseMessage Human-readable explanation "Duplicate transaction detected"
isDuplicate Boolean flag for easy checking true
originalTransactionId Transaction ID of the original (successful) transaction "987654321"

Benefits

  • Customer Protection: Prevents customers from being charged twice for the same purchase
  • Reduced Refunds: Eliminates the need to process refunds for duplicate charges
  • Lower Support Costs: Reduces customer support calls about duplicate charges
  • Fewer Chargebacks: Customers won't dispute charges when they see duplicate amounts
  • Improved Trust: Customers feel confident your payment system is reliable and fair
  • Automatic Protection: Works behind the scenes without requiring special coding
  • Detailed Logging: Provides reference to original transaction for audit purposes

Common Scenarios Prevented

Scenario What Happens Result with Duplicate Check
Double-click on submit button Browser sends two identical payment requests First transaction processed, second blocked
Network timeout causes page reload Customer resubmits thinking payment failed System detects original succeeded, blocks retry
Mobile app sends duplicate API call App glitch sends same payment request twice Duplicate detected within milliseconds
Scheduled payment retries too quickly Automated retry happens before timeout expires Duplicate blocked if within detection window

Important: When Duplicates Are Allowed

Duplicate Check is smart enough to know when charges should go through, even if they look similar:

These Are NOT Considered Duplicates:
  • Different amounts: $99.99 and $100.00 are treated as separate transactions
  • Outside time window: Same card used 10 minutes later is a new transaction
  • Different transaction types: A sale followed by a refund is not a duplicate
  • Multiple items: Customer genuinely wants to buy two of the same $50 item = $100 total (different amount)
  • Different payment methods: Customer pays with Card A, then Card B

How to Use This Service

Duplicate Check is automatically enabled on all transaction sale requests. When you receive a duplicate detection response, handle it appropriately in your application:

{
  "status": "Declined",
  "responseCode": "19",
  "responseMessage": "Duplicate transaction detected",
  "isDuplicate": true,
  "originalTransactionId": "987654321",
  "transactionId": "123456790",
  // ... other fields
}
        

In Your Code:

if (response.Status == "Declined" && response.IsDuplicate == true) {
    // This is a duplicate of a successful transaction

    // Retrieve the original transaction for the customer
    var originalTransaction = GetTransaction(response.OriginalTransactionId);

    // Show customer a helpful message
    DisplayMessage(
        "This payment has already been processed successfully. " +
        $"Transaction ID: {response.OriginalTransactionId}. " +
        "You have not been charged twice. If you have questions, " +
        "please contact support with this transaction ID."
    );

    // Log for audit purposes
    LogDuplicateAttempt(response.TransactionId, response.OriginalTransactionId);

    // Don't retry - the original already succeeded
    return;
}
        

Best Practices

  • Show Clear Messages: Tell customers their payment was already processed successfully
  • Provide Transaction ID: Give customers the original transaction ID for their records
  • Disable Submit Button: In your UI, disable the payment button after first click to prevent duplicates
  • Use Idempotency Keys: Include a unique idempotencyKey in your API requests for additional protection
  • Log Duplicates: Track duplicate attempts to identify UI issues or user confusion

3. Available Refund

What is this service?

Available Refund is an intelligent tracking service that tells you exactly how much money can be refunded for any given transaction. This is especially valuable because refunds can be complex—a single original transaction might have multiple partial refunds over time, and you need to know how much refund capacity remains before attempting another refund.

Without this information, you might accidentally try to refund more than the available amount, resulting in an error and a frustrating experience for both your staff and your customer. Available Refund eliminates this guesswork by calculating and displaying the exact refundable amount in real-time.

Why This Matters:

Imagine a customer paid $500 for an order. Later, they returned one item worth $150, so you issued a partial refund. A week later, they return another item worth $100. Your support agent needs to know: "How much can I still refund on this transaction?" Available Refund instantly shows $250 remaining ($500 original - $150 first refund - $100 second refund = $250 available).

How It Works

Available Refund automatically tracks the refund history of every transaction and calculates the remaining refundable amount. This calculation takes into account:

What's Included in the Calculation:
  • Original Transaction Amount: The initial amount charged to the customer
  • All Completed Refunds: Every successful refund that has been issued against this transaction
  • Pending Refunds: Refunds that have been initiated but not yet completed
  • Failed Refunds: Previous refund attempts that failed are NOT counted (you can retry)
  • Returns: Transaction returns that reduce the refundable amount

The Formula:

Available Refund = Original Transaction Amount - (Completed Refunds + Pending Refunds)
        

Response Information

The Available Refund amount is included in the transaction details whenever you retrieve a transaction:

Field Description Example Value
originalAmount The original transaction amount charged 500.00
refundedAmount Total amount already refunded (completed + pending) 250.00
availableRefundAmount Amount that can still be refunded 250.00
refundCount Number of refunds issued against this transaction 2
refundHistory Array of all refund transactions with amounts and dates [{refundId, amount, date, status}, ...]

Benefits

  • Prevent Refund Errors: Know exactly how much you can refund before attempting
  • Faster Customer Service: Support agents get instant refund availability information
  • Partial Refund Support: Easily handle multiple partial refunds on the same transaction
  • Audit Trail: Complete history of all refunds for accounting and dispute resolution
  • Self-Service Portals: Customers can see refund status and available amounts in real-time
  • Accounting Accuracy: Precise tracking prevents over-refunding and financial discrepancies
  • Compliance: Detailed refund history supports financial audits and compliance requirements

Example Scenarios

Scenario 1: Single Full Refund
  • Original transaction: $100.00
  • Customer requests full refund
  • Available refund: $100.00
  • You issue refund of $100.00
  • New available refund: $0.00
  • Status: Transaction fully refunded, no further refunds possible
Scenario 2: Multiple Partial Refunds
  • Original transaction: $500.00
  • Customer returns item 1 (Week 1): Refund $150.00 → Available: $350.00
  • Customer returns item 2 (Week 2): Refund $100.00 → Available: $250.00
  • Customer returns item 3 (Week 3): Refund $75.00 → Available: $175.00
  • Customer keeps remaining items: $175.00 remains on the transaction
Scenario 3: Preventing Over-Refund
  • Original transaction: $200.00
  • Already refunded: $180.00
  • Available refund: $20.00
  • Support agent tries to refund $50.00
  • System blocks refund: "Available refund is only $20.00"
  • Agent corrects to $20.00 and refund succeeds

How to Use This Service

Available Refund is automatically calculated for every transaction. When you need to issue a refund, first check the available amount:

// Step 1: Get the transaction details
GET /v1/rest/merchants/{merchantId}/transactions/{transactionId}

Response:
{
  "transactionId": "123456789",
  "status": "Approved",
  "originalAmount": 500.00,
  "refundedAmount": 150.00,
  "availableRefundAmount": 350.00,
  "refundCount": 1,
  "refundHistory": [
    {
      "refundId": "REF-001",
      "amount": 150.00,
      "status": "Completed",
      "date": "2026-03-20T10:30:00Z"
    }
  ]
}
        

In Your Code:

// Check available refund before attempting refund
public async Task ProcessRefund(
    string transactionId,
    decimal requestedAmount)
{
    // Get transaction details
    var transaction = await GetTransactionAsync(transactionId);

    // Check if refund amount is available
    if (requestedAmount > transaction.AvailableRefundAmount) {
        return new RefundResult {
            Success = false,
            ErrorMessage = $"Refund amount ${requestedAmount} exceeds " +
                          $"available refund of ${transaction.AvailableRefundAmount}. " +
                          $"Original: ${transaction.OriginalAmount}, " +
                          $"Already Refunded: ${transaction.RefundedAmount}"
        };
    }

    // Available refund is sufficient, proceed with refund
    var refund = await InitiateRefundAsync(transactionId, requestedAmount);

    return new RefundResult {
        Success = true,
        RefundId = refund.RefundId,
        RefundedAmount = requestedAmount,
        RemainingAvailable = transaction.AvailableRefundAmount - requestedAmount
    };
}
        

Display in User Interface

Show Available Refund information clearly in your admin panels and customer service tools:

UI Element Display Information
Transaction Details Page Original Amount: $500.00
Total Refunded: $150.00
Available for Refund: $350.00
Refund Form Enter refund amount: [ $_______ ]
Maximum refund: $350.00
Refund History Section Refunds (2):
• REF-001: $100.00 on 2026-03-15
• REF-002: $50.00 on 2026-03-20
Total: $150.00

Best Practices

  • Always Check First: Retrieve Available Refund before showing refund form to users
  • Validate Input: Don't allow users to enter refund amounts greater than available
  • Show History: Display past refunds so agents understand the refund context
  • Handle Pending Refunds: Remember that pending refunds reduce available amount even before completion
  • Provide Clear Errors: If refund fails, show exactly how much is available
  • Real-Time Updates: Refresh available amount after each refund operation
  • Support Partial Refunds: Don't force full refunds when partial refunds make more sense

Enabling Value Added Services

Good News: These Services Are Always Enabled!

All three Value Added Services (Category 1 Decline Reattempt Protection, Duplicate Check, and Available Refund) are automatically enabled on every transaction. You don't need to configure anything or make any changes to your code. The services work behind the scenes to protect your business and your customers.

How to Take Advantage of These Services

While the services work automatically, you'll get the most value by handling their responses appropriately in your application:

Service What to Check Recommended Action
Category 1 Decline Protection Check declineCategory field • If "1": Stop retries, ask customer to update payment method
• If "2": Safe to retry later (e.g., after 24 hours)
Duplicate Check Check isDuplicate field • Show message: "Payment already processed"
• Display original transaction ID
• Don't retry - original succeeded
Available Refund Check availableRefundAmount field • Display available amount to support agents
• Validate refund requests against this amount
• Show refund history for context

Cost Savings Calculator

Use this simple calculator to estimate your monthly savings with Category 1 Decline Reattempt Protection:

Example Calculation:
  • Monthly Transactions: 10,000
  • Decline Rate: 5% = 500 declined transactions
  • Category 1 Declines: 60% of declines = 300 transactions
  • Average Retry Attempts Without Protection: 3 retries per decline
  • Total Prevented Retries: 300 × 3 = 900 retries
  • Cost per Retry: $0.10
  • Monthly Savings: 900 × $0.10 = $90.00
  • Annual Savings: $90 × 12 = $1,080.00
Your Business:

Adjust the numbers above based on your transaction volume and decline rates. Higher volume businesses can save hundreds or even thousands of dollars per year while also providing a better customer experience.

Support and Questions

Value Added Services are designed to work seamlessly with your existing integration. If you have questions about how these services work or how to best leverage them in your application, please contact Procare Software support.