🚗 About WD Career Chopshop
Welcome to WD Career Chopshop, an advanced, fully-featured, modular vehicle recovery, dismantling, and scrap trading career system built for FiveM.
🌟 Overview & Core Concept
WD Career Chopshop introduces an immersive mechanic & salvager job pipeline to your server. Players engage in dynamic vehicle recovery contracts, transport damaged or abandoned vehicles with flatbed tow trucks, carefully dismantle parts using specialized mechanical tools, crush stripped frames, and trade harvested components for cash and crafting materials.
The resource is engineered from the ground up to support multiple frameworks out of the box with zero boilerplate configuration needed.
🧩 Architectural Design
1. Zero-Config Multi-Framework Bridge
The script features an autonomous bridge layer that identifies the server environment during runtime:
- Frameworks Supported:
qbx_core(Qbox)qb-core(QBCore)es_extended(ESX Legacy & Classic)- Standalone (Custom / Native builds)
- Targeting Systems:
ox_targetqb-targetqbx_target
- Inventory Engines:
ox_inventoryqb-inventoryps-inventoryqs-inventory
- Menu Systems:
ox_libcontext menusqb-menu
🎮 Key Features & Gameplay Mechanics
1. Dynamic Job Generation & Dispatch HUD
- Tow Contracts: Jobs are generated dynamically across Los Santos and Blaine County at configured intervals.
- Smart Live Dispatch Timer: While racing to locate and tow the assigned target vehicle, players receive a live countdown HUD on their screen. When the timer hits $\le 30$ seconds, warning audio alerts the driver.
- Auto-HUD Disarm: Once the vehicle is winched / attached to the flatbed tow truck, the timer automatically dismisses.
- Distance Payouts: Vehicle pickups further away award bonus cash per mile to reimburse fuel and time.
2. Immersive Part Dismantling
Each part of the vehicle has dedicated interaction bones, tool requirements, multi-stage animations, sound effects, and visual particle effects:
| Part | Required Tool | Animation / FX Behavior | Result Item |
|---|---|---|---|
| Doors, Hood, Trunk | chop_saw | Circular saw stance with synchronized metal sparks (scr_paletoscore) at blade | cardoor, carhood, cartrunk |
| Wheels & Rims | impactdriver | Pneumatic drill audio, lug nut unscrewing sound, tire removal | carwheel (Intact) / chop_lqrim1 (Popped) |
| Battery | None | Engine bay inspection, wrenching animation & ratchet SFX | carbattery |
| Radiator | None | Engine bay dismantling, coolant drainage audio & wrenching | radiatorpart |
| Gearbox | None | Heavy transmission extraction animation | gearbox |
| Exhaust | None | Sliding under rear chassis mechanics (mech2 stance) | exhaust |
| Stripped Frame | None | Keyfob / console press triggering hydraulic crushing | Valuable end items (chop_gps, chop_hqrim, chop_speaker, chop_stereo, chop_sub) |
3. Progressive Career & Challenge System
- Career Ranks: Players advance through ranks (Rookie $\rightarrow$ Scrapper $\rightarrow$ Specialist $\rightarrow$ Chop Pro $\rightarrow$ Master Salvager) as they complete dispatches and scrap cars.
- Daily & Weekly Challenges: Dynamic tasks that award cash bonuses upon completion (e.g. Chop 4 vehicle doors, Dismantle 4 wheels, Earn $10,000 from contracts).
- Ledger History: Tracks every transaction and payout persistently in MySQL database tables (
wd_chopshop_playersandwd_chopshop_transactions).
4. Scrap Material Trading Post
- Harvested parts can be traded to Jack at the trade depot for cash and tiered crafting materials:
- Plastics & Synthetics:
plastic,polymer,polyethylene,carbon - Metals:
steel,iron,stainlesssteel,scrapmetal,rustedmetal,aluminium - Rubber & Wiring:
rubber,silicone,wires,copperwires,electronics - Vehicle Parts:
tirekit,brakepad,suspensionpart,clutchkit
- Plastics & Synthetics:
5. In-Game Tablet Application
- Includes a responsive Next.js web application formatted to match modern tablet bezels (such as
wd-tablet). - Accessible via:
- Command:
/sal - Client Export:
exports['wd_career_chopshop']:openTablet() - In-vehicle prompt when sitting inside a rented tow truck.
- Command:
🗄️ Database Schema
The script automatically executes and manages its own database schema on server startup:
wd_chopshop_players: Stores citizen ID, completed contract count, total earnings, active challenges, and rank.wd_chopshop_transactions: Historical ledger recording payouts, challenge bonuses, and trade transactions.
🛠️ WD Career Chopshop - Installation Guide
This guide provides step-by-step instructions for installing, configuring, and verifying wd_career_chopshop (wd_chopshop) on any FiveM server environment.
1. Prerequisites & Dependencies
Ensure your server is running the following components:
Mandatory Dependencies
| Dependency | Description |
|---|---|
ox_lib | UI components, notifications, progress circles, callbacks. |
oxmysql or MySQL | Async database driver for player stats & challenge caching. |
| Target System | ox_target, qb-target, or qbx_target. |
| Framework | qbx_core, qb-core, es_extended, or Custom Standalone. |
Optional Enhancements
interact-soundorerp-sounds: For custom mechanical SFX (native GTA V SoundSets are used as automated fallbacks).wd-tablet: If you use a dedicated tablet ecosystem.
2. Folder Placement
Place the wd_chopshop folder in your resources directory:
resources/
└── [wd]/
└── wd_chopshop/
3. Inventory Items & Images Setup
A. ox_inventory Setup
1. Copy Images:
Copy all image files from install/imgs/ into:
resources/[ox]/ox_inventory/web/images/
2. Register Items:
Open ox_inventory/data/items.lua and paste the following items into your return table:
-- ============================================================
-- WD CAREER CHOPSHOP ITEMS
-- ============================================================
-- Tools
['chop_saw'] = {
label = 'Chop Saw',
weight = 2500,
stack = false,
close = true,
description = 'Heavy-duty circular saw for cutting vehicle panels.',
client = { image = 'chop_saw.png' }
},
['impactdriver'] = {
label = 'Impact Driver',
weight = 1500,
stack = false,
close = true,
description = 'High-torque pneumatic driver for removing lug nuts and bolts.',
client = { image = 'impactdriver.png' }
},
-- Harvested Vehicle Parts
['cardoor'] = {
label = 'Car Door',
weight = 6000,
stack = true,
close = true,
description = 'Detached vehicle door.',
client = { image = 'cardoor.png' }
},
['carhood'] = {
label = 'Car Hood',
weight = 7000,
stack = true,
close = true,
description = 'Detached vehicle bonnet.',
client = { image = 'carhood.png' }
},
['cartrunk'] = {
label = 'Car Trunk',
weight = 6000,
stack = true,
close = true,
description = 'Detached vehicle trunk lid.',
client = { image = 'cartrunk.png' }
},
['carwheel'] = {
label = 'Car Wheel',
weight = 4000,
stack = true,
close = true,
description = 'Intact wheel and tire.',
client = { image = 'carwheel.png' }
},
['carbattery'] = {
label = 'Car Battery',
weight = 2500,
stack = true,
close = true,
description = '12V Lead-acid automotive battery.',
client = { image = 'carbattery.png' }
},
['exhaust'] = {
label = 'Exhaust Pipe',
weight = 4500,
stack = true,
close = true,
description = 'Stainless steel exhaust pipe section.',
client = { image = 'exhaust.png' }
},
['gearbox'] = {
label = 'Gearbox',
weight = 9000,
stack = true,
close = true,
description = 'Automotive transmission gearbox.',
client = { image = 'gearbox.png' }
},
['radiatorpart'] = {
label = 'Radiator',
weight = 3500,
stack = true,
close = true,
description = 'Vehicle engine cooling radiator.',
client = { image = 'radiatorpart.png' }
},
-- Valuables & Audio
['chop_gps'] = {
label = 'Navigation Unit',
weight = 500,
stack = true,
description = 'GPS tracking and navigation module.',
client = { image = 'chop_gps.png' }
},
['chop_hqrim'] = {
label = 'High Quality Rim',
weight = 3000,
stack = true,
description = 'Forged alloy performance rim.',
client = { image = 'chop_hqrim.png' }
},
['chop_lqrim1'] = {
label = 'Steel Rim',
weight = 2500,
stack = true,
description = 'Stock steel wheel rim.',
client = { image = 'chop_lqrim1.png' }
},
['chop_speaker'] = {
label = 'Door Speaker',
weight = 800,
stack = true,
description = 'Salvaged vehicle audio speaker.',
client = { image = 'chop_speaker.png' }
},
['chop_stereo'] = {
label = 'Car Stereo',
weight = 1200,
stack = true,
description = 'Aftermarket head unit receiver.',
client = { image = 'chop_stereo.png' }
},
['chop_sub'] = {
label = 'Subwoofer',
weight = 3500,
stack = true,
description = 'High-output audio subwoofer.',
client = { image = 'chop_sub.png' }
},
B. qb-inventory / ps-inventory / qs-inventory Setup
1. Copy Images:
- For
qb-inventory: Copy.pngfiles frominstall/imgs/toresources/[qb]/qb-inventory/html/images/ - For
ps-inventory: Copy.pngfiles frominstall/imgs/toresources/[ps]/ps-inventory/html/images/ - For
qs-inventory: Copy.pngfiles frominstall/imgs/toresources/[qs]/qs-inventory/html/images/
2. Register Items:
Open qb-core/shared/items.lua and add the items into QBShared.Items:
-- ============================================================
-- WD CAREER CHOPSHOP ITEMS
-- ============================================================
-- Tools
['chop_saw'] = {['name'] = 'chop_saw', ['label'] = 'Chop Saw', ['weight'] = 2500, ['type'] = 'item', ['image'] = 'chop_saw.png', ['unique'] = false, ['useable'] = false, ['shouldClose'] = true, ['combinable'] = nil, ['description'] = 'Heavy-duty circular saw for metal cutting.'},
['impactdriver'] = {['name'] = 'impactdriver', ['label'] = 'Impact Driver', ['weight'] = 1500, ['type'] = 'item', ['image'] = 'impactdriver.png', ['unique'] = false, ['useable'] = false, ['shouldClose'] = true, ['combinable'] = nil, ['description'] = 'Pneumatic tool for removing lug nuts.'},
-- Harvested Vehicle Parts
['cardoor'] = {['name'] = 'cardoor', ['label'] = 'Car Door', ['weight'] = 6000, ['type'] = 'item', ['image'] = 'cardoor.png', ['unique'] = false, ['useable'] = false, ['shouldClose'] = true, ['combinable'] = nil, ['description'] = 'Detached vehicle door.'},
['carhood'] = {['name'] = 'carhood', ['label'] = 'Car Hood', ['weight'] = 7000, ['type'] = 'item', ['image'] = 'carhood.png', ['unique'] = false, ['useable'] = false, ['shouldClose'] = true, ['combinable'] = nil, ['description'] = 'Detached vehicle hood.'},
['cartrunk'] = {['name'] = 'cartrunk', ['label'] = 'Car Trunk', ['weight'] = 6000, ['type'] = 'item', ['image'] = 'cartrunk.png', ['unique'] = false, ['useable'] = false, ['shouldClose'] = true, ['combinable'] = nil, ['description'] = 'Detached vehicle trunk.'},
['carwheel'] = {['name'] = 'carwheel', ['label'] = 'Car Wheel', ['weight'] = 4000, ['type'] = 'item', ['image'] = 'carwheel.png', ['unique'] = false, ['useable'] = false, ['shouldClose'] = true, ['combinable'] = nil, ['description'] = 'Intact vehicle wheel.'},
['carbattery'] = {['name'] = 'carbattery', ['label'] = 'Car Battery', ['weight'] = 2500, ['type'] = 'item', ['image'] = 'carbattery.png', ['unique'] = false, ['useable'] = false, ['shouldClose'] = true, ['combinable'] = nil, ['description'] = '12V Lead-acid battery.'},
['exhaust'] = {['name'] = 'exhaust', ['label'] = 'Exhaust Pipe', ['weight'] = 4500, ['type'] = 'item', ['image'] = 'exhaust.png', ['unique'] = false, ['useable'] = false, ['shouldClose'] = true, ['combinable'] = nil, ['description'] = 'Exhaust pipe segment.'},
['gearbox'] = {['name'] = 'gearbox', ['label'] = 'Gearbox', ['weight'] = 9000, ['type'] = 'item', ['image'] = 'gearbox.png', ['unique'] = false, ['useable'] = false, ['shouldClose'] = true, ['combinable'] = nil, ['description'] = 'Transmission gearbox.'},
['radiatorpart'] = {['name'] = 'radiatorpart', ['label'] = 'Radiator', ['weight'] = 3500, ['type'] = 'item', ['image'] = 'radiatorpart.png', ['unique'] = false, ['useable'] = false, ['shouldClose'] = true, ['combinable'] = nil, ['description'] = 'Cooling radiator.'},
-- Valuables & Audio
['chop_gps'] = {['name'] = 'chop_gps', ['label'] = 'Navigation Unit', ['weight'] = 500, ['type'] = 'item', ['image'] = 'chop_gps.png', ['unique'] = false, ['useable'] = false, ['shouldClose'] = true, ['combinable'] = nil, ['description'] = 'Stolen GPS unit.'},
['chop_hqrim'] = {['name'] = 'chop_hqrim', ['label'] = 'High Quality Rim', ['weight'] = 3000, ['type'] = 'item', ['image'] = 'chop_hqrim.png', ['unique'] = false, ['useable'] = false, ['shouldClose'] = true, ['combinable'] = nil, ['description'] = 'Aftermarket alloy rim.'},
['chop_lqrim1'] = {['name'] = 'chop_lqrim1', ['label'] = 'Steel Rim', ['weight'] = 2500, ['type'] = 'item', ['image'] = 'chop_lqrim1.png', ['unique'] = false, ['useable'] = false, ['shouldClose'] = true, ['combinable'] = nil, ['description'] = 'Stock steel rim.'},
['chop_speaker'] = {['name'] = 'chop_speaker', ['label'] = 'Door Speaker', ['weight'] = 800, ['type'] = 'item', ['image'] = 'chop_speaker.png', ['unique'] = false, ['useable'] = false, ['shouldClose'] = true, ['combinable'] = nil, ['description'] = 'Door audio speaker.'},
['chop_stereo'] = {['name'] = 'chop_stereo', ['label'] = 'Car Stereo', ['weight'] = 1200, ['type'] = 'item', ['image'] = 'chop_stereo.png', ['unique'] = false, ['useable'] = false, ['shouldClose'] = true, ['combinable'] = nil, ['description'] = 'Car head unit.'},
['chop_sub'] = {['name'] = 'chop_sub', ['label'] = 'Subwoofer', ['weight'] = 3500, ['type'] = 'item', ['image'] = 'chop_sub.png', ['unique'] = false, ['useable'] = false, ['shouldClose'] = true, ['combinable'] = nil, ['description'] = 'High output subwoofer.'},
4. Database Setup
The resource will automatically run CREATE TABLE IF NOT EXISTS queries on server launch. If you prefer to execute the tables manually, run this SQL script in your database manager (HeidiSQL / phpMyAdmin):
CREATE TABLE IF NOT EXISTS `wd_chopshop_players` (
`citizenid` VARCHAR(64) NOT NULL PRIMARY KEY,
`name` VARCHAR(100) NOT NULL DEFAULT 'Salvager',
`completed` INT NOT NULL DEFAULT 0,
`earned` INT NOT NULL DEFAULT 0,
`challenges` LONGTEXT NULL,
`updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
CREATE TABLE IF NOT EXISTS `wd_chopshop_transactions` (
`id` INT AUTO_INCREMENT PRIMARY KEY,
`citizenid` VARCHAR(64) NOT NULL,
`description` VARCHAR(255) NOT NULL,
`amount` INT NOT NULL DEFAULT 0,
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
5. Server Configuration (server.cfg)
Add ensure wd_chopshop to your server.cfg after its dependencies:
# Dependencies
ensure oxmysql
ensure ox_lib
ensure qb-core # Or es_extended / qbx_core
ensure qb-target # Or ox_target
ensure qb-inventory # Or ox_inventory
# Chopshop Resource
ensure wd_chopshop
6. Tablet / UI Configuration
- Open via command:
/sal - Open via Export:
exports['wd_career_chopshop']:openTablet() - Integrate with
wd-tablet: Trigger eventwd_career_chopshop:client:openTabletfrom your tablet app icon.
7. Verification & Testing
- Start the server and check the console for clean startup logs with no errors.
- Head to the Job Ped location at
vector4(862.75, -1346.38, 26.04, 95.85)(Jack). - Target Jack to open the job menu.
- Rent a Tow Truck (make sure you have $250 in cash).
- Open the tablet (
/sal) or review available dispatches. - Accept a contract, follow the GPS route, load the vehicle onto the flatbed, and tow it back to the Chop Shop Bay.
- Use the
chop_sawandimpactdriverto chop the vehicle parts and crush the frame. - Visit the Trade Post to sell the parts to Jack.
8. Troubleshooting & FAQ
- Q: The ped does not show any target options?
- Fix: Ensure your target script (
ox_targetorqb-target) is started beforewd_chopshopinserver.cfg.
- Fix: Ensure your target script (
- Q: "You need a saw to chop this door!" message appears?
- Fix: Ensure the item
chop_sawis in your inventory and registered in your inventory item config.
- Fix: Ensure the item
- Q: Particles/sparks do not emit from the saw?
- Fix: Make sure your client game build is
2372or higher (standard GTA V assetscr_paletoscoreis loaded natively).
- Fix: Make sure your client game build is
⚙️ Configuration & Customization Guide
This document provides a comprehensive explanation of every configuration setting available in shared/config.lua and shared/chop_config.lua.
1. shared/config.lua - General Settings
Pricing & Economic Settings
Config.Debug = false
- Type:
boolean - Description: When set to
true, prints detailed debug information in client and server consoles (e.g. blip coordinates, entity IDs, network control status).
Config.truckPrice = 250
Config.returnPrice = 250
truckPrice(number): Deposit amount charged to the player when renting a tow truck from Jack.returnPrice(number): Amount refunded back to the player when returning the tow truck undamaged.
Config.minPartsToReward = 1
- Type:
number - Description: The minimum number of components (doors, wheels, battery, etc.) a player must dismantle before they are eligible to claim frame crushing rewards and complete the dispatch.
Config.Payment = { low = 50, high = 52 }
- Type:
table - Description: Additional cash payout per mile traveled between the vehicle pickup location and the delivery chop bay. Reimburses fuel and time. A random number between
lowandhighis chosen.
Job & Tow Truck Settings
Config.jobVehicle = {
{ name = "Tow Truck", model = 'flatbed' },
}
- Type:
table - Description: List of tow trucks available for players to rent. You can add custom flatbed or tow truck models here.
Config.maxJobs = 8
Config.jobRefreshMinutes = 8
maxJobs(number): Maximum number of active contracts generated simultaneously on the dispatch board.jobRefreshMinutes(number): Interval (in minutes) after which unaccepted contracts cycle and regenerate with new locations and vehicles.
Salvage Vehicle Spawn Pool
Config.models = {
'drafter', 'adder', 'buffalo', 'comet2', 'crusader',
'baller4', 'sultan', 'oracle', 'felon', 'kuruma'
}
- Type:
table of strings - Description: Spawn pool of vehicle model names used for recovery contracts. You can add custom addon vehicles or vanilla GTA V models.
Job Ped & Spawn Coordinates
Config.jobPed = {
name = 'Jack',
model = `mp_m_weapexp_01`,
coords = vector4(862.75, -1346.38, 26.04, 95.85),
}
name: Display name for the NPC.model: Ped model hash for Jack.coords:vector4(x, y, z, heading)representing the world position of the NPC.
Config.TruckSpawnLocations = {
vector4(851.72, -1354.94, 26.08, 359.4)
}
- Type:
table of vector4 - Description: Coords where the rented tow truck spawns upon payment.
Pickup Coordinates Pool
Config.pickupCoords = {
vector4(172.95, -2539.09, 6.00, 358.87),
vector4(279.11, -2080.34, 16.75, 203.83),
-- Add more vector4 coordinates here...
}
- Type:
table of vector4 - Description: Locations across the map where damaged target vehicles will spawn when a contract is accepted.
Delivery & Trade Zones
Config.deliveryZone = {
coords = vector4(871.6, -1350.26, 26.31, 98.55),
size = vec3(34.0, 36.5, 14.0),
rotation = 0.0,
}
- Description: Polyzone bounding box around the chop shop garage bay where vehicles must be parked to start chopping.
Config.TradeZone = {
coords = vector4(153.85, -3210.05, 6.0, 0.0),
size = vec3(2.0, 5.0, 2.0),
rotation = 0.0,
}
- Description: Polyzone bounding box at the docks where players can interact with Jack to trade harvested components for scrap materials.
2. shared/chop_config.lua - Dismantling & Trading
Door & Panel Bone Mappings
ChopConfig.Doors = {
[0] = { index = 0, boneName = 'door_dside_f', label = 'Driver Door' },
[1] = { index = 1, boneName = 'door_pside_f', label = 'Passenger Door' },
[2] = { index = 2, boneName = 'door_dside_r', label = 'Rear Driver Door' },
[3] = { index = 3, boneName = 'door_pside_r', label = 'Rear Passenger Door' },
[4] = { index = 4, boneName = 'bonnet', label = 'Hood' },
[5] = { index = 5, boneName = 'boot', label = 'Trunk' },
}
- Maps native GTA V door indices ($0$ through $5$) to their bone names and user-facing labels.
Part Harvesting & Tool Requirements
ChopConfig.Parts = {
['door-0'] = { item = 'cardoor', equipment = 'chop_saw', part = 'body'},
['door-4'] = { item = 'carhood', equipment = 'chop_saw', part = 'body'},
['door-5'] = { item = 'cartrunk', equipment = 'chop_saw', part = 'body'},
['wheel-0'] = { item = 'carwheel', equipment = 'impactdriver', part = 'tires'},
['battery'] = { item = 'carbattery', part = 'engine' },
['exhaust'] = { item = 'exhaust', part = 'transmission' },
['gearbox'] = { item = 'gearbox', part = 'suspension' },
['radiator'] = { item = 'radiatorpart', part = 'engine' },
}
item: The inventory item rewarded upon successful dismantling.equipment: The tool required in player inventory (chop_saw,impactdriver, ornilfor hand tools).part: Category used for tracking daily & weekly challenge progression.
Tire State Drops
ChopConfig.PoppedTireItem = 'chop_lqrim1' -- Item awarded if tire was punctured / flat
ChopConfig.IntactTireItem = 'carwheel' -- Item awarded if tire was intact
Frame Crush Loot Pool
ChopConfig.endItems = {
{ item_id = 'chop_gps', low = 1, high = 1 },
{ item_id = 'chop_hqrim', low = 1, high = 4 },
{ item_id = 'chop_speaker', low = 1, high = 4 },
{ item_id = 'chop_stereo', low = 1, high = 1 },
{ item_id = 'chop_sub', low = 1, high = 2 },
{ item_id = 'chop_lqrim1', low = 1, high = 4 },
}
- When crushing the stripped frame at the bay, the player receives a randomized quantity between
lowandhighfor each item configured in this table.
Trade Post Material Payouts
ChopConfig.TradeItems = {
['cardoor'] = {
cash = { low = 100, high = 180 },
items = {
{ item = 'plastic', low = 2, high = 4 },
{ item = 'scrapmetal', low = 2, high = 5 },
{ item = 'iron', low = 1, high = 3 },
{ item = 'steel', low = 2, high = 5 },
{ item = 'carbon', amount = 1 },
}
},
-- Additional trade item configurations...
}
cash: Random amount of money paid per item traded.items: List of raw crafting materials given. You can use fixedamount = Xor randomizedlow = X, high = Y.
3. Customization Examples
Adding a Custom Addon Vehicle:
Add the spawn code to Config.models in shared/config.lua:
Config.models = {
'drafter',
'adder',
'mycustomcar', -- Your addon vehicle spawn code
}
Adding a New Pickup Coordinate:
Add a new vector4 to Config.pickupCoords in shared/config.lua:
Config.pickupCoords = {
-- Existing coordinates...
vector4(-1034.21, -2733.45, 13.76, 120.0), -- New pickup spot at LSIA
}
Adjusting Item Trade Rewards:
Edit ChopConfig.TradeItems['carbattery'] in shared/chop_config.lua:
['carbattery'] = {
cash = { low = 150, high = 250 }, -- Higher cash payout
items = {
{ item = 'copperwires', low = 3, high = 6 },
{ item = 'electronics', amount = 2 },
}
}
Enhance your FiveM server with Legal Chopshop | Advanced Multi-Framework
Instant automated delivery via Tebex with lifetime updates and direct support.
