LC
Open to new opportunities

Payments · Pricing · Platform

Luis Correal Viveros

I build the parts of a product that cannot afford to be wrong — payment capture, pricing engines and the services that move real money.

~/sellit9 — zsh
$luis --whoami
roleFull Stack Developer
domainpayments · pricing · platform
stackTypeScript · NestJS · Next.js · Prisma
cloudGCP (Cloud Functions, Workflows, API Gateway)
shippingCanada 🇨🇦 · United States 🇺🇸
$
2,828
commits at SELLIT9
Nov 2024 → Jul 2026
18
production repos
backend · portals · IaC
30+
cloud functions
GCF Gen 2 · TypeScript
5
years shipping
since Aug 2021

Toolkit

Technologies I work with

Deep where it matters — TypeScript, Prisma and GCP — and comfortable across the rest.

Languages

  • TypeScript
  • JavaScript
  • Python
  • SQL
  • Java
  • HTML
  • CSS

Backend

  • NestJS
  • Node.js
  • Django
  • DRF
  • Prisma
  • REST
  • SOAP

Frontend

  • Next.js
  • React
  • React Native
  • Angular
  • Vue
  • Tailwind CSS

Data

  • PostgreSQL
  • MySQL
  • Redis / Valkey
  • Migrations
  • Prisma Decimal

Cloud & infra

  • GCP
  • Cloud Functions
  • Cloud Workflows
  • Cloud Build
  • API Gateway
  • AWS EC2
  • Nginx
  • Docker

Practice

  • Git
  • Code review
  • Unit & e2e testing
  • Sentry
  • Jira
  • Notion

About

Engineer of the parts that must not fail

Systems engineer, building software professionally since 2021. Today I work on SELLIT9, Canada's tech trade-in platform, where I own payments, the dynamic pricing engine, multi-region expansion and a serverless backend of 30+ Cloud Functions on GCP. I move comfortably from a Prisma migration to a Next.js 16 interface — and I care most about the seams in between.

I like the unglamorous work: the migration that has to preserve every row, the guard that makes a retry idempotent, the test that pins down a rounding rule. Most of what I ship is invisible when it works — and that is the point.

location · Pereira, Colombialanguages · Spanish, English

Money paths that don't break

Stripe payment intents, off-session capture, consent records and webhook reconciliation — designed so a retry, a race or an expired authorization never turns into a double charge.

Pricing as a system, not a column

An extensible condition-tier engine with per-category, per-buyer and per-location overrides, decimal-exact math, price snapshots and "up to" previews for conditions with no fixed price.

Serverless platform engineering

GCP Cloud Functions, API Gateway with OpenAPI contracts, Cloud Workflows, Cloud Build pipelines and load-balancer routing — infrastructure kept in code, reviewed like code.

Selected work

What I've built at SELLIT9

Canada's tech trade-in platform. Seven domains I designed, shipped and still own — from the database migration up to the interface an operator uses every day.

01

Payments & money movement

Stripe · webhooks · concurrency

Owner of the payment path end to end: intent creation, hold consent, capture and reconciliation across the platform's trade-in journeys.

  • Migrated the data model from one payment per order to 1:N so an expired authorization is re-charged as a new payment row instead of overwriting the old one — the database now mirrors Stripe exactly and the webhook reconciles both intents naturally.
  • Closed a double-charge race in the recovery path by replacing a raw row lock with a Serializable transaction and scoping the in-flight guard to the order rather than the payment.
  • Built consent capture (PaymentConsent model, consent text, user-agent trail) and off-session payments with setup_future_usage for later captures.
  • Exposed fail-closed capture routes through the admin gateway, with a dedicated payment-operator role and permission set.
NestJSStripePrismaCloud FunctionsSentry
02

Dynamic pricing engine

condition tiers · decimals · snapshots

Replaced a fixed condition enum with an extensible tier system that lets every category, buyer and location price its own condition matrix.

  • Designed the condition / category_condition schema and the migration that seeded it without downtime, then threaded condition codes through pricing, collection options and drop-off rules.
  • Computed an "up to" preview for conditions with no resolved price, so the seller-facing UI never shows an empty offer.
  • Moved multiplier math to Prisma.Decimal with a tested rounding formula, and added per-region price snapshots with a unique constraint.
  • Shipped a lightweight /v2/items/prices/by-sid endpoint and de-duplicated SIDs in the cart refresh — fewer, cheaper round trips on every cart view.
PricingPrismaDecimalIntegration tests
03

Multi-region & multi-currency expansion

Canada → United States

Carried region and currency awareness through every layer so the platform could open a second country without forking the product.

  • Replaced internal region IDs with region codes across services, DTOs and tests, and added a ConfigRegion model with per-region config overrides.
  • Added currency code and conversion rate to orders, products, adjustments and vouchers so historical totals stay truthful after a rate change.
  • Region-aware postal-code validation (dynamic length and copy: "Postal code" vs "ZIP Code") plus a seeded US ZIP dataset.
  • Region-scoped visibility for showcased categories and specs, so each market shows its own catalogue.
