Any agency can write a deck. Ten slides of strategy, a moodboard, a mechanic described in one careful paragraph, and a line item near the back that reads 3D assets: TBC.
We stopped doing that.
When Code Crush answers a brief, the deliverable is a link. You open it on your phone in the meeting and the thing moves: a game you can actually lose, a prize wheel that really spins, a mascot you can drag around with your thumb. The strategy is still in there — it is just underneath something you can press.
This is the honest version of how that gets made. What goes into a campaign proposal, how we model and rig the 3D that carries it, where the hard parts are, and what we refuse to promise.

Why Most Campaign Proposals Die in the Room
A deck asks the client to do the imagining. It describes a feeling — "playful", "immersive", "snackable" — and then asks a marketing director to sign a budget against their own mental picture of it. Two things go wrong.
The picture in the room is not the same picture. Everyone nods at "3D spin-to-win", and four weeks later the brand team is surprised by the lighting, the weight of the wheel, the way the pointer lands. Nobody lied. Nobody was ever looking at the same thing.
The deck hides the risk. Slides are frictionless. They never reveal that the mechanic needs a platform that shut down last year, that the 3D model will not load on a mid-range Android in a TikTok in-app browser, or that the reward logic cannot be audited. Those discoveries arrive after the purchase order.
A playable proposal removes both problems on day one. If it runs, it runs. If it does not, you found out before the money moved.
What's Inside a Code Crush Campaign Proposal
Every proposal we send is built from the same five parts. The balance shifts with the brief; the shape does not.
That last one costs us pitches occasionally. It has also never cost us a client after signature, which is the trade we prefer.
The Proposal Process, Step by Step

When the Brief Asks for a Platform That No Longer Exists
The clearest example of why step two matters came from Decathlon Vietnam, who asked for a viral face-tracking filter game on TikTok and Instagram.
We could not build that brief as written, and neither could anyone else. Meta shut Spark AR — its third-party AR filter platform — down on 14 January 2025, so custom Meta filters cannot be published at all. TikTok's Effect House still exists, but it is a closed editor: your rewards, your CRM and your fraud checks have to live inside someone else's sandbox.
So we delivered the same experience as WebAR instead — face tracking with Google's MediaPipe FaceLandmarker, running in the mobile browser, shared by link or QR. One link works in TikTok's in-app browser, Instagram, Zalo, Messenger or off a poster, and the whole reward-and-data loop stays first-party. The full write-up is in Decathlon "Deal Frenzy": a shareable WebAR face-filter game.
That is what a proposal is for. Not to flatter the brief — to find the wall before the campaign does.
Custom 3D Models, Built in Blender and Shipped to the Browser
Our 3D is not stock. It is modelled in Blender, and — for anything we expect to revise — it is modelled by script, so the whole asset can be rebuilt from one command.
Take the Lucky Wheel. A single headless Blender run regenerates three things at once: the editable .blend source, the wheel.glb the game loads (about 635 KB), and the beauty render the configurator shows in its template picker. Change a bevel, re-run, and the source, the shipped model and the deck visual all move together. There is no stale render sitting in a folder contradicting the build.
That discipline is what made a collection affordable. The wheel now ships as four distinct sculptures — Signature, Orbit, Atelier and Prism — each with its own frame, materials and lighting, and each swappable in the configurator without touching the prizes, probabilities, uploaded images or centre logo.

