Portfolio / Catalog and brand voice
The brand existed. The store did not.
·opuesto·aqua is the competition swimwear and teamwear line of ·opuesto·, a brand that defines itself as the opposite of conventional. It arrived with a brand book, an identity manual and a clear read on its customer — and with no sales infrastructure at all: 16 SKUs in a spreadsheet and an Elementor theme inherited from a footwear store, complete with a New York address and staff names belonging to nobody. We built the whole foundation: catalog architecture, brand copy across seven pages, a legal framework, and an SEO base.

01The brief
Plenty of identity. No sales channel.
·opuesto· already had the hard part: a brand archetype, a code of behaviour — eccentricity, singularity, boldness, surrealism — and a clear read on its customer, someone who feels free, is curious, fears mediocrity, and needs to execute their ideas without anyone editing them. That DNA was written down and it was good. What did not exist was its translation into something anyone could buy.
The brief was to build that translation end to end for the aquatic sub-line: a catalog that could survive growth, a brand voice on every page, a legal framework that matched how the business actually sells, and an SEO base laid at the start instead of patched on afterwards.
What already existed
- 01Brand book and visual identity manual
- 02Customer empathy matrix
- 03A 2026 catalog with 16 SKUs in a spreadsheet
- 04Product and real team photography
- 05A domain with WordPress installed
- 06An Elementor theme from another industry
Our role
WooCommerce catalog architecture, SKU and attribute mapping, seven pages of copy with implementation instructions, terms and conditions written for this business, application of the visual system, and SEO strategy folded into each page guide.
02The diagnosis
A site that was talking about shoes.
Auditing the existing site turned up three problems of different orders: one of content, one of data, one of structure. All three had to be solved before a single line of brand copy was written.
Fake staff and an invented address.
The template carried names of people who do not exist, a New York address belonging to nobody, and footwear references in the forms. It was not a half-finished site: it was another business's site with the logo swapped.
Sixteen SKUs in a spreadsheet.
The 2026 catalog existed as a file, not as a store: no categories, no variation attributes, no SKU convention. It was processed with Python to extract and map the products before any of them got copy.
Child and adult in one field.
Almost every product exists in both youth and adult ranges. Putting both into a single size attribute is the decision that breaks store filtering — and it does not show on launch day, it shows six months later.
03The decision
The one that avoids the mess that arrives later.
Youth and Adult are not the same attribute.
A competition rashguard sells in 4, 6, YXS, YS, YM and YL, and also in XS, S, M, L, XL and XXL. In one field that is twelve options with no hierarchy, and store filtering stops working: the parent shopping for a child and the swimmer shopping for themselves get the same scrambled list.
They were split from the first product. Every page serves three independent selectors — Child / Youth (4 · 6 · YXS · YS · YM · YL), Adult (XS · S · M · L · XL · XXL) and Colour (Black · White) — and out of them come the 36 variations each product carries in production. Fixing this after launch means rebuilding the entire catalog.
MapSplitScale
04Visual system
Pool water, podium gold.
Light grounds and breathing space
- HEX
- #C3E7F1
- RGB
- 195 · 231 · 241
Section headings and navigation accents
- HEX
- #519CAB
- RGB
- 81 · 156 · 171
Cover headline and deep surfaces
- HEX
- #050E35
- RGB
- 5 · 14 · 53
The accent that shows up only when it matters
- HEX
- #FFC64F
- RGB
- 255 · 198 · 79
Product typography and store buttons
- HEX
- #000000
- RGB
- 0 · 0 · 0
05The system
From a spreadsheet row to a sellable page.
The catalog was not loaded by hand, product by product. It was processed as data first and built second, which is the only way the twelve missing SKUs can arrive with the same structure as the four already there.
2026 catalog
Spreadsheet of source SKUsPython · pandas
Extraction and mappingWooCommerce
Categories and attributesElementor Pro
Pages and copy blocksRank Math
Meta, keyword and schemaProduct page
Variations and cart
- 01
Read the catalog as data
The 16 SKUs in the 2026 sheet were extracted with Python and mapped into 4 parent categories — teamwear, swimwear, accessories and the shop line — with slugs ready for WooCommerce.
- 02
Fix the SKU convention
Every product gets a three-letter code and every variation is composed from it: MRG, FRG, WTS, WBJ, BJT, JGR. The convention is defined before the first product exists, not once there are forty.
- 03
Split the size attributes
Child / Youth and Adult go in as separate attributes, plus Colour. The variations come out of the combination without asking the buyer to read a list of twelve mixed sizes.
- 04
Write the copy against the brand
Nothing was drafted generically: every block was checked against the brand book and the empathy matrix, and delivered with a “Remove → Replace With” instruction so that pasting it into the right Elementor widget requires no interpretation.
- 05
Put the SEO in the same guide
Focus keyword, meta title, meta description and schema notes travel inside each page's guide rather than in a separate document. A separate technical annex is an annex nobody implements.
- 06
Publish the page
Each product ends up variable, with its gallery, its short and long descriptions, its visible SKU and its category. The four in production serve 36 variations each.
16 SKUs mapped · 4 products built · 144 variations in production
06Legal framework
Terms written for custom orders.
Fourteen sections drafted around how this business actually sells, under the jurisdiction of Medellín, Antioquia and Colombia's Law 1480 of 2011. A generic e-commerce template would have left out the three things that actually cause disputes here.
An order can be a single piece.
Zero minimums is a commercial advantage, but it changes what cancelling means: if every order enters made-to-measure production, the moment it becomes binding has to be stated precisely.
Who answers for the logo you send.
A team sends its crest, its colours and its name. If that material infringes someone else's rights, the text has to make the responsibility clear — while protecting ·opuesto·'s own graphic elements at the same time.
A custom suit cannot be resold.
Standard e-commerce returns do not apply to a garment carrying another team's name. The policy was written for that, alongside the size table from Child 4 to Adult XXXL and real manufacturing lead times.
07The pieces
The site as built, behind the lock.

