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 balancegetCreditsByEmail()- Get credits by user emailhasCredits()- Check if sufficient credits availableconsumeCredits()- Deduct credits for actionsaddCredits()- Admin add creditsdeductCredits()- Admin deduct creditsgetCreditHistory()- Get transaction historygetCreditConfiguration()- Get action costsupdateMonthlyAllocation()- Update allocationupdateCreditTier()- Change subscription tierresetMonthlyCreditsForStartup()- Manual resetresetMonthlyCreditsForAllStartups()- 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 filtersgetStartupCreditDetails()- Detailed credit infobulkAddCredits()- Bulk add to multiple startupsbulkDeductCredits()- Bulk deduct from multipleupdateCreditConfiguration()- Update action costsgetCreditAnalytics()- Comprehensive analyticsgetAllCreditTransactions()- All transactions with filtersupsertCreditTier()- Create/update tiersgetStartupsNeedingAttention()- Low/exhausted creditsexportCreditData()- 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 creditsconnection_request: 15 creditssignal_view_details: 5 creditswarm_intro_request: 20 creditspriority_matching: 25 credits
6. Credit Tiersโ
| Tier | Monthly Credits | Features |
|---|---|---|
| Free | 50 | Basic access |
| Basic | 100 | Standard access + signal pool |
| Premium | 250 | Enhanced 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โ
- Authentication: All endpoints protected by ClerkAuthGuard
- Authorization: Admin endpoints should have additional role checks
- Transaction Integrity: All credit operations use database transactions
- Audit Trail: Complete transaction history for accountability
- 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:generateafter schema changes - Run
pnpm db:pushto 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