Materials are named deliberately, not decoratively. The wheel exposes CC_Chrome, CC_Hub, CC_Pointer and CC_Accent, so a brand's palette is applied live in the configurator instead of coming back to us as a re-export request. Sector artwork and the centre medallion sit on their own independent textures, customisable from 2 to 12 sectors.
The same thinking scales up. In the 3D apartment showroom, the architectural geometry is measured in metres, colour maps are sRGB while data maps stay linear, and the scene runs HDR image-based lighting, 4096px directional shadows with PCSS penumbra, screen-space ambient occlusion, planar parquet reflections, restrained bloom and ACES filmic tone mapping — in a browser, in real time. A prefiltered cube capture of the furnished interior feeds the stone, brass and dark metal, and refreshes once a lighting or finish change has settled.
The Geometry Contract: Why the Model and the Game Never Drift
Here is the part nobody puts in a pitch deck, and the part that decides whether a campaign embarrasses a brand.
A prize wheel is a promise. If the pointer visually lands between two sectors while the server says the player won a scooter, the campaign has a credibility problem and the client has a support problem. So the model and the code share an explicit, written geometry contract:
Because that contract is written down, it can be tested. The Lucky Wheel ships with 28 targeted tests covering the draw itself, zero-weight exclusion, content preservation, pointer alignment for every sector count from 2 to 12, and loading all four GLB files through the game's own decoder. Swapping the 3D model cannot move the prize. That is a design decision, verified on every commit.
Rigged 3D Characters From Flat Reference Art
Mascots are the hardest ask in this category, because a brand's character already exists — as flat illustration, in a usage guide, in everyone's memory. It has to arrive in 3D recognisably itself.
For Toyota Vietnam's Million Green Miles pitch we rebuilt the campaign mascot, Miraito, as a fully rigged 3D character from supplied reference art: 33 bones, 8 IK controls in Blender, and 4 facial expressions driven as morph targets. It ships with five motion states — idle, walk, wave, celebrate, point — auto-blink, and independent left and right eye control. The whole build, and the review tool around it, is written up in how we turn a 2D mascot into a 3D character.
Then we wrapped it in a review tool, because a rig you cannot inspect is a rig nobody can approve. The client opens one link and gets:
One caveat we hold to: where a mascot's usage guide forbids recolouring or redrawing the character, our 3D reconstruction is an approximation for review and gets brand-team sign-off before anything ships — and any flat placement in the deck composites the official artwork rather than our version of it.
Three Routes to a 3D Model — and When We Use Each
Not every object deserves the same investment. Deciding that up front is most of the craft.
The middle route is newer than most agencies realise, and we have put it into production: a single photograph can now yield object meshes, a walkable environment, matched lighting and spatial audio. We took that pipeline apart in Image Blaster: turn a single photo into a walkable 3D world.
The third route matters more than it sounds. Every downloaded material and HDR in our showroom is recorded with its source page and checksum in a manifest, and the whole set can be re-fetched with one script. A client should never inherit an asset nobody can license or replace.
Making 3D Fast Enough for a Mid-Range Android
A beautiful model that stalls on the device your audience owns is a failed model. So the performance work is part of the modelling work, not a later pass.
What We Don't Promise
The limits page is a real page. A few of the things on ours:
The Proposal Is the First Sprint of Production
Because the proposal is a real build, approving it does not restart the work.
The Blender sources are yours, editable, in an open format — no proprietary scene file, no lock-in. The glTF the prototype loaded is the glTF production loads. The geometry contract the prototype was tested against is the contract the live campaign inherits. The renders in the deck came out of the same scene. When a client says yes, we are not opening a blank file; we are hardening something that already runs.
That is also why the game builder platform exists: once the hero model respects a contract, the campaign around it — prizes, probabilities, palettes, copy, exports — becomes configuration rather than a rebuild.
Bring Us a Brief
If you have a campaign that needs an object at the centre of it — a product, a mascot, a prize, a machine — the fastest way to find out whether it works is to hold it.
See what we have built in our projects, browse the branded games catalogue, read how the 3D rendering stack works, or just send us the brief. We will send back a link.
Technical details in this article describe work built by Code Crush. Client prototypes are concepts unless stated otherwise; the Spark AR shutdown date is per Meta's public announcement.
Frequently Asked Questions
- How long does a playable campaign proposal take?
- Days, not weeks, for a single playable loop plus one hero 3D asset. The variable is 3D scope: a scripted hero object is fast, while a rigged character with facial expressions and several motion states is the longest item on the list.
- Do we get the actual 3D files, or just a video?
- The actual files. Editable Blender sources, web-ready glTF/GLB, and the offline renders — all in open formats that drop straight into Blender, Unity, Unreal or a web viewer.
- Can you model our product or mascot accurately from what we have?
- Yes. We work from reference art, photography, packaging or CAD. Where a licensed character carries usage rules that forbid redrawing or recolouring it, our 3D build is an approximation for review and goes to the brand team for sign-off before anything ships.
- Will the 3D actually run on low-end phones and in-app browsers?
- That is designed in, not hoped for: Draco-compressed geometry served from our own origin, a separate mobile quality tier, a 30fps cap with off-screen pausing, reduced-motion support, and a 2D fallback when WebGL is unavailable. We test down to a 320px-wide screen.
- What do you need from us to start a campaign proposal?
- The brief, your brand assets and guidelines, the reward mechanics you have in mind, and the market and channel you are targeting. If a requirement cannot survive contact with a real device or a real platform, you will hear it from us in the first conversation rather than after signature.
- Can the proposal be published as a live campaign?
- Yes. The same build exports to Facebook Instant Games, playable ads and MRAID for Meta, Google, TikTok and Moloco, or ships as a hosted link and QR code. What a live campaign adds is the server side: real draws, stock reservation, quotas, receipts and anti-fraud.
Tagged with



