Admin Home Dashboard
Navigate to/admin/dashboard for a real-time overview of store performance.
KPI Cards
Four headline metrics appear at the top of the dashboard:Total Sales Revenue
Aggregate revenue from all completed orders in the selected date window.
Orders Processed
Count of orders that have moved past the pending state.
Pending Orders
Active orders awaiting fulfillment action.
Active Customers
Unique customers who placed at least one order in the period.
Dashboard Widgets
Date Filters
The dashboard defaults to the last 30 days. All KPI cards and widgets update when you change the range.
Pending Orders Queue
An order appears in the Pending Queue as long as its status has not been set to completed or cancelled. Use this view as your primary daily fulfillment worklist.
Orders List
Order Details
Order Comments Block
Customer-submitted comments are rendered above the Items Purchased section on the invoice. No action is required — they display automatically if the customer entered a comment at checkout.Payment History Log
A structured log of every payment event for the order:Mark Shipped
Clicking the Mark Shipped button immediately:- Updates the order status to Shipped (status 2).
- Triggers and sends a shipment confirmation email to the customer.
2 (Shipped) has identical behavior — the confirmation email fires immediately.
Send Download Reminder
For orders containing digital items, the Send Download Reminder button manually re-dispatches the download reminder email to the customer on demand.This button is only visible on orders that include at least one digital download item.
Double-Confirmation Action Gate
High-consequence email actions — Resend Order Confirmation and Send Download Reminder — require two clicks to execute:- The first click reveals a confirmation prompt inline on the page.
- The second click sends the email.
Status Dropdown Reference
Partial or Full Refunds
Partial or full refunds are issued directly from the Order Details page (/admin/ecommerce/orders/{id}).
1
Open the Order
Navigate to Admin → Orders and click the order you need to refund.
2
Set Order Status (Optional for Full Refunds)
Change the order status using the Update Order Status dropdown to either Refunded or Partially Refunded and then click the Apply Status button (this will not send the customer an email automatically).
Note: If the entire order amount is refunded across payments, the order status will automatically update to Refunded upon processing the refund, allowing you to skip this manual status update.
3
Click the Refund Button in Payments List
Locate the Payments section and click the Refund button next to the specific payment you want to refund.
Automatic Gateway Dispatch: If the payment was processed via Stripe, PayPal, or Paddle, the refund will automatically post directly to the customer’s payment provider via their API.
4
Enter Refund Amount
In the refund modal, review the maximum refundable balance. The field defaults to the full remaining payment amount, but can be modified to any smaller amount for partial refunds. You may also add an optional administrative note or reason.
5
Confirm & Process Refund
Ensure the Post refund via Payment Processor API toggle is enabled (auto-checked for gateway transactions), and click Confirm & Process Refund. The gateway executes the credit, records the refund transaction in
order_refunds, updates the payment status, and recalculates the balance due.1. Direct Gateway API Linkages
When an admin processes a refund, the system resolves the associated payment method and interacts with the respective processor API:1. Stripe Integration
- Driver:
App\Services\Payments\Processors\StripeProcessor - Mechanism: Calls the Stripe REST API via
\Stripe\Refund::create(). - Identifier Resolution:
- Automatically handles Payment Intent IDs (
pi_...), Charge IDs (ch_...), or Customer Payment Methods (pm_...). - If a Subscription agreement ID (
sub_...) is provided, it retrieves the latest invoice and its underlying PaymentIntent to execute the refund.
- Automatically handles Payment Intent IDs (
- Amount Handling: Converted to integer cents with currency preservation.
2. PayPal Integration
- Driver:
App\Services\Payments\Processors\PayPalProcessor - Mechanism: Calls the PayPal Captures API v2 (
POST /v2/payments/captures/{capture_id}/refund). - Identifier & Subscription Fallback:
- Automatically resolves capture IDs from PayPal Checkout Order IDs or Subscription agreement IDs (
I-...). - If the transaction is a subscription billing agreement sale, it automatically falls back to PayPal’s Sale Refund API (
POST /v1/payments/sale/{sale_id}/refund).
- Automatically resolves capture IDs from PayPal Checkout Order IDs or Subscription agreement IDs (
- Error Diagnostics: Intercepts granular error issues and descriptions from PayPal API responses (e.g., already refunded, capture expired, or balance limits) and displays clear toast notifications.
3. Paddle Billing Integration
- Driver:
App\Services\Payments\Processors\PaddleProcessor - Mechanism: Calls the Paddle Billing Adjustments API (
POST /adjustments). - Adjustment Types:
- Full Refund: Dispatches
action: 'refund',type: 'full', and thetransaction_id. - Partial Refund: Retrieves the transaction line items and creates a partial line adjustment with
type: 'partial'and item-level amount tracking.
- Full Refund: Dispatches
- Identifier Resolution: Resolves transaction IDs directly or via Subscription IDs (
sub_...) and Customer IDs (ctm_...).
4. Test Gateway & Offline Ledgers
- Test Driver:
App\Services\Payments\Processors\TestProcessorreturns simulated refund authorizations (TEST-RFND-XXXXXXXX) for testing environments. - Offline / Manual Override: Administrators can uncheck the Post refund via Payment Processor API toggle if the payment was already settled outside the gateway (e.g., cash, check, wire transfer, or direct bank chargeback resolution).
2. Payments Table & Status Behavior
The Payments table on the Order Details view provides clear real-time visibility into the lifecycle of each charge:Balance Summary Calculations
The order ledger dynamically reflects:- Order Total: Original total order charge.
- Total Paid: Sum of all payments recorded in
order_payments. - Total Refunded: Sum of all refunds recorded in
order_refunds(displayed in red). - Balance Due:
max(0, Order Total - Total Paid + Total Refunded). Displays a green Paid in Full badge when the net balance due is $0.00.
3. Automated Order Status & Inventory Safeguards
Automatic Order Status Elevation
- When cumulative refunds equal or exceed the order’s total charge (
order_total), the overallorders.order_statusis automatically set to 3 (Refunded). - For partial refunds, administrators can optionally set the order status to Partially Refunded via the status dropdown.
Inventory Restocking Safeguard
- When the first refund on an order is created, the system iterates over the order line items (
order_details) and increments the available product stock (product_inventory.quantity_available += item_qty). - Subsequent partial refunds on the same order will not duplicate inventory restocks.
4. Code & Architecture Reference
Invoice Address Formatting
US and Canadian order invoices display the city, state, and ZIP in the standard inline format:- City — customer’s city
- State — two-letter abbreviation positioned between city and ZIP (US) or province abbreviation (CA)
- ZIP / Postal Code — appended after the state abbreviation
Checkout Custom Fields Manager
Access to the Checkout Custom Fields Manager is restricted to Admin role only.
Field Positions
Field Types
Billing Page User Type Filter
Step-2 fields can be targeted to specific customer segments:Data Storage
All custom field responses are stored in theorders.custom_field_data JSON column on the order record. The data is available in the Order Details view and exportable via the Orders export.
Session Carryover
Step-1 (shipping page) field values are held in session after the customer advances. When the order is placed, Step-1 values are merged with Step-2 values and written together intoorders.custom_field_data.
