Velo (Wix) Development: Where a Standard Template Breaks
The built-in builder covers the storefront, catalog, request forms, and payments—at the start, a standard template looks sufficient.
The limits of built-in functionality appear later: when business logic grows alongside the site, not content—calculations directly in the interface, user roles, exchange with external services.
A calculator with discounts, rates, and price depending on configuration is assembled in the builder as a set of conditions. It holds until the first price change: afterward, prices are duplicated in several places, and an error in one copy goes to the client in an invoice.
Roles hit the limitation that access is separated by pages, not by data: partner, client, and manager see the same account area with different buttons.
Exchange with a warehouse, accounting system, or payment provider relies on manual export until order volume makes it unnoticeable.
Then collections grow, and the interface bottlenecks fail first: filters on a catalog of thousands of items, queries in the account area, reports. Response degrades, support focuses on firefighting rather than development—site customization on the builder turns into rewriting.
We break down how this is covered: development on Velo (Wix) is programming on top of the built-in layer. Calculation logic, permissions, and exchange live in code that is versioned and tested, while the editor remains for content.
What Custom Velo (Wix) Development Provides
Custom logic on the platform changes not the page appearance but the system behavior under load. Some manual operations move into code: instead of exporting, editing, and re-uploading a table, an employee clicks one button.
At the same time, a class of failures related to desynchronization between the form, table, and external service disappears.
Velo is a development environment inside Wix, where server code lives alongside the interface and data collections. From there, you get access to element events, scheduled tasks, incoming calls, and external services—things the built-in builder does not manage.
Interface Performance as the Database Grows
Built-in binding of elements to a collection pulls the entire query: unnoticeable on hundreds of records, but on tens of thousands the list opens with a delay. We move filtering and pagination to the server, add indexes on search fields, and load related records only on demand.
Response time stops depending on database size: growth by multiples does not turn into seconds of waiting, and heavy calculations move to background tasks.
Where Custom Logic Is Needed and Where Built-in Tools Are Enough
Built-in tools are enough for a storefront, catalog, request form, and blog. Custom logic is needed where permissions at the level of individual records appear, multi-step approvals, formula-based calculations, change audit, and two-way synchronization with external systems.
The opposite mistake is rewriting into code what the platform does itself: support volume grows with no gain. Therefore, at the estimation stage we classify tasks by this criterion and state directly what is covered by configuration.
Implementation Options: Modules, External Service, Hybrid
The choice of option is determined not by code volume but by the load profile and where the data lives.
Built-in platform tools cover forms, catalogs, personal accounts, and scenarios with moderate logic; as soon as scheduled calculations, bulk queries, or exchange with external accounting systems appear, the question becomes whether to keep everything inside or move part outside.
| Option | When it fits | Limitations |
|---|---|---|
| Platform modules | Logic fits in a single request, data is small, reporting is simple | Long computations hit the execution time limit, bulk queries are paginated |
| External service for calculations | Scheduled recalculations, task queues, heavy analytics | Need data synchronization, a separate access perimeter, and communication failure control |
| Hybrid storage scheme | Fast reads in the interface, heavy data outside the platform | Harder to track integrity: need idempotent exchanges and redelivery |
When Built-in Tools Are Enough
Platform modules provide ready data collections, access control, and server-side code. This is enough if the scenario fits response time and query size limits, and third-party systems do not require constant exchange.
The limitations of this option are predictable and checked at the design stage—then external services are not needed at all.
When an External Service Is Justified
An external calculation service is used for regular recalculations, reports, and queue processing, where resilience matters more than instant response.
A hybrid scheme keeps the storefront and fast reads on the platform, while synchronizing heavy data by events—each exchange operation is repeatable, so communication failure does not lead to data discrepancy.
How the Project Proceeds: Stages of Engineering Work
Before the first line of code, we fix how the application will grow: how many collections will appear, who can read what, and what happens on rollback. This order eliminates rework—the interface and logic are built on top of an agreed data structure, not vice versa.
Data Schema and Permissions
- Task and constraints analysis — what scenarios the application covers, what already works, which platform limitations cannot be bypassed.
- Audit of the current solution — review existing pages, collections, duplicate fields, and non-obvious relationships that must not break during an update.
- Collection data schema — describe entities, relationships, and indexes: where the request lives, where the status lives, where the change history is stored and who writes it.
- Access rights setup — roles, read and write rules, field visibility restrictions, closing service collections from external requests.
- Logic implementation — scenarios, integrations with payments and notifications, error handling and repeated form submissions.
- Testing on a test copy — run key paths on a copy with depersonalized data before transfer to the production site.
- Transfer and acceptance — publication, verification on real data, handover of access and documentation, training for your team.
We agree on the collection schema before development: restructuring after launch costs more than designing it in a day. Acceptance is done against a scenario checklist—you can see which paths were tested on the copy, not just that “everything works.”
What You Keep: Code, Schemas, Procedures, Accesses
The project ends not with publication but with handover. The client receives a complete package—from source modules to admin rights—so the application can be developed and maintained without us.
- Project source code: Velo modules with comments on non-obvious parts, full change history in your repository, not in our archive.
- Data structure description: purpose of each collection, field types, relationships between entities, required fields, and value validation rules.
- Role-based access policies: “role—action” matrix for read and write, data privacy settings, list of service accounts.
- Change deployment procedure: sequence of edits, checks, and publication, as well as the procedure for rollback to the previous working version.
- Editor instructions: how to update content, add pages and blocks, what can be changed independently, and what requires an engineer.
- Integration schemas: list of external services, exchange formats, failure points, and actions when a partner service is unavailable.
- Admin accesses: transfer of owner rights for the site, domain, file storage, and repository to your accounts.
We compile documentation so a new developer can onboard in days, not weeks: data and access descriptions match the actual configuration rather than living separately from it.
We record the rights transfer with an act—after that our accesses are revoked, and further support is provided at your request.
Case Study: Personal Account with Calculations and Roles
An equipment rental supplier accepted requests in spreadsheets: a manager manually selected the rate, calculated the term and discount, and sent the calculation by email.
The client could not see the request status and called to clarify, and an amount discrepancy surfaced after approval. Below is what exactly was moved inside the platform and how it changed the numbers.
Task and Constraints
The personal account on Velo had to cover three roles: client, line manager, administrator.
Platform limitations shaped the architecture: calculations cannot be kept on the user side—the total amount is calculated only by a server function based on rate, term, and discount data, while amount and status fields in the interface are read-only.
Row-level permissions separate access: the client sees their requests, the manager sees requests for their line, the administrator sees all and can edit the rate grid.
Every change is written to a separate collection, so a dispute over “who changed the amount” is resolved by the log, not by correspondence.
Results in Numbers
- Cost calculation: used to be 1–2 business days for manager response—now 3–4 seconds after form submission.
- Share of operations without employee involvement: 34% → 91%—recalculation, approval, and notification happen inside the account.
- Support requests about request status: down 62% in the first quarter after launch.
- Amount errors due to manual entry: from 7–9 per hundred requests to zero—the rate is populated from reference data.
Roles and calculations stopped being a manual process: the manager focuses on deals rather than reconciling spreadsheets, and the client sees the price and status themselves.
The same permission contour and server-side amount validation transfers to the next account modules without rewriting logic.
What to Do If the Template Is Already Overloaded with Customizations
An overloaded template is not about lines of code but about coupling. First we map dependencies: which modules access the same collections directly, how many handlers are attached to events on one page, and where the same logic is duplicated with different conditions.
Modules on Velo (Wix Code) are often written iteratively, and if data writes bypass the common access layer, any edit pulls in rewriting of neighbors.
Then we divide the code into three groups. Isolated modules with explicit inputs and outputs are left as is—they do not interfere. Modules with repetitive logic are moved to a unified layer and edited selectively.
Everything tied to page state and render order is rewritten entirely. Such module refactoring proceeds in parts, and the site continues to accept orders during that time.
| Mode | When it fits | Limitations |
|---|---|---|
| In-place editing | 1–2 modules, low coupling | the next module will again affect neighbors, debt accumulates |
| Phased refactoring | the template is live, downtime is unacceptable | longer timelines, part of the logic temporarily lives in two variants |
| Section rebuild | high coupling, logic depends on render order | need phased data migration and a rollback plan |
A section rebuild without downtime is done alongside: the new section is built on a copy, data is migrated in portions, and the old version remains working until the last step.
Switchover happens only after running key scenarios on the copy, and rollback is a return to the previous configuration in one step.
Technical Concerns Before Start
Below are four questions that most often come up during technical review before work begins. The answers are short and specific: without promising “anything is possible,” indicating exactly how we work around platform limitations and what we do on the client side.
How to handle platform limits on requests and data volume?
The platform sets quotas on the number of storage calls and server code execution time. Heavy queries are moved to aggregates and built on schedule, lists are served page by page rather than entirely, and frequent reads are covered by cache.
We design the storage schema for these quotas in advance—with this approach, load growth does not hit the platform ceiling.
What happens when the user base grows several times over?
The bottleneck during growth is not record volume but queries without indexes and “everything at once” selections. We add indexes for real search scenarios, split output into pages, and move long operations to background processing with an execution log. Additionally, we provide an archive of rarely used records so working collections remain fast.
We depend on external services—what happens when they fail?
We isolate each integration behind its own layer: if an external service does not respond, the application continues to work, and operations are queued for retry.
Critical data is first recorded on our side, then transmitted outward, so service failure does not turn into lost requests or payments. To replace a provider, it is enough to rewrite one layer without redoing the application.
How is data integrity ensured?
We set up regular backup of collections and verification of restore from backup—not the fact of backup itself, but a actually tested rollback. Additionally, we maintain schema versioning: changing data structure does not break already saved records. Accesses are separated by roles, and actions with critical data are logged.
Describe your scenario—we will check it against these limitations and come back with an estimate and work plan.Let’s Discuss the Task and Come Back with an Estimate and Plan
We start task discussion with source data—then the estimate relies on facts, not assumptions. A test copy of the site and a description of scenarios is enough: set up accesses with limited permissions, we do not touch the production environment. What to send or tell us:
- Access to the project test copy or structure export: pages, data collections, server code on Velo, permission settings.
- Step-by-step scenario description: registration, order placement, calculation, report export, notifications.
- User roles: who sees and changes what, where data restrictions and action history are needed.
- Data examples: 5–10 real records from collections—volumes, field types, relationships between tables.
- Current bottlenecks: where speed drops, what is edited manually, which solutions have already been tried and why they were rejected.
- Constraints: external services for data exchange, deadlines, requirements for the mobile version and peak load.
Based on this data, we come back with a staged work plan: test environment preparation, collection and access schema, logic migration, scenario testing, publication.
We fix the acceptance procedure in advance—a checklist for each scenario, a run on the test copy, then publication and an observation period with review of issues. Describe the task—we will come back with an estimate and plan.







