Skip to main content

Credit System Implementation - Backend

Overviewโ€‹

Complete implementation of a credit-based system for managing startup access to government signals and connections.


๐ŸŽฏ What Was Implementedโ€‹

1. Database Schema (packages/database/prisma/schema.prisma)โ€‹

Added Fields to StartupContact Model:โ€‹

creditsTotal              Int       @default(100)
creditsUsed Int @default(0)
creditsRemaining Int @default(100)
monthlyAllocation Int @default(100)
lastCreditReset DateTime?
creditTier String @default("basic")

New Models:โ€‹

  • CreditTransaction: Tracks all credit usage and additions
  • CreditConfiguration: Defines credit costs per action
  • CreditTier: Manages subscription tiers (free, basic, premium, unlimited)

2. Servicesโ€‹

CreditService (apps/backend/src/services/credit.service.ts)โ€‹

Core credit operations:

  • getStartupCredits() - Get credit balance
  • getCreditsByEmail() - Get credits by user email
  • hasCredits() - Check if sufficient credits available
  • consumeCredits() - Deduct credits for actions
  • addCredits() - Admin add credits
  • deductCredits() - Admin deduct credits
  • getCreditHistory() - Get transaction history
  • getCreditConfiguration() - Get action costs
  • updateMonthlyAllocation() - Update allocation
  • updateCreditTier() - Change subscription tier
  • resetMonthlyCreditsForStartup() - Manual reset
  • resetMonthlyCreditsForAllStartups() - Automated monthly reset (runs 1st of each month)
  • getCreditStatistics() - Analytics for startup

CreditManagementService (apps/backend/src/admin/credit-management.service.ts)โ€‹

Admin operations:

  • getAllStartupsWithCredits() - List all startups with filters
  • getStartupCreditDetails() - Detailed credit info
  • bulkAddCredits() - Bulk add to multiple startups
  • bulkDeductCredits() - Bulk deduct from multiple
  • updateCreditConfiguration() - Update action costs
  • getCreditAnalytics() - Comprehensive analytics
  • getAllCreditTransactions() - All transactions with filters
  • upsertCreditTier() - Create/update tiers
  • getStartupsNeedingAttention() - Low/exhausted credits
  • exportCreditData() - Export for reporting

3. API Endpointsโ€‹

User Endpoints (/credits)โ€‹

GET    /credits/balance        Get current credit balance
GET /credits/history Get transaction history
GET /credits/config Get credit costs per action
GET /credits/statistics Get credit usage statistics
GET /credits/tiers Get available subscription tiers

Admin Endpoints (/admin/credits)โ€‹

GET    /admin/credits/startups                  List all startups
GET /admin/credits/startups/:id Get startup details
POST /admin/credits/startups/:id/add Add credits
POST /admin/credits/startups/:id/deduct Deduct credits
POST /admin/credits/bulk/add Bulk add credits
POST /admin/credits/bulk/deduct Bulk deduct credits
PUT /admin/credits/startups/:id/allocation Update monthly allocation
PUT /admin/credits/startups/:id/tier Update tier
GET /admin/credits/analytics Get analytics
GET /admin/credits/transactions Get all transactions
PUT /admin/credits/config Update action costs
PUT /admin/credits/tiers Create/update tier
GET /admin/credits/attention Get startups needing attention
POST /admin/credits/startups/:id/reset Reset monthly credits
GET /admin/credits/export Export credit data

4. DTOs (apps/backend/src/dto/credit.dto.ts)โ€‹

Complete validation and Swagger documentation for all endpoints

5. Credit Configurationโ€‹

Default action costs (configurable via admin):

  • signal_pool_request: 10 credits
  • connection_request: 15 credits
  • signal_view_details: 5 credits
  • warm_intro_request: 20 credits
  • priority_matching: 25 credits

6. Credit Tiersโ€‹

TierMonthly CreditsFeatures
Free50Basic access
Basic100Standard access + signal pool
Premium250Enhanced access + priority matching
UnlimitedโˆžAll features + white-glove service

7. Automated Featuresโ€‹

  • Monthly Reset: Automatic credit reset on 1st of each month at midnight
  • Transaction Logging: All credit changes are logged with full audit trail
  • Balance Tracking: Real-time balance calculations

๐Ÿ—„๏ธ Database Changes Appliedโ€‹

  • โœ… Schema updated with credit fields
  • โœ… New tables created: credit_transactions, credit_configurations, credit_tiers
  • โœ… All 10 existing startups updated with default credits (100 credits, basic tier)
  • โœ… Seed data populated:
    • 4 credit tiers
    • 5 credit configurations
    • 10 startups initialized

๐Ÿ“ฆ Files Created/Modifiedโ€‹

Created Files:โ€‹

apps/backend/src/
โ”œโ”€โ”€ services/
โ”‚ โ””โ”€โ”€ credit.service.ts (Core credit operations)
โ”œโ”€โ”€ admin/
โ”‚ โ”œโ”€โ”€ credit-management.service.ts (Admin operations)
โ”‚ โ””โ”€โ”€ admin-credit.controller.ts (Admin API)
โ”œโ”€โ”€ controllers/
โ”‚ โ””โ”€โ”€ credit.controller.ts (User API)
โ”œโ”€โ”€ dto/
โ”‚ โ””โ”€โ”€ credit.dto.ts (Validation & Swagger)
โ”œโ”€โ”€ modules/
โ”‚ โ””โ”€โ”€ credit.module.ts (Module configuration)
โ””โ”€โ”€ scripts/
โ””โ”€โ”€ seed-credit-data.ts (Database seeding)

