Subscription Transactions


Contents

Overview

The Subscription Transactions feature provides insights into user subscriptions. Key components include:

  • Subscription Revenue: View subscription revenue generated and churn rate.
  • Subscription Transactions: View all subscription transactions.

On page load, the /api:BVaDN9hl/subscriptions/stats?filter%5Bemail%5D=&page=1&per_page=15&search=&status=&type= endpoint is called to retrieve the subscription revenue data. It runs App\Http\Controllers\Admin\SubscriptionsController@stats.

API response

{
    "total_subscription_revenue": "1,074,000"
}

/api:BVaDN9hl/subscriptions/transaction?filter%5Bemail%5D=&page=1&per_page=15&search=&status=&type= endpoint is called to retrieve the subscription transactions data. It runs App\Http\Controllers\Admin\SubscriptionsController@transaction.

API response

{
    "data": [
        {
            "sid": 1234,
            "name": "Sam Uzima",
            "email": "u******il.com",
            "phone_number": "+2547*****66",
            "subscription_date": "Mar 05, 2025",
            "renewal_date": "Mar 05, 2025",
            "plan": "Monthly",
            "sub_status": "Inactive",
            "sub_bg_color": "/docs/1.0/financial-admin/subscription-transaction#7C022533",
            "sub_color": "/docs/1.0/financial-admin/subscription-transaction#7C0225",
            "account_status": "Active",
            "account_bg_color": "/docs/1.0/financial-admin/subscription-transaction#7BBF7433",
            "account_color": "/docs/1.0/financial-admin/subscription-transaction#7bbf74"
        },
        ---
        {
            ---
        }
    ],
    "links": {
        "first": "http://127.0.0.1:8080/api:BVaDN9hl/subscriptions/transaction?page=1",
        "last": "http://127.0.0.1:8080/api:BVaDN9hl/subscriptions/transaction?page=124",
        "prev": null,
        "next": "http://127.0.0.1:8080/api:BVaDN9hl/subscriptions/transaction?page=2"
    },
    "meta": {
        "current_page": 1,
        "from": 1,
        "last_page": 124,
        "links": [
            {
                "url": null,
                "label": "« Previous",
                "active": false
            },
            {
                "url": "http://127.0.0.1:8080/api:BVaDN9hl/subscriptions/transaction?page=1",
                "label": "1",
                "active": true
            },
                "url": null,
                "label": "...",
                "active": false
            },
            {
                "url": "http://127.0.0.1:8080/api:BVaDN9hl/subscriptions/transaction?page=2",
                "label": "Next »",
                "active": false
            }
        ],
        "path": "http://127.0.0.1:8080/api:BVaDN9hl/subscriptions/transaction",
        "per_page": 15,
        "to": 15,
        "total": 1859
    }
}

Subscription Revenue

The Subscription Revenue section provides insights into subscription revenue generated. Key components include:

  • Total Subscription Revenue: View the total revenue generated from subscriptions.
  • Monthly Subscription Revenue: View the revenue generated from monthly subscriptions.
  • Annual Subscription Revenue: View the revenue generated from annual subscriptions.
  • Churn Rate: View the churn rate of subscriptions.

The data in the section is calculated based on the subscription transactions.

public function stats()
{
    $filter_emails_v2 = User::adminAccounts()->pluck('id');
    $subs = DB::table('user_subscriptions')->whereNotIn('users_id', $filter_emails_v2)->get();
    $yearly = 0;
    $monthly = 0;
    foreach ($subs as $item) {
        if($item->is_active === true) {
            if($item->subscriptions_id === 2) {
                $yearly = $yearly + 10000;
            }
            $monthly = $monthly + 1000;
        }
        $var_1 = 'none';
    }

    $total_subscription_revenue = number_format($yearly + $monthly, 0);
    return RespondWithSuccess::run(...[
        'body' => [
            'total_subscription_revenue' => $total_subscription_revenue,
        ]
    ]);
}

Subscription Transactions

The Subscription Transactions section provides a table view of all subscription transactions. Key components include:

  • Name: The name of the user, email, and phone number.
  • Subscription Date: The date the subscription was initiated.
  • Renewal Date: The date the subscription is set to renew.
  • Plan: The subscription plan type (e.g., Monthly, Annual).
  • Subscription Status: The status of the subscription (e.g., Active, Inactive).
  • Account Status: The status of the user account (e.g., Active, Inactive).

The table is paginated to display 15 records per page. Admins can navigate through the pages using the pagination controls.

public function transaction(Request $request)
{
    $validator = Validator::make($request->all(), [
        'search' => 'nullable|string',
        'page' => 'required|numeric',
        'per_page' => 'required|numeric',
        'status' => 'nullable|string',
    ]);
    if ($validator->fails()) {
        return response()->json(['errors' => $validator->errors()], 422);
    }
    $data = $validator->validated();
    $per_page = $data['per_page'];
    $search = $data['search'];
    $nonAdminUserIds = User::query()->adminAccounts()->pluck('id');

    $filter = User::query()->whereNotIn('id', $nonAdminUserIds);
    if ($search) {
        $users = QueryBuilder::for($filter)
            ->allowedFilters('email')
            ->pluck('id');
    } else {
        $users = QueryBuilder::for($filter)
            ->pluck('id');
    }
    $transactions = DB::table('user_subscriptions as sub')
        ->leftJoin('subscriptions as s', 's.id', '=', 'sub.subscriptions_id')
        ->leftJoin('users as u', 'u.id', '=', 'sub.users_id')
        ->leftJoin('k_y_c_s as k', 'k.users_id', '=', 'sub.users_id')
        ->whereIn('sub.users_id', $users)
        ->whereNotNull('u.id')
        ->whereNotNull('sub.renewed_at')
        ->select(
            'sub.id as sid',
            'u.firstname as firstname',
            'u.lastname as lastname',
            'u.email as email',
            DB::raw('u.kyc->>\'kyc_contact\' as contact '),
            DB::raw('k.phone->>\'phone\' as kyc'),
            'sub.renewed_at as renewed_at',
            'sub.ends_at as ends_at',
            's.period',
            'sub.is_active as sub_status',
        )
        ->orderBy('sub.renewed_at', 'desc')
        ->paginate($per_page);
    $transactions->getCollection()->map(function ($transaction) {

        //account status
        $date = Carbon::parse($transaction->ends_at);
        $transaction->account_status = true;
        if ($date < now() && abs($date->diffInDays(Carbon::now())) > 60) {
            $transaction->account_status = false;
        }
        if ($transaction->contact) {
            $transaction->phone_number = $transaction->contact;
        } elseif ($transaction->kyc) {
            $transaction->phone_number = $transaction->kyc;
        } else {
            $transaction->phone_number = "-";
        }
    });
    return SubscriptionResource::collection($transactions);
}

Search Subscription Transactions

The Search Subscription Transactions feature allows admins to search for specific subscription transactions. Admins can search by user name, email, or phone number to filter the results.