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.
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.
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:
- 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
- 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.
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.
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:
- 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:
- 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
idempotencyKeyin 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.
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:
- 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
- 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
- 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
- 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 TaskProcessRefund( 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
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:
- 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
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.