i18nMigrationsDTOsNext.js
04

Reassessment flow, end to end

schema → cloud function → two portals

Designed and shipped the whole bad-grading dispute feature: when a buyer disagrees with how an item was graded, they can now contest it with evidence and get a documented verdict.

  • Prisma models, relationships and enums for disputes, plus a DISPUTES_MANAGER admin role wired into the auth service's permission matrix.
  • Buyer portal: report flow with a cascading spec selector, model picker, proposed-price path and evidence upload to a dedicated private bucket keyed by buyer.
  • Admin portal: review console with reviewer column, before → after spec diffs, evidence download, filters and readable verdicts.
  • Renamed the entire domain from "grading dispute" to "reassessment" across schema, API Gateway routes, functions and both UIs — with an in-place migration that preserved every row.
Full stackRBACGCSCloud Functions
05

Buyer & admin portals

operator tooling

Built the internal surfaces the operations team lives in, with the guardrails that keep order data trustworthy.

  • Catalog-first "add item" flow: debounced model search proxied through a same-origin rewrite, exact SID resolution via the spec wizard, catalog price prefill and an explicit condition pick.
  • Every buyer-created product writes a field-level audit row atomically with the insert, so the admin audit view shows exactly who changed what.
  • Order completion gated on open reassessments and permissions, with an optimistic lock and status guards that reject completion on invalid lifecycles.
  • Payment tab on the order detail: all payment rows newest-first, each with state derived from its own recorded webhooks.
Next.js 16React 19Audit trailPermissions
06

Serverless platform & infrastructure

GCP · IaC · observability

The delivery substrate under all of the above — kept declarative, reviewable and deployable per function.

  • 30+ Cloud Functions Gen 2 in TypeScript, with a shared package for cross-cutting concerns hoisted out of duplicated code.
  • API Gateway OpenAPI specs, load-balancer URL maps and Cloud Build pipelines for granular, per-function deploys.
  • Cloud Workflows orchestrating order creation, cart clearing, abandoned-cart email sequences and parallel Slack / SMS / merchant-email branches.
  • Sentry hardening: credential redaction before capture, structured error details from the Canada Post API, and error boundaries with retry-and-cache around a flaky CMS.
GCPCloud WorkflowsCloud BuildOpenAPI
07

Third-party integrations

commerce · finance · logistics

Connected the platform to the systems merchants and operators already use.

  • Shopify embedded app: discount-code generation and preview endpoints, merchant verification, session storage on a dedicated Prisma schema.
  • QuickBooks bill sync, including skipping PDF fetches for synthetic zero-value invoices.
  • Canada Post v2 shipping with full error diagnostics surfaced to Sentry instead of an opaque failure.
  • Webflow merchant sync, HubSpot forms for reschedule requests, and Strapi CMS content with a model → brand+category → generic fallback chain.
ShopifyQuickBooksCanada PostStrapi

Experience

Where I've worked

Five years across fintech and commerce — banking integrations in Colombia, then a payments and pricing platform serving Canada and the US.

  1. SELLIT9

    current

    Full Stack Developer

    Nov 2024 — Present · Remote · Canada

    Canada's tech trade-in platform. I work across the whole stack: NestJS API gateway, a Prisma schema shared as a versioned package, 30+ Cloud Functions, GCP infrastructure as code, and four Next.js front ends.

    • Own the payments domain — Stripe intents, consent, capture, webhook reconciliation and the concurrency guarantees around them.
    • Designed the dynamic condition-and-pricing engine that powers every offer shown to a seller.
    • Led the multi-region, multi-currency work that opened the US market.
    • Shipped the reassessment feature end to end, from database migration to buyer and admin interfaces.
    TypeScriptNestJSNext.jsReactPrismaPostgreSQLGCPStripe
  2. Bemovil

    Full Stack Developer

    Aug 2021 — Nov 2024 · Pereira, Colombia

    Fintech platform integrating Colombian banking products. Backend in Django and Node.js, front ends in Angular and React, deployed on AWS.

    • Integrated banking products — deposits, withdrawals and loan payments — against multiple Colombian banks over REST and SOAP APIs.
    • Deployed web applications on AWS EC2 with Nginx virtual hosts.
    • Upgraded the Python kernel and dependency tree of the company's core platform, keeping the test suite green through the migration.
    • Built internal tools for bank/customer balance reconciliation and automated mass billing.
    PythonDjangoNode.jsAngularReactMySQLAWSNginx
  3. NetCompany

    Intern Developer

    Feb 2021 — Aug 2021 · Buga, Colombia

    Full stack development of the company's internal web application for online sales and hosting management.

    PHPJavaScriptMySQL

Education

Systems Engineer

Unidad Central del Valle del Cauca (UCEVA)

2016 — 2022 · Tuluá, Colombia

  • Competitive programming marathons.
  • Research work presented at Pontificia Universidad Javeriana (2019).
  • Thesis presented at REDIS (2019).

Contact

Let's build something that has to work.

I'm open to backend, full stack and platform roles — remote or hybrid. The fastest way to reach me is email.

luis@topeluis.dev