packages/database/
โ””โ”€โ”€ prisma/schema.prisma (Updated with credit models)

Modified Files:โ€‹

apps/backend/src/app.module.ts               (Added CreditModule)
packages/database/index.ts (Exported credit types)

๐Ÿš€ How to Useโ€‹

For Users (Frontend Integration Needed):โ€‹

// Get credit balance
GET /credits/balance
Response: {
creditsTotal: 100,
creditsUsed: 30,
creditsRemaining: 70,
creditTier: "basic"
}

// View history
GET /credits/history?limit=20

For Admins:โ€‹

// View all startups with credits
GET /admin/credits/startups?tier=basic&sortBy=creditsRemaining

// Add credits to a startup
POST /admin/credits/startups/{id}/add
Body: { amount: 50, reason: "Bonus credits for early adopter" }

// Get analytics
GET /admin/credits/analytics?startDate=2025-01-01&tier=premium

Consuming Credits in Your Code:โ€‹

// Example: Before allowing a connection request
const creditCost = await creditService.getActionCost("connection_request");
const hasCredits = await creditService.hasCredits(startupId, creditCost);

if (!hasCredits) {
throw new BadRequestException("Insufficient credits");
}

// Consume credits when action is performed
await creditService.consumeCredits({
startupId,
actionType: "connection_request",
amount: creditCost,
entityId: connectionId,
entityType: "connection",
description: "Connection request to government contact",
});

๐Ÿ”„ Next Steps (For Complete Implementation)โ€‹

1. Frontend Integration (Apps/frontend)โ€‹

  • Update sidebar to fetch dynamic credit data from /credits/balance
  • Create credit history page
  • Add low credit warnings
  • Create admin credit management dashboard

2. Integration with Existing Featuresโ€‹

  • Add credit checks to signal pool requests
  • Add credit consumption to connection requests
  • Add credit checks to warm intro requests
  • Update signal viewing to consume credits if configured

3. Admin Dashboardโ€‹

  • Create admin UI for viewing all startups
  • Create UI for adding/deducting credits
  • Create analytics dashboard
  • Create tier management interface

4. Notificationsโ€‹

  • Email notifications when credits are low (< 10)
  • Email notifications on monthly reset
  • Admin alerts for exhausted startups

5. Testingโ€‹

  • Unit tests for CreditService
  • Unit tests for CreditManagementService
  • E2E tests for credit endpoints
  • Integration tests with signal/connection features

๐Ÿงช Testing the Backendโ€‹

Manual Testing:โ€‹

# Start backend
pnpm dev:backend

# Test user endpoints (requires authentication)
curl http://localhost:3800/credits/balance \
-H "Authorization: Bearer YOUR_TOKEN"

# Test admin endpoints
curl http://localhost:3800/admin/credits/startups \
-H "Authorization: Bearer ADMIN_TOKEN"

Run Seed Script:โ€‹

cd apps/backend
npx ts-node src/scripts/seed-credit-data.ts

๐Ÿ“Š Credit Transaction Flowโ€‹

User Action โ†’ Check Credits โ†’ Consume Credits โ†’ Log Transaction โ†’ Update Balance
โ†“ โ†“
Insufficient? Create Audit Trail
โ†“
Reject Action

๐Ÿ” Security Considerationsโ€‹

  1. Authentication: All endpoints protected by ClerkAuthGuard
  2. Authorization: Admin endpoints should have additional role checks
  3. Transaction Integrity: All credit operations use database transactions
  4. Audit Trail: Complete transaction history for accountability
  5. Validation: All inputs validated with class-validator

๐Ÿ’ก Key Featuresโ€‹

โœ… Complete CRUD operations for credits โœ… Automated monthly reset with cron job โœ… Flexible tier system โœ… Configurable action costs โœ… Comprehensive analytics โœ… Bulk operations for admins โœ… Full audit trail โœ… Type-safe with TypeScript โœ… Swagger documentation โœ… Transaction safety with Prisma


๐Ÿ“ Notesโ€‹

  • Unlimited Tier: Startups on unlimited tier bypass all credit checks
  • Monthly Reset: Happens automatically on 1st of each month at midnight
  • Credit Configuration: Admins can change action costs without code changes
  • Transaction History: Permanent record of all credit changes
  • Balance Consistency: Real-time calculation ensures accuracy

๐Ÿ› Troubleshootingโ€‹

Credits not updating?โ€‹

  • Check if startup exists in database
  • Verify creditTier is not "unlimited"
  • Check transaction logs for errors

Monthly reset not working?โ€‹

  • Verify ScheduleModule is imported
  • Check backend logs for cron execution
  • Ensure backend is running continuously

Build errors?โ€‹

  • Run pnpm db:generate after schema changes
  • Run pnpm db:push to sync database
  • Clear node_modules and reinstall if needed

๐Ÿ“š Additional Resourcesโ€‹


Implementation Date: October 16, 2025 Status: โœ… Backend Complete - Frontend Integration Pending Database: โœ… Seeded and Ready API: โœ… Fully Functional