“We are water driven” set in condensed type over the swimmer, and under it the four-step process: choose a category, select products, customise the design, approve and receive. The brand's promise and the way to buy from it, in the same view.

The team section: warm-up jacket and pant shot in studio, with copy that separates a uniform from technology — “not a uniform, it is the technology that powers your performance”.

The aquatic counterpart, with the product photographed full body. The condensed headline is deliberately cropped against the image edge: it is the gesture the brand repeats in every section.

The four products built, rendered on white with the wave pattern closing the section. It is the grid the twelve missing SKUs have to drop into.

The Male Rashguard page with its three separate selectors — Child / Youth, Adult and Colour — plus the SKU and category on show. This is where the architecture decision stops being theory.

The Swimwear landing, with the lockup gaining a descriptor under the wordmark and the wave pattern as a divider. The same graphic device orders the hierarchy across the site.

Kits already produced for clubs — sets, backpacks and towels carrying the team's name. It is the proof this category needs: not a render, but delivered product in use.

“Ready to Gear Your Team?” above the custom-order form. The new headline is published; the contact details inherited from the template have not been replaced yet.
08The work
What is standing.
Figures read from the store's API on 25 August 2026 rather than from the delivery document: this is what is loaded in the client's WordPress right now.
- 16
- SKUs mapped from the 2026 catalog
- 144
- Live variations across the products built
- 12
- Published pages, seven of them rewritten
- 14
- Sections in the terms and conditions
09The stack
What runs underneath.
Verified against the namespaces the site's REST API exposes. This is not the list of what was recommended: it is what is installed and active today.
WooCommerce · WooCommerce POS
Variable products with per-product attributes, categories, cart and checkout. The point-of-sale module is installed for selling in person at events and clubs.
Elementor Pro · Slider Revolution
Elementor Pro over the Hello theme, which is the right blank canvas when the builder carries the design. The copy shipped in blocks meant to be pasted widget by widget.
WP Rocket · Really Simple Security · WP Mail SMTP
Caching, a security layer with two-factor, and authenticated mail delivery, on Hostinger hosting. Rank Math and Site Kit are wired up to measure from the day it opens.
10The status
All built. The door shut.
opuestoaqua.com answers 503 with maintenance mode on: the site exists, it is built, and it can be walked end to end from a logged-in session, but it was never opened to the public. Publishing is the client's call and it never came. This case documents the foundation delivered, not a launch.
What remains is concrete and listed: load the twelve missing SKUs with the same variable structure as the four already there, set prices — the pages currently sit at zero — write alt text for the product images, and replace the contact details still surviving from the inherited template. None of those tasks requires redoing anything: the architecture holds all four.
Ready to publish
- 014 parent categories defined with their slugs
- 02Global attribute table ready to import
- 034 variable products built and browsable
- 047 pages of copy with pasting instructions
- 0514-section terms and conditions, published
- 06Meta and focus keyword per page in Rank Math
What this case does not claim
There are no traffic, sales or ranking figures, and there will not be while the site stays closed: nobody outside has seen it yet. What is published here are pieces that are built and verifiable against the site's own API.
More of the work
A badly structured catalog does not fail on day one. It fails the day it starts working.
Fashion, sport, any store with sizes and variants: the decision that determines whether you can grow is made before the first product is loaded, and it is almost never visible from outside.
Tell us about your project