fix: trocar es-PY por es
This commit is contained in:
parent
6301e33686
commit
9c393f01e5
129
Content/DevTutoriais/formatos-de-imagem.es.md
Normal file
129
Content/DevTutoriais/formatos-de-imagem.es.md
Normal file
@ -0,0 +1,129 @@
|
|||||||
|
---
|
||||||
|
title: "PNG, WebP o SVG: Eligiendo el Formato Correcto para tu Código QR"
|
||||||
|
description: "Comparativa técnica entre PNG, WebP y SVG para códigos QR vía API. Conoce cuál formato usar según tu caso de uso: e-mail, impresión, web o apps."
|
||||||
|
keywords: "qr code png, qr code webp, qr code svg, formato imagen qr code, api qr code formato"
|
||||||
|
author: "QRRapido"
|
||||||
|
date: 2026-03-08
|
||||||
|
lastmod: 2026-03-08
|
||||||
|
image: ""
|
||||||
|
---
|
||||||
|
|
||||||
|
# PNG, WebP o SVG: Eligiendo el Formato Correcto para tu Código QR
|
||||||
|
|
||||||
|
La API QRRapido soporta tres formatos de salida: `png`, `webp` y `svg`. Cada uno tiene características distintas que impactan el tamaño del archivo, la calidad y la compatibilidad. Usa el parámetro `outputFormat` en la solicitud para elegir.
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"content": "https://tuempresa.com",
|
||||||
|
"type": "url",
|
||||||
|
"outputFormat": "webp"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Resumen Rápido
|
||||||
|
|
||||||
|
| Formato | Tamaño | Escala sin pérdida | Compatibilidad | Ideal para |
|
||||||
|
|---|---|---|---|---|
|
||||||
|
| **PNG** | Medio | No (raster) | Universal | Impresión, e-mail, sistemas legados |
|
||||||
|
| **WebP** | Pequeño (~30% menor) | No (raster) | Browsers modernos | Web, apps, APIs |
|
||||||
|
| **SVG** | Variable (generalmente menor) | **Sí** | Browsers, Adobe, Figma | Logos, banners, impresión vectorial |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## PNG — El Estándar Universal
|
||||||
|
|
||||||
|
PNG es un formato raster sin pérdida, ideal para códigos QR porque preserva 100% de los píxeles blancos y negros sin introducir artefactos.
|
||||||
|
|
||||||
|
**Cuándo usarlo:**
|
||||||
|
- Envío por e-mail (clientes de correo antiguos no soportan WebP)
|
||||||
|
- Integración con sistemas legados
|
||||||
|
- Cuando la compatibilidad máxima es prioridad
|
||||||
|
|
||||||
|
**¿Por qué no JPEG?**
|
||||||
|
|
||||||
|
> JPEG usa compresión con pérdida que introduce artefactos de borrosidad en los bordes de los módulos del código QR. Eso puede volverlo ilegible, especialmente en tamaños pequeños. **Nunca uses JPEG para códigos QR.**
|
||||||
|
|
||||||
|
```json
|
||||||
|
{ "outputFormat": "png" }
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## WebP — Recomendado para Web y Apps
|
||||||
|
|
||||||
|
WebP es el formato ideal para la mayoría de las integraciones modernas. La calidad visual es indistinguible del PNG para códigos QR, con **25–35% menos tamaño de archivo**.
|
||||||
|
|
||||||
|
**Ventajas:**
|
||||||
|
- Carga más rápida en páginas web
|
||||||
|
- Menor uso de ancho de banda en APIs con alto volumen
|
||||||
|
- Soporte nativo en todos los browsers modernos (Chrome, Safari 14+, Firefox, Edge)
|
||||||
|
- Menor consumo de almacenamiento en la nube (S3, GCS, etc.)
|
||||||
|
|
||||||
|
**Cuándo usarlo:**
|
||||||
|
- Visualización en `<img>` en sitios y aplicaciones web
|
||||||
|
- Apps iOS/Android (ambos soportan WebP)
|
||||||
|
- Cuando guardas los QR generados
|
||||||
|
|
||||||
|
```json
|
||||||
|
{ "outputFormat": "webp" }
|
||||||
|
```
|
||||||
|
|
||||||
|
Para mostrar en HTML:
|
||||||
|
```html
|
||||||
|
<picture>
|
||||||
|
<source srcset="data:image/webp;base64,{{ qrCodeBase64 }}" type="image/webp">
|
||||||
|
<img src="data:image/png;base64,{{ fallbackBase64 }}" alt="Código QR">
|
||||||
|
</picture>
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## SVG — Para Escalar sin Pérdida
|
||||||
|
|
||||||
|
SVG es un formato vectorial: el código QR se describe matemáticamente, no como píxeles. Eso significa que se puede redimensionar a cualquier tamaño — desde un ícono de 16px hasta un banner de 3 metros — sin perder calidad.
|
||||||
|
|
||||||
|
**Cuándo usarlo:**
|
||||||
|
- Material gráfico (banners, carteles, packaging, camisetas)
|
||||||
|
- Integración con herramientas de diseño (Figma, Illustrator, Canva)
|
||||||
|
- Impresión de alta calidad sin depender de la resolución
|
||||||
|
|
||||||
|
**Atención:**
|
||||||
|
- No uses SVG para envío por e-mail (la mayoría de los clientes bloquea SVG por seguridad)
|
||||||
|
- Algunos lectores de QR antiguos pueden tener dificultad con SVG renderizado directamente vía `<img>`
|
||||||
|
|
||||||
|
```json
|
||||||
|
{ "outputFormat": "svg" }
|
||||||
|
```
|
||||||
|
|
||||||
|
Para mostrar SVG inline, el `qrCodeBase64` debe decodificarse primero:
|
||||||
|
```js
|
||||||
|
const svgString = atob(qrCodeBase64);
|
||||||
|
document.getElementById('qr').innerHTML = svgString;
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Comparativa de Tamaño (ejemplo real — 400px, URL simple)
|
||||||
|
|
||||||
|
| Formato | Tamaño típico |
|
||||||
|
|---|---|
|
||||||
|
| PNG | ~8–12 KB |
|
||||||
|
| WebP | ~5–8 KB |
|
||||||
|
| SVG | ~3–6 KB |
|
||||||
|
|
||||||
|
> Los tamaños varían según la complejidad del contenido (los QR con más datos tienen más módulos).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Recomendación por Caso de Uso
|
||||||
|
|
||||||
|
| Escenario | Formato recomendado |
|
||||||
|
|---|---|
|
||||||
|
| Mostrar en sitio/app | **WebP** |
|
||||||
|
| Enviar por e-mail | **PNG** |
|
||||||
|
| Impresión gráfica / diseño | **SVG** |
|
||||||
|
| Guardar en la nube | **WebP** |
|
||||||
|
| Máxima compatibilidad | **PNG** |
|
||||||
|
| Sin preocupación por tamaño | **PNG** |
|
||||||
186
Content/DevTutoriais/gerando-qrcodes-pela-api.es.md
Normal file
186
Content/DevTutoriais/gerando-qrcodes-pela-api.es.md
Normal file
@ -0,0 +1,186 @@
|
|||||||
|
---
|
||||||
|
title: "Cómo Generar Códigos QR por la API: Todos los Tipos"
|
||||||
|
description: "Guía completa para generar códigos QR vía API REST usando cada tipo disponible: URL, Pix, Wi-Fi, vCard, WhatsApp, SMS, e-mail y texto libre."
|
||||||
|
keywords: "api qr code, generar qr code api, qr code rest api, qrrapido api, tipos qr code"
|
||||||
|
author: "QRRapido"
|
||||||
|
date: 2026-03-08
|
||||||
|
lastmod: 2026-03-08
|
||||||
|
image: ""
|
||||||
|
---
|
||||||
|
|
||||||
|
# Cómo Generar Códigos QR por la API: Todos los Tipos
|
||||||
|
|
||||||
|
La API QRRapido soporta 8 tipos de código QR. Todos usan el mismo endpoint — lo que cambia es el campo `type` y los campos específicos que forman el `content`.
|
||||||
|
|
||||||
|
## Endpoint
|
||||||
|
|
||||||
|
```
|
||||||
|
POST /api/v1/QRManager/generate
|
||||||
|
X-API-Key: tu_clave_aqui
|
||||||
|
Content-Type: application/json
|
||||||
|
```
|
||||||
|
|
||||||
|
## Estructura Base de la Solicitud
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"content": "...",
|
||||||
|
"type": "url",
|
||||||
|
"size": 400,
|
||||||
|
"primaryColor": "#000000",
|
||||||
|
"backgroundColor": "#FFFFFF",
|
||||||
|
"outputFormat": "png"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
| Campo | Tipo | Por defecto | Descripción |
|
||||||
|
|---|---|---|---|
|
||||||
|
| `content` | string | obligatorio | Contenido del QR |
|
||||||
|
| `type` | string | `"url"` | Tipo de QR (ver abajo) |
|
||||||
|
| `size` | int | `300` | Tamaño en píxeles (100–2000) |
|
||||||
|
| `primaryColor` | string | `"#000000"` | Color de los módulos (hex) |
|
||||||
|
| `backgroundColor` | string | `"#FFFFFF"` | Color de fondo (hex) |
|
||||||
|
| `outputFormat` | string | `"png"` | Formato: `png`, `webp`, `svg` |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Tipo `url` — Link / URL
|
||||||
|
|
||||||
|
El más simple: cualquier URL válida.
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"type": "url",
|
||||||
|
"content": "https://tuempresa.com/producto/123"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
> Usa `https://` siempre que sea posible. Los QR con HTTP pueden ser bloqueados por algunos lectores modernos.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Tipo `pix` — Pago Pix
|
||||||
|
|
||||||
|
El `content` debe ser la **clave Pix** del receptor. La generación produce un QR de Pix estático (sin conexión con el Banco Central — consulta el tutorial dedicado sobre Pix).
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"type": "pix",
|
||||||
|
"content": "contacto@tuempresa.com.br"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Claves aceptadas: CPF/CNPJ (solo dígitos), e-mail, teléfono en formato `+5511999999999`, o clave aleatoria (UUID).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Tipo `wifi` — Red Wi-Fi
|
||||||
|
|
||||||
|
El `content` usa el formato estándar `WIFI:`:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"type": "wifi",
|
||||||
|
"content": "WIFI:S:NombreDeRed;T:WPA;P:ContraseñaDeRed;;"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
| Parámetro | Significado | Valores |
|
||||||
|
|---|---|---|
|
||||||
|
| `S:` | SSID (nombre de la red) | texto |
|
||||||
|
| `T:` | Tipo de seguridad | `WPA`, `WEP`, `nopass` |
|
||||||
|
| `P:` | Contraseña | texto |
|
||||||
|
| `H:` | Red oculta (opcional) | `true` / `false` |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Tipo `vcard` — Tarjeta de Visita
|
||||||
|
|
||||||
|
El `content` debe ser un vCard v3 completo:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"type": "vcard",
|
||||||
|
"content": "BEGIN:VCARD\nVERSION:3.0\nFN:Juan Pérez\nORG:Empresa SRL\nTEL:+5491199999999\nEMAIL:juan@empresa.com\nURL:https://empresa.com\nEND:VCARD"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Tipo `whatsapp` — Link para WhatsApp
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"type": "whatsapp",
|
||||||
|
"content": "https://wa.me/5491199999999?text=¡Hola!%20Quisiera%20más%20información"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
El número debe incluir código de país y área, sin espacios ni símbolos. El parámetro `text` es opcional.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Tipo `email` — E-mail con asunto y cuerpo
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"type": "email",
|
||||||
|
"content": "mailto:contacto@empresa.com?subject=Consulta&body=¡Hola!%20Quisiera%20saber%20más"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Tipo `sms` — SMS pre-cargado
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"type": "sms",
|
||||||
|
"content": "sms:+5491199999999?body=¡Hola!%20Quiero%20más%20información"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Tipo `texto` — Texto Libre
|
||||||
|
|
||||||
|
Cualquier string de hasta 2048 caracteres:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"type": "texto",
|
||||||
|
"content": "Mesa 5 — Atención preferencial disponible en el mostrador central."
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Respuesta Exitosa
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"success": true,
|
||||||
|
"qrCodeBase64": "iVBORw0KGgo...",
|
||||||
|
"qrId": "abc123",
|
||||||
|
"generationTimeMs": 180,
|
||||||
|
"remainingCredits": 42,
|
||||||
|
"fromCache": false,
|
||||||
|
"format": "png",
|
||||||
|
"mimeType": "image/png"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Para mostrar la imagen directamente en HTML:
|
||||||
|
|
||||||
|
```html
|
||||||
|
<img src="data:image/png;base64,{{ qrCodeBase64 }}" alt="Código QR" />
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Consejos Generales
|
||||||
|
|
||||||
|
- **Colores**: mantén alto contraste entre `primaryColor` y `backgroundColor`. Evita amarillo sobre blanco o gris claro sobre blanco.
|
||||||
|
- **Tamaño mínimo impreso**: usa `size` ≥ 400 para impresiones. Para uso digital, 300 es suficiente.
|
||||||
|
- **Caché**: solicitudes idénticas devuelven `fromCache: true` sin consumir crédito adicional.
|
||||||
|
- **Rate limit**: los headers `X-RateLimit-Remaining` y `X-Quota-Remaining` en la respuesta indican tu saldo actual.
|
||||||
142
Content/DevTutoriais/qr-code-pix-estatico.es.md
Normal file
142
Content/DevTutoriais/qr-code-pix-estatico.es.md
Normal file
@ -0,0 +1,142 @@
|
|||||||
|
---
|
||||||
|
title: "Código QR Pix Estático: Cómo Funciona y Responsabilidades del Desarrollador"
|
||||||
|
description: "Entiende qué es el QR Pix estático, cómo lo genera la API, sus limitaciones y por qué la verificación del pago es responsabilidad de tu aplicación — no de QRRapido."
|
||||||
|
keywords: "qr code pix, pix estatico, qr code pix api, integración pix qr code, pix sin bacen"
|
||||||
|
author: "QRRapido"
|
||||||
|
date: 2026-03-08
|
||||||
|
lastmod: 2026-03-08
|
||||||
|
image: ""
|
||||||
|
---
|
||||||
|
|
||||||
|
# Código QR Pix Estático: Cómo Funciona y Responsabilidades del Desarrollador
|
||||||
|
|
||||||
|
## ¿Qué es un Código QR Pix Estático?
|
||||||
|
|
||||||
|
El Pix tiene dos tipos de QR: **estático** y **dinámico**.
|
||||||
|
|
||||||
|
| | Pix Estático | Pix Dinámico |
|
||||||
|
|---|---|---|
|
||||||
|
| Valor | Variable (lo decide el pagador) | Fijo (definido por el receptor) |
|
||||||
|
| Generación | Cualquier sistema | Intermediario PSP/BACEN |
|
||||||
|
| Registro en BACEN | **No** | Sí |
|
||||||
|
| Notificación de pago | **No** | Sí (webhook) |
|
||||||
|
| Uso típico | Donaciones, cobros simples | E-commerce, cobro con control |
|
||||||
|
|
||||||
|
La API QRRapido genera **exclusivamente QR Pix estático**. Eso es intencional y suficiente para la mayoría de los casos de uso.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Cómo la API Genera el QR Pix
|
||||||
|
|
||||||
|
Al enviar una solicitud con `type: "pix"`, la API arma un string en el estándar **EMV® QR Code** (estándar internacional adoptado por el Banco Central de Brasil) y genera la imagen:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"type": "pix",
|
||||||
|
"content": "contacto@tuempresa.com.br"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
El campo `content` debe contener **solo la clave Pix** del receptor. La API se encarga de armar el payload EMV correctamente.
|
||||||
|
|
||||||
|
**Claves aceptadas:**
|
||||||
|
- E-mail: `contacto@empresa.com.br`
|
||||||
|
- CPF/CNPJ: solo dígitos — `12345678901` o `12345678000195`
|
||||||
|
- Teléfono: `+5511999999999`
|
||||||
|
- Clave aleatoria (EVP): `123e4567-e89b-12d3-a456-426614174000`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Lo que la API NO hace (y por qué eso importa)
|
||||||
|
|
||||||
|
> **QRRapido no tiene integración con el Banco Central, con ningún banco ni PSP (Proveedor de Servicio de Pago).**
|
||||||
|
|
||||||
|
Eso significa:
|
||||||
|
|
||||||
|
1. **La API no sabe si el pago fue realizado.** Solo genera la imagen del QR. Lo que pasa después — si el cliente escaneó, si el Pix fue enviado, si llegó a la cuenta correcta — está fuera del alcance de la API.
|
||||||
|
|
||||||
|
2. **No hay webhook de confirmación de pago.** La API no envía notificaciones cuando se recibe un Pix.
|
||||||
|
|
||||||
|
3. **El QR no expira automáticamente.** Un QR Pix estático es válido indefinidamente (o hasta que la clave Pix sea eliminada por el receptor en su banco).
|
||||||
|
|
||||||
|
4. **No hay rastreabilidad de transacción.** Dos solicitudes con la misma clave generan el mismo QR (con caché). No es posible asociar un escaneo a una transacción específica vía API.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Responsabilidad de Tu Aplicación
|
||||||
|
|
||||||
|
Si usas la API para generar QR Pix en un flujo de pago, **es responsabilidad de tu aplicación verificar el cobro**. Las formas correctas de hacerlo son:
|
||||||
|
|
||||||
|
### Opción 1 — API Pix del Banco del Receptor
|
||||||
|
Conéctate directamente a la API Pix del banco donde está registrada la clave. La mayoría de los bancos ofrece:
|
||||||
|
- Consulta de cobros recibidos
|
||||||
|
- Webhook de notificación en tiempo real (cuando el banco lo soporta)
|
||||||
|
|
||||||
|
### Opción 2 — PSP / Gateway de Pago
|
||||||
|
Usa un intermediario como Mercado Pago, PagSeguro, Efí Bank, Asaas, etc. Ofrecen Pix dinámico con control completo: valor fijo, expiración, webhooks e identificación única por cobro.
|
||||||
|
|
||||||
|
### Opción 3 — Verificación Manual
|
||||||
|
Para volúmenes bajos o contextos informales (donaciones, ventas presenciales), el responsable del cobro verifica el extracto bancario manualmente.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Flujo Recomendado (con confirmación)
|
||||||
|
|
||||||
|
```
|
||||||
|
Tu App API QRRapido Banco del Receptor
|
||||||
|
| | |
|
||||||
|
|-- POST /generate (pix) -->| |
|
||||||
|
|<-- qrCodeBase64 ----------| |
|
||||||
|
| | |
|
||||||
|
|-- Muestra QR al cliente | |
|
||||||
|
| | |
|
||||||
|
|-- Consulta pago ---------------------------------->|
|
||||||
|
|<-- Estado recibido o no ----------------------------|
|
||||||
|
| | |
|
||||||
|
|-- Libera producto/servicio| |
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Ejemplo de Solicitud Completa
|
||||||
|
|
||||||
|
```bash
|
||||||
|
curl -X POST https://qrrapido.site/api/v1/QRManager/generate \
|
||||||
|
-H "X-API-Key: tu_clave_aqui" \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-d '{
|
||||||
|
"content": "contacto@tuempresa.com.br",
|
||||||
|
"type": "pix",
|
||||||
|
"size": 400,
|
||||||
|
"outputFormat": "webp"
|
||||||
|
}'
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Casos de Uso Adecuados para Pix Estático vía API
|
||||||
|
|
||||||
|
- QR de donación en sitio institucional
|
||||||
|
- Menú digital con clave para pago presencial
|
||||||
|
- Generación de QR en lote para materiales impresos (flyers, tarjetas)
|
||||||
|
- Aplicaciones donde el vendedor y comprador interactúan presencialmente y el vendedor confirma el cobro en la app del banco
|
||||||
|
|
||||||
|
## Casos de Uso que Requieren Pix Dinámico (no cubiertos por esta API)
|
||||||
|
|
||||||
|
- E-commerce con confirmación automática del pedido
|
||||||
|
- Cobro con valor fijo y expiración
|
||||||
|
- Emisión de factura vinculada al pago
|
||||||
|
- Conciliación financiera automatizada
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Resumen
|
||||||
|
|
||||||
|
| Lo que la API hace | Lo que la API NO hace |
|
||||||
|
|---|---|
|
||||||
|
| Genera la imagen del QR Pix | Verifica si el pago fue hecho |
|
||||||
|
| Formatea el payload EMV correctamente | Envía webhook de confirmación |
|
||||||
|
| Entrega PNG, WebP o SVG | Se comunica con el BACEN o bancos |
|
||||||
|
| Funciona con cualquier clave Pix válida | Garantiza que la clave pertenece a quien dice |
|
||||||
|
|
||||||
|
La generación correcta del QR es responsabilidad de la API. La **confirmación del pago es responsabilidad de tu aplicación** — y eso queda claro desde el principio.
|
||||||
108
Content/Tutoriais/como-crear-codigo-qr-whatsapp.es.md
Normal file
108
Content/Tutoriais/como-crear-codigo-qr-whatsapp.es.md
Normal file
@ -0,0 +1,108 @@
|
|||||||
|
---
|
||||||
|
title: "Cómo Crear Código QR para WhatsApp"
|
||||||
|
description: "Aprende a crear un código QR para WhatsApp que permite a los usuarios iniciar una conversación contigo instantáneamente"
|
||||||
|
keywords: "codigo qr whatsapp, whatsapp codigo qr, qr para whatsapp, crear qr whatsapp"
|
||||||
|
author: "QR Rapido"
|
||||||
|
date: 2025-10-08
|
||||||
|
lastmod: 2025-10-08
|
||||||
|
image: "/images/tutoriais/whatsapp-qr-hero.jpg"
|
||||||
|
---
|
||||||
|
|
||||||
|
# Cómo Crear Código QR para WhatsApp
|
||||||
|
|
||||||
|
Crear un **código QR para WhatsApp** es una de las formas más eficientes de facilitar el contacto directo con tus clientes, amigos o seguidores. Con un simple escaneo, cualquier persona puede iniciar una conversación contigo instantáneamente, sin necesidad de guardar tu número.
|
||||||
|
|
||||||
|
## 📱 ¿Por qué usar código QR para WhatsApp?
|
||||||
|
|
||||||
|
Los códigos QR para WhatsApp son extremadamente útiles para:
|
||||||
|
|
||||||
|
- **Empresas**: Facilitar la atención al cliente
|
||||||
|
- **Freelancers**: Agilizar el contacto con potenciales clientes
|
||||||
|
- **Eventos**: Permitir networking rápido
|
||||||
|
- **Marketing**: Aumentar la conversión en campañas
|
||||||
|
|
||||||
|
## 🎯 Paso a Paso
|
||||||
|
|
||||||
|
### 1. Prepara tu número
|
||||||
|
|
||||||
|
Primero, necesitas tener tu número en formato internacional:
|
||||||
|
|
||||||
|
```
|
||||||
|
+1 555 123-4567
|
||||||
|
```
|
||||||
|
|
||||||
|
Elimina todos los espacios y guiones, quedando:
|
||||||
|
|
||||||
|
```
|
||||||
|
15551234567
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Crea la URL de WhatsApp
|
||||||
|
|
||||||
|
La URL de WhatsApp sigue este patrón:
|
||||||
|
|
||||||
|
```
|
||||||
|
https://wa.me/15551234567
|
||||||
|
```
|
||||||
|
|
||||||
|
Puedes agregar un mensaje predefinido:
|
||||||
|
|
||||||
|
```
|
||||||
|
https://wa.me/15551234567?text=¡Hola!%20Quisiera%20más%20información
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. Genera el código QR
|
||||||
|
|
||||||
|
Accede a [QR Rapido](https://qrrapido.site) y:
|
||||||
|
|
||||||
|
1. Selecciona el tipo **URL**
|
||||||
|
2. Pega la URL de WhatsApp
|
||||||
|
3. Personaliza los colores (opcional)
|
||||||
|
4. Haz clic en **Generar Código QR**
|
||||||
|
5. Descarga en alta calidad
|
||||||
|
|
||||||
|
## 💡 Consejos Profesionales
|
||||||
|
|
||||||
|
### Personaliza el Mensaje Inicial
|
||||||
|
|
||||||
|
Configura un mensaje de bienvenida automático para mejorar la experiencia:
|
||||||
|
|
||||||
|
```
|
||||||
|
https://wa.me/15551234567?text=¡Hola!%20Vine%20a%20través%20de%20tu%20código%20QR
|
||||||
|
```
|
||||||
|
|
||||||
|
### Úsalo en Materiales Impresos
|
||||||
|
|
||||||
|
- **Tarjetas de visita**: Facilita el contacto instantáneo
|
||||||
|
- **Folletos**: Aumenta el engagement
|
||||||
|
- **Embalajes**: Ofrece soporte directo al cliente
|
||||||
|
- **Banners**: En eventos y ferias
|
||||||
|
|
||||||
|
### Monitorea los Resultados
|
||||||
|
|
||||||
|
Para rastrear cuántas personas escanearon tu código QR, considera usar un acortador de URL con analytics antes de generar el QR.
|
||||||
|
|
||||||
|
## ⚠️ Cuidados Importantes
|
||||||
|
|
||||||
|
1. **Prueba antes de imprimir**: Siempre escanea para verificar que funciona
|
||||||
|
2. **Tamaño mínimo**: Mantén al menos 3x3 cm para fácil lectura
|
||||||
|
3. **Contraste adecuado**: Usa colores que contrasten bien (negro sobre blanco es ideal)
|
||||||
|
4. **Mensaje claro**: Indica para qué sirve el código QR
|
||||||
|
|
||||||
|
## 🚀 Ventajas de usar QR Rapido
|
||||||
|
|
||||||
|
- ⚡ **Ultra rápido**: Genera en menos de 1 segundo
|
||||||
|
- 🎨 **Personalizable**: Elige colores y estilos
|
||||||
|
- 📥 **Alta calidad**: Descarga en PNG, SVG y PDF
|
||||||
|
- 🔒 **Seguro**: Tus datos no son almacenados
|
||||||
|
- 💯 **Gratis**: 10 códigos QR por día
|
||||||
|
|
||||||
|
## Conclusión
|
||||||
|
|
||||||
|
Crear un código QR para WhatsApp es simple y puede revolucionar la forma en que te comunicas con tu público. Con QR Rapido, tienes todo lo que necesitas para crear códigos QR profesionales en segundos.
|
||||||
|
|
||||||
|
**¿Listo para empezar?** [Crea tu código QR ahora →](https://qrrapido.site/es)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
*¿Tienes dudas? [Contáctanos](https://qrrapido.site/es/Contact)!*
|
||||||
271
Content/Tutoriais/como-crear-codigo-qr-wifi.es.md
Normal file
271
Content/Tutoriais/como-crear-codigo-qr-wifi.es.md
Normal file
@ -0,0 +1,271 @@
|
|||||||
|
---
|
||||||
|
title: "Cómo Crear Código QR WiFi Gratis: Comparte tu Red en Segundos"
|
||||||
|
description: "Aprende a crear código QR WiFi gratuito en pocos clics. Comparte la contraseña de tu red sin escribir con nuestro generador rápido y seguro."
|
||||||
|
keywords: "codigo qr wifi, crear codigo qr wifi, generador qr wifi gratis, qr wifi, compartir contraseña wifi, codigo qr red wifi, como hacer qr wifi"
|
||||||
|
author: "QR Rapido"
|
||||||
|
date: 2025-10-10
|
||||||
|
lastmod: 2025-10-10
|
||||||
|
image: "/images/tutoriais/qr-code-wifi-hero.jpg"
|
||||||
|
---
|
||||||
|
|
||||||
|
# Cómo Crear Código QR WiFi Gratis: Comparte tu Red en Segundos
|
||||||
|
|
||||||
|
¿Cansado de escribir contraseñas largas y complicadas cada vez que un visitante pide el WiFi? Con un **Código QR WiFi**, puedes compartir tu red instantáneamente. En este tutorial completo, aprenderás a crear un código QR para WiFi gratuitamente en menos de 2 minutos.
|
||||||
|
|
||||||
|
## ¿Por Qué Usar Código QR para WiFi?
|
||||||
|
|
||||||
|
Compartir tu red WiFi mediante código QR ofrece varias ventajas:
|
||||||
|
|
||||||
|
- **Practicidad**: Los visitantes se conectan instantáneamente sin escribir contraseñas
|
||||||
|
- **Seguridad**: No necesitas decir la contraseña en voz alta o anotarla
|
||||||
|
- **Profesionalismo**: Ideal para empresas, cafeterías, restaurantes y consultorios
|
||||||
|
- **Ahorro de tiempo**: Elimina errores de escritura y pedidos repetidos
|
||||||
|
- **Compatibilidad**: Funciona en prácticamente todos los smartphones modernos
|
||||||
|
|
||||||
|
## Paso a Paso: Cómo Crear tu Código QR WiFi
|
||||||
|
|
||||||
|
### Paso 1: Selecciona el Tipo de Código QR
|
||||||
|
|
||||||
|
Accede al generador y elige la opción **WiFi** en la lista de tipos de códigos QR disponibles.
|
||||||
|
|
||||||
|
**[INSERTAR IMAGEN 1 AQUÍ: Pantalla de selección de tipo de código QR con WiFi destacado]**
|
||||||
|
|
||||||
|
En el menú desplegable encontrarás varias opciones como URL/Link, Texto Simple, Tarjeta de Visita, SMS y Email. Para este tutorial, selecciona **WiFi**.
|
||||||
|
|
||||||
|
### Paso 2: Completa los Datos de tu Red WiFi
|
||||||
|
|
||||||
|
Ahora necesitas informar los datos de tu red. Ve los campos obligatorios:
|
||||||
|
|
||||||
|
**[INSERTAR IMAGEN 3 AQUÍ: Formulario de creación de código QR WiFi con campos completados]**
|
||||||
|
|
||||||
|
#### NetworkName (Nombre de la Red) *
|
||||||
|
Escribe exactamente el nombre de tu red WiFi (SSID). Por ejemplo: "NombreDeTuRed"
|
||||||
|
|
||||||
|
**Consejo importante**: El nombre debe ser idéntico al que aparece cuando buscas redes WiFi en el celular. ¡Respeta mayúsculas y minúsculas!
|
||||||
|
|
||||||
|
#### SecurityType (Tipo de Seguridad)
|
||||||
|
Selecciona el tipo de encriptación de tu red:
|
||||||
|
|
||||||
|
- **Red WPA (la más común)**: WPA/WPA2/WPA3 - recomendado y más seguro
|
||||||
|
- **WEP (muy antiguo)**: No recomendado por ser inseguro
|
||||||
|
- **Sin contraseña**: Para redes públicas sin protección
|
||||||
|
|
||||||
|
**[INSERTAR IMAGEN 4 AQUÍ: Ejemplo de formulario WiFi completado con "Rede-do-meu-comercio"]**
|
||||||
|
|
||||||
|
#### NetworkPassword (Contraseña de la Red) *
|
||||||
|
Introduce la contraseña de tu red WiFi. Usa el ícono de ojo para visualizar y verificar que escribiste correctamente.
|
||||||
|
|
||||||
|
**Importante**: La contraseña también distingue mayúsculas de minúsculas. ¡Verifica con atención!
|
||||||
|
|
||||||
|
#### HiddenNetwork (Red Oculta)
|
||||||
|
Marca esta opción solo si tu red está configurada como oculta (no aparece en la lista de redes disponibles).
|
||||||
|
|
||||||
|
### Paso 3: Personaliza tu Código QR (Opcional)
|
||||||
|
|
||||||
|
¡Dale a tu código QR la identidad de tu negocio!
|
||||||
|
|
||||||
|
**[INSERTAR IMAGEN 2 AQUÍ: Panel de personalización avanzada]**
|
||||||
|
|
||||||
|
#### Opciones de Personalización:
|
||||||
|
|
||||||
|
**Color Principal**: Elige el color de los cuadrados del código QR (predeterminado: azul)
|
||||||
|
|
||||||
|
**Color de Fondo**: Define el color de fondo (predeterminado: blanco)
|
||||||
|
|
||||||
|
**Tamaño**: Selecciona entre:
|
||||||
|
- Pequeño (200px) - Para uso digital
|
||||||
|
- Mediano (300px) - Recomendado para impresión
|
||||||
|
- Grande (500px) - Para banners y pósters
|
||||||
|
|
||||||
|
**Margen**:
|
||||||
|
- Compacto - Ocupa menos espacio
|
||||||
|
- Normal - Recomendado (mejor lectura)
|
||||||
|
- Amplio - Para impresiones grandes
|
||||||
|
|
||||||
|
**Consejo de diseño**: Mantén buen contraste entre el color principal y el fondo para garantizar que todos los celulares puedan leer el código.
|
||||||
|
|
||||||
|
### Paso 4: Generar y Descargar
|
||||||
|
|
||||||
|
Haz clic en el botón azul **"⚡ Generar Código QR Rápidamente"** y ¡listo! Tu código QR WiFi será generado instantáneamente.
|
||||||
|
|
||||||
|
Puedes:
|
||||||
|
- Descargar la imagen en alta calidad
|
||||||
|
- Imprimir y colocar en lugares visibles
|
||||||
|
- Compartir digitalmente
|
||||||
|
- Guardar para usar después
|
||||||
|
|
||||||
|
## Cómo tus Visitantes Usarán el Código QR WiFi
|
||||||
|
|
||||||
|
¡Es muy simple! Tus visitantes solo necesitan:
|
||||||
|
|
||||||
|
1. Abrir la cámara del celular (iOS o Android)
|
||||||
|
2. Apuntar al código QR
|
||||||
|
3. Tocar la notificación que aparece
|
||||||
|
4. Conectarse automáticamente al WiFi
|
||||||
|
|
||||||
|
**¡No necesitas descargar aplicaciones!** La mayoría de los smartphones desde 2018 ya tienen lectores de códigos QR integrados en la cámara.
|
||||||
|
|
||||||
|
## Dónde Usar tu Código QR WiFi
|
||||||
|
|
||||||
|
### Para Empresas
|
||||||
|
- Recepción de oficinas
|
||||||
|
- Salas de reuniones
|
||||||
|
- Áreas de espera
|
||||||
|
- Espacios de coworking
|
||||||
|
|
||||||
|
### Para Comercios
|
||||||
|
- Mesas de restaurantes
|
||||||
|
- Mostradores de cafeterías
|
||||||
|
- Tiendas y boutiques
|
||||||
|
- Salones de belleza
|
||||||
|
|
||||||
|
### Para Residencias
|
||||||
|
- Cuadro de entrada
|
||||||
|
- Área de parrilla
|
||||||
|
- Heladera (para fiestas)
|
||||||
|
- Home office
|
||||||
|
|
||||||
|
### Para Eventos
|
||||||
|
- Credenciales de eventos
|
||||||
|
- Stands de ferias
|
||||||
|
- Conferencias
|
||||||
|
- Bodas y fiestas
|
||||||
|
|
||||||
|
## Consejos de Seguridad
|
||||||
|
|
||||||
|
⚠️ **Importante**: Considera crear una red WiFi separada para visitantes (red guest) si deseas:
|
||||||
|
|
||||||
|
- Proteger tus dispositivos personales
|
||||||
|
- Limitar velocidad para invitados
|
||||||
|
- Tener control sobre quién accede
|
||||||
|
- Mantener tu red principal privada
|
||||||
|
|
||||||
|
Muchos routers modernos permiten crear redes guest fácilmente en las configuraciones.
|
||||||
|
|
||||||
|
## Preguntas Frecuentes (FAQ)
|
||||||
|
|
||||||
|
### ¿El Código QR WiFi expira?
|
||||||
|
¡No! El código QR funciona indefinidamente mientras los datos de la red (nombre y contraseña) permanezcan iguales.
|
||||||
|
|
||||||
|
### ¿Funciona en iPhone y Android?
|
||||||
|
¡Sí! Funciona en prácticamente todos los smartphones fabricados después de 2018 que tienen cámara.
|
||||||
|
|
||||||
|
### ¿Puedo crear para red 5GHz?
|
||||||
|
¡Sí! El proceso es exactamente el mismo. Solo usa el nombre correcto de la red 5GHz.
|
||||||
|
|
||||||
|
### ¿Es seguro?
|
||||||
|
¡Sí! El código QR solo facilita la escritura de los datos. Es tan seguro como informar la contraseña verbalmente o por escrito.
|
||||||
|
|
||||||
|
### ¿Puedo editar después de creado?
|
||||||
|
No es posible editar el código QR después de generado. Si cambias la contraseña del WiFi, necesitarás generar un nuevo código QR.
|
||||||
|
|
||||||
|
### ¿Cuántas personas pueden usar el mismo código QR?
|
||||||
|
¡Ilimitadas! No hay límite de usos para el código QR.
|
||||||
|
|
||||||
|
## Casos de Uso Reales
|
||||||
|
|
||||||
|
### Restaurantes y Cafeterías
|
||||||
|
Muchos negocios gastronómicos están adoptando códigos QR WiFi. Los clientes aprecian poder conectarse sin interrumpir al personal. Coloca el código QR en:
|
||||||
|
- Carteles en las mesas
|
||||||
|
- Menús impresos
|
||||||
|
- Pared cerca de la caja
|
||||||
|
|
||||||
|
### Consultorios Médicos
|
||||||
|
Los pacientes en la sala de espera pueden conectarse fácilmente mientras aguardan. Esto mejora la experiencia y reduce el estrés de la espera.
|
||||||
|
|
||||||
|
### Oficinas y Coworking
|
||||||
|
Facilita el acceso de clientes, proveedores y visitantes sin comprometer la seguridad de tu red principal. Ideal para espacios colaborativos.
|
||||||
|
|
||||||
|
### Hoteles y Hospedajes
|
||||||
|
Proporciona códigos QR en las habitaciones para que los huéspedes se conecten inmediatamente al llegar.
|
||||||
|
|
||||||
|
## Errores Comunes a Evitar
|
||||||
|
|
||||||
|
### ❌ Error 1: Nombre de Red Incorrecto
|
||||||
|
Verifica que escribiste exactamente el SSID de tu red. Un error común es confundir la red 2.4GHz con la 5GHz.
|
||||||
|
|
||||||
|
### ❌ Error 2: Contraseña con Espacios
|
||||||
|
Si tu contraseña tiene espacios, inclúyelos exactamente como están configurados en el router.
|
||||||
|
|
||||||
|
### ❌ Error 3: Tipo de Seguridad Incorrecto
|
||||||
|
Asegúrate de seleccionar el tipo correcto (WPA, WEP o sin contraseña). Si no estás seguro, verifica en la configuración de tu router.
|
||||||
|
|
||||||
|
### ❌ Error 4: QR Code Muy Pequeño
|
||||||
|
Para impresión, usa tamaño mediano (300px) o grande (500px). Los códigos pequeños pueden ser difíciles de escanear.
|
||||||
|
|
||||||
|
### ❌ Error 5: Bajo Contraste
|
||||||
|
Evita combinaciones de colores como amarillo sobre blanco o gris claro sobre gris. El contraste es esencial para la lectura correcta.
|
||||||
|
|
||||||
|
## Mejores Prácticas para Imprimir
|
||||||
|
|
||||||
|
Si vas a imprimir tu código QR WiFi, sigue estas recomendaciones:
|
||||||
|
|
||||||
|
### Material Recomendado
|
||||||
|
- **Papel fotográfico**: Para mejor calidad y durabilidad
|
||||||
|
- **Laminado**: Protege contra humedad y suciedad
|
||||||
|
- **Acrílico**: Solución premium para negocios
|
||||||
|
- **Vinilo adhesivo**: Fácil de colocar en paredes y superficies
|
||||||
|
|
||||||
|
### Tamaño de Impresión
|
||||||
|
- **Mínimo**: 5x5 cm para lectura cercana
|
||||||
|
- **Recomendado**: 10x10 cm para lectura a 30-50 cm de distancia
|
||||||
|
- **Grande**: 15x15 cm o más para lectura a mayor distancia
|
||||||
|
|
||||||
|
### Ubicación Estratégica
|
||||||
|
- A la altura de los ojos (1.40m - 1.60m)
|
||||||
|
- Bien iluminado
|
||||||
|
- Sin reflejos o brillos
|
||||||
|
- Fácilmente visible desde donde la gente se sienta o espera
|
||||||
|
|
||||||
|
## Tips para Negocios
|
||||||
|
|
||||||
|
### Agrega un Texto Atractivo
|
||||||
|
No solo coloques el código QR. Agrega texto como:
|
||||||
|
- "WiFi Gratis - Escanea y Conecta"
|
||||||
|
- "Internet Rápido - Solo Escanea"
|
||||||
|
- "Conéctate fácil con un clic"
|
||||||
|
|
||||||
|
### Diseño Personalizado
|
||||||
|
Usa los colores de tu marca en el código QR para mantener la coherencia visual con tu negocio.
|
||||||
|
|
||||||
|
### Múltiples Ubicaciones
|
||||||
|
En locales grandes, coloca varios códigos QR en diferentes puntos para facilitar el acceso.
|
||||||
|
|
||||||
|
### Actualización Periódica
|
||||||
|
Por seguridad, considera cambiar la contraseña WiFi cada 3-6 meses y generar un nuevo código QR.
|
||||||
|
|
||||||
|
## Conclusión
|
||||||
|
|
||||||
|
Crear un código QR WiFi es rápido, fácil y completamente gratuito en QR Rapido. En menos de 2 minutos puedes:
|
||||||
|
|
||||||
|
✅ Generar tu código QR personalizado
|
||||||
|
✅ Compartir tu red sin esfuerzo
|
||||||
|
✅ Proporcionar mejor experiencia a los visitantes
|
||||||
|
✅ Demostrar profesionalismo
|
||||||
|
|
||||||
|
**Prueba ahora mismo**: [Crear mi Código QR WiFi Gratis](/)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**¿Te gustó este tutorial?** ¡Comparte con amigos que también quieren facilitar el acceso a la red WiFi! Explora también nuestros otros tipos de códigos QR para diferentes necesidades.
|
||||||
|
|
||||||
|
## Otros Tutoriales Útiles
|
||||||
|
|
||||||
|
- Cómo crear código QR para WhatsApp
|
||||||
|
- Código QR para Tarjeta de Visita Digital
|
||||||
|
- Cómo crear código QR para URLs y Links
|
||||||
|
- Personalización avanzada de códigos QR
|
||||||
|
|
||||||
|
**¡Crea ahora tu código QR WiFi gratuito y transforma la experiencia de tus visitantes!** 🚀📱
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Soporte Técnico
|
||||||
|
|
||||||
|
¿Tienes problemas para crear tu código QR WiFi? Contáctanos:
|
||||||
|
|
||||||
|
- **Email**: soporte@qrrapido.site
|
||||||
|
- **WhatsApp**: [Agregar número]
|
||||||
|
- **Horario**: Lunes a Viernes, 8:00 - 18:00
|
||||||
|
|
||||||
|
¡Estamos aquí para ayudarte a crear el código QR perfecto para tu negocio o hogar!
|
||||||
598
Content/Tutoriais/qr-code-para-corredores-inmuebles.es.md
Normal file
598
Content/Tutoriais/qr-code-para-corredores-inmuebles.es.md
Normal file
@ -0,0 +1,598 @@
|
|||||||
|
---
|
||||||
|
title: "Código QR para Corredores de Inmuebles: Guía Completa para Etiquetas y Volantes"
|
||||||
|
description: "Descubre cómo usar código QR en etiquetas adhesivas, carteles y volantes inmobiliarios. Aumenta tus ventas con tecnología gratuita y profesional."
|
||||||
|
keywords: "codigo qr corredor inmuebles, etiqueta corredor inmobiliaria, qr inmobiliaria, etiquetas adhesivas corredores, divulgar corredor propiedades, qr cartel se vende"
|
||||||
|
author: "QR Rapido"
|
||||||
|
date: 2025-10-10
|
||||||
|
lastmod: 2025-10-10
|
||||||
|
image: "/images/tutoriais/qr-code-corretor-imoveis-hero.jpg"
|
||||||
|
---
|
||||||
|
|
||||||
|
# Código QR para Corredores de Inmuebles: Guía Completa para Etiquetas y Volantes
|
||||||
|
|
||||||
|
Si eres corredor de inmuebles, sabes que **captar leads calificados** es esencial para cerrar negocios. Imagina transformar tus carteles de "Se Vende", volantes y etiquetas adhesivas en herramientas interactivas que conectan clientes directamente a tu WhatsApp, ficha del inmueble o tarjeta de visita digital - todo esto **gratuitamente** con códigos QR.
|
||||||
|
|
||||||
|
En esta guía completa, aprenderás a crear y aplicar códigos QR profesionales en materiales inmobiliarios, aumentando tus conversiones y destacándote de la competencia.
|
||||||
|
|
||||||
|
## ¿Por Qué los Corredores de Inmuebles Deben Usar Códigos QR?
|
||||||
|
|
||||||
|
### **Ventajas Comprobadas**
|
||||||
|
|
||||||
|
- ✅ **Captación 24/7**: Tu cartel trabaja para ti incluso cuando estás durmiendo
|
||||||
|
- ✅ **Contacto Instantáneo**: Cliente escanea y ya está en tu WhatsApp
|
||||||
|
- ✅ **Cero Escritura**: Elimina errores al anotar números
|
||||||
|
- ✅ **Rastreo**: Sabe cuántas personas se interesaron
|
||||||
|
- ✅ **Profesionalismo**: Demuestra modernidad e innovación
|
||||||
|
- ✅ **Costo Cero**: Genera códigos QR ilimitados gratuitamente
|
||||||
|
- ✅ **Tour Virtual**: Lleva al cliente dentro del inmueble virtualmente
|
||||||
|
|
||||||
|
### **Estadísticas del Mercado**
|
||||||
|
|
||||||
|
Según estudios del sector inmobiliario:
|
||||||
|
- **78%** de los compradores investigan propiedades por celular
|
||||||
|
- **65%** prefieren contacto vía WhatsApp en lugar de llamada
|
||||||
|
- **43%** escanean códigos QR en carteles de inmuebles cuando los ven
|
||||||
|
- Corredores que usan código QR tienen **35% más leads** mensuales
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Dónde Aplicar Códigos QR en Marketing Inmobiliario
|
||||||
|
|
||||||
|
### **1. Carteles de "Se Vende" y "Se Alquila"**
|
||||||
|
|
||||||
|
**¡El uso más poderoso!** El cartel al frente del inmueble es visto por cientos de personas diariamente.
|
||||||
|
|
||||||
|
**Qué colocar en el código QR:**
|
||||||
|
- Link directo a tu WhatsApp
|
||||||
|
- vCard con tus contactos completos
|
||||||
|
- Tour virtual 360° del inmueble
|
||||||
|
- Ficha técnica detallada (PDF)
|
||||||
|
- Video del inmueble en YouTube
|
||||||
|
|
||||||
|
**Consejo profesional**: Coloca texto llamativo como:
|
||||||
|
- "Escanea y agenda tu visita AHORA"
|
||||||
|
- "Tour Virtual - Apunta tu cámara aquí"
|
||||||
|
- "WhatsApp Directo del Corredor"
|
||||||
|
|
||||||
|
### **2. Etiquetas Adhesivas y Tags**
|
||||||
|
|
||||||
|
Etiquetas pequeñas (5x5cm hasta 10x10cm) son perfectas para:
|
||||||
|
|
||||||
|
**Aplicaciones:**
|
||||||
|
- Pegar en autos de la inmobiliaria
|
||||||
|
- Fijar en portones de inmuebles
|
||||||
|
- Aplicar en vitrinas de locales
|
||||||
|
- Distribuir en establecimientos asociados
|
||||||
|
- Colocar en ascensores de edificios
|
||||||
|
|
||||||
|
**Ventajas:**
|
||||||
|
- Bajo costo de impresión
|
||||||
|
- Fácil distribución masiva
|
||||||
|
- Pueden ser cambiadas rápidamente
|
||||||
|
- Óptimas para acciones promocionales
|
||||||
|
|
||||||
|
### **3. Volantes y Flyers**
|
||||||
|
|
||||||
|
¡Transforma volantes de papel en herramientas digitales!
|
||||||
|
|
||||||
|
**Dónde aplicar:**
|
||||||
|
- Esquina superior derecha (lugar de mayor atención)
|
||||||
|
- Centro, si es el foco principal
|
||||||
|
- Reverso, con llamada destacada
|
||||||
|
|
||||||
|
**Contenido recomendado:**
|
||||||
|
- Portafolio digital de inmuebles
|
||||||
|
- Formulario de registro
|
||||||
|
- Calculadora de financiamiento
|
||||||
|
- Lista completa de propiedades disponibles
|
||||||
|
|
||||||
|
### **4. Folders y Revistas Inmobiliarias**
|
||||||
|
|
||||||
|
Materiales impresos premium merecen códigos QR estratégicos.
|
||||||
|
|
||||||
|
**Uso ideal:**
|
||||||
|
- 1 QR por inmueble destacado
|
||||||
|
- QR en la portada para portafolio completo
|
||||||
|
- QR en la contraportada con tus contactos
|
||||||
|
- QR en cada página con más información
|
||||||
|
|
||||||
|
### **5. Tarjetas de Visita**
|
||||||
|
|
||||||
|
¡El clásico nunca pasa de moda, pero puede ser mejorado!
|
||||||
|
|
||||||
|
**Código QR en la tarjeta permite:**
|
||||||
|
- Guardar contacto automáticamente (vCard)
|
||||||
|
- Ver portafolio online
|
||||||
|
- Agendar reunión directo en la agenda
|
||||||
|
- Enviar mensaje vía WhatsApp
|
||||||
|
|
||||||
|
### **6. Firma de Email**
|
||||||
|
|
||||||
|
¡Cada email que envías es una oportunidad!
|
||||||
|
|
||||||
|
**Incluye código QR para:**
|
||||||
|
- Tu vCard completo
|
||||||
|
- Último lanzamiento inmobiliario
|
||||||
|
- Evaluación gratuita de inmueble
|
||||||
|
- Agendamiento de visitas
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Paso a Paso: Cómo Crear Código QR para Corredores
|
||||||
|
|
||||||
|
Voy a mostrar cómo crear **3 tipos de códigos QR** esenciales para corredores:
|
||||||
|
|
||||||
|
### **Tipo 1: Código QR de vCard (Tarjeta de Visita Digital)**
|
||||||
|
|
||||||
|
Perfecto para: Tarjetas de visita, firma de email, credenciales
|
||||||
|
|
||||||
|
**[INSERTAR IMAGEN 1 AQUÍ: Selección del tipo de código QR - vCard destacado]**
|
||||||
|
|
||||||
|
#### Paso 1: Selecciona "Tarjeta de Visita"
|
||||||
|
|
||||||
|
Accede al generador y elige la opción **Tarjeta de Visita** en el menú de tipos.
|
||||||
|
|
||||||
|
#### Paso 2: Completa tus Datos Profesionales
|
||||||
|
|
||||||
|
**Información obligatoria:**
|
||||||
|
- **Nombre completo**: Juan Silva
|
||||||
|
- **Cargo**: Corredor de Inmuebles - Matrícula 12345
|
||||||
|
- **Empresa**: Inmobiliaria Success
|
||||||
|
- **Teléfono**: +1 555 123-4567
|
||||||
|
- **Email**: juan.silva@inmuebles.com
|
||||||
|
- **Website**: www.juansilva.inmuebles.com
|
||||||
|
|
||||||
|
**Campos opcionales estratégicos:**
|
||||||
|
- WhatsApp Business
|
||||||
|
- Instagram profesional
|
||||||
|
- LinkedIn
|
||||||
|
- Canal de YouTube con tours virtuales
|
||||||
|
|
||||||
|
#### Paso 3: Genera y Descarga
|
||||||
|
|
||||||
|
Haz clic en **"Generar Código QR"** y descarga en alta resolución.
|
||||||
|
|
||||||
|
**Dónde usar este QR:**
|
||||||
|
- Etiquetas adhesivas en el auto
|
||||||
|
- Tarjetas de visita
|
||||||
|
- Firma de email
|
||||||
|
- Credencial profesional
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### **Tipo 2: Código QR para WhatsApp Directo**
|
||||||
|
|
||||||
|
Perfecto para: Carteles de inmuebles, volantes, anuncios
|
||||||
|
|
||||||
|
**[INSERTAR IMAGEN 3 AQUÍ: Formulario de WhatsApp con código QR completado]**
|
||||||
|
|
||||||
|
#### Paso 1: Selecciona "WhatsApp"
|
||||||
|
|
||||||
|
En el generador, elige la opción **WhatsApp** (o SMS si prefieres).
|
||||||
|
|
||||||
|
#### Paso 2: Configura el Mensaje Pre-llenado
|
||||||
|
|
||||||
|
**Ejemplo de mensaje eficaz:**
|
||||||
|
|
||||||
|
```
|
||||||
|
¡Hola! Vi el cartel del inmueble en [CALLE/BARRIO] y me gustaría agendar una visita. ¿Puede pasarme más información?
|
||||||
|
```
|
||||||
|
|
||||||
|
**Por qué el mensaje pre-llenado funciona:**
|
||||||
|
- Cliente no necesita pensar qué escribir
|
||||||
|
- Ya sabes de qué inmueble está hablando
|
||||||
|
- Aumenta en 80% la tasa de conversión
|
||||||
|
|
||||||
|
#### Paso 3: Personaliza para Cada Inmueble
|
||||||
|
|
||||||
|
**Consejo importante**: ¡Crea códigos QR diferentes para cada inmueble!
|
||||||
|
|
||||||
|
Ejemplo para apartamento en Recoleta:
|
||||||
|
```
|
||||||
|
¡Hola! Vi el cartel del Departamento 3 dormitorios en Recoleta (Ref: DEPT-001). Me gustaría saber más detalles y agendar visita.
|
||||||
|
```
|
||||||
|
|
||||||
|
**Ventaja**: ¡Ya sabes exactamente qué inmueble quiere ver el cliente!
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### **Tipo 3: Código QR para URL (Tour Virtual / Ficha Técnica)**
|
||||||
|
|
||||||
|
Perfecto para: Inmuebles de alto estándar, lanzamientos, propiedades rurales
|
||||||
|
|
||||||
|
**[INSERTAR IMAGEN 4 AQUÍ: Ejemplo de formulario URL completado]**
|
||||||
|
|
||||||
|
#### Paso 1: Prepara el Contenido Digital
|
||||||
|
|
||||||
|
Antes de crear el QR, necesitas tener:
|
||||||
|
|
||||||
|
**Opción A - Tour Virtual:**
|
||||||
|
- Video en YouTube del inmueble
|
||||||
|
- Tour 360° (Google Street View, Matterport)
|
||||||
|
- Galería de fotos en Instagram/Facebook
|
||||||
|
|
||||||
|
**Opción B - Landing Page:**
|
||||||
|
- Ficha técnica completa del inmueble
|
||||||
|
- Fotos en alta resolución
|
||||||
|
- Mapa de ubicación
|
||||||
|
- Calculadora de financiamiento
|
||||||
|
- Formulario de interés
|
||||||
|
|
||||||
|
#### Paso 2: Acorta la URL (¡Importante!)
|
||||||
|
|
||||||
|
Usa acortadores como:
|
||||||
|
- bit.ly
|
||||||
|
- tinyurl.com
|
||||||
|
- QR Rapido (si tiene función de acortamiento)
|
||||||
|
|
||||||
|
**Ejemplo:**
|
||||||
|
- ❌ URL larga: `https://www.miinmobiliaria.com/inmuebles/departamento-3-dormitorios-recoleta-ref-dept001?utm_source=cartel`
|
||||||
|
- ✅ URL corta: `bit.ly/dept-recoleta-001`
|
||||||
|
|
||||||
|
**Ventaja de URL corta**: Genera código QR más simple y fácil de escanear
|
||||||
|
|
||||||
|
#### Paso 3: Crea el Código QR
|
||||||
|
|
||||||
|
Pega la URL corta en el campo **URL/Link** y genera el código.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Cómo Personalizar tu Código QR Profesionalmente
|
||||||
|
|
||||||
|
**[INSERTAR IMAGEN 2 AQUÍ: Panel de personalización con colores personalizados]**
|
||||||
|
|
||||||
|
### **Elección de Colores Estratégicos**
|
||||||
|
|
||||||
|
**Para Inmobiliarias Tradicionales:**
|
||||||
|
- Azul marino + Blanco (confianza, seriedad)
|
||||||
|
- Negro + Dorado (lujo, exclusividad)
|
||||||
|
- Verde oscuro + Blanco (crecimiento, estabilidad)
|
||||||
|
|
||||||
|
**Para Inmobiliarias Modernas:**
|
||||||
|
- Naranja + Blanco (energía, innovación)
|
||||||
|
- Púrpura + Blanco (creatividad, diferenciación)
|
||||||
|
- Rojo + Blanco (urgencia, acción)
|
||||||
|
|
||||||
|
**Regla de oro**: ¡Siempre mantén alto contraste entre color principal y fondo!
|
||||||
|
|
||||||
|
### **Tamaños Recomendados por Aplicación**
|
||||||
|
|
||||||
|
**Carteles de calle (distancia 2-5 metros):**
|
||||||
|
- Código QR: 15x15cm o mayor
|
||||||
|
- Resolución: 500px mínimo
|
||||||
|
|
||||||
|
**Volantes A5/A4:**
|
||||||
|
- Código QR: 4x4cm a 6x6cm
|
||||||
|
- Resolución: 300px
|
||||||
|
|
||||||
|
**Etiquetas adhesivas:**
|
||||||
|
- Código QR: 5x5cm (tamaño del adhesivo)
|
||||||
|
- Resolución: 300px
|
||||||
|
|
||||||
|
**Tarjetas de visita:**
|
||||||
|
- Código QR: 2,5x2,5cm
|
||||||
|
- Resolución: 200px
|
||||||
|
|
||||||
|
### **Agrega Llamadas a la Acción (CTA)**
|
||||||
|
|
||||||
|
¡Nunca coloques solo el código QR! Agrega texto atractivo:
|
||||||
|
|
||||||
|
**Ejemplos eficaces:**
|
||||||
|
- 📱 "Apunta la cámara y habla conmigo en WhatsApp"
|
||||||
|
- 🏠 "Tour Virtual 360° - Escanea Aquí"
|
||||||
|
- 💬 "Agenda tu Visita Ahora"
|
||||||
|
- 📋 "Ve Fotos y Detalles Completos"
|
||||||
|
- 🎯 "Guarda Mi Contacto Automáticamente"
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Estrategias Avanzadas para Corredores
|
||||||
|
|
||||||
|
### **1. Códigos QR Rastreables (Dinámicos)**
|
||||||
|
|
||||||
|
Usa servicios de código QR dinámico para:
|
||||||
|
|
||||||
|
- Saber cuántas personas escanearon
|
||||||
|
- Ver horario de los escaneos
|
||||||
|
- Identificar ubicación aproximada
|
||||||
|
- Cambiar el destino sin reimprimir
|
||||||
|
|
||||||
|
**Cuándo usar:**
|
||||||
|
- Campañas con muchos materiales impresos
|
||||||
|
- Pruebas A/B de diferentes enfoques
|
||||||
|
- Carteles permanentes en inmuebles
|
||||||
|
|
||||||
|
### **2. Múltiples Códigos QR en el Mismo Cartel**
|
||||||
|
|
||||||
|
¿Cartel grande? ¡Usa 2-3 códigos QR diferentes!
|
||||||
|
|
||||||
|
**Ejemplo de cartel completo:**
|
||||||
|
- **QR 1** (arriba): "Habla en WhatsApp"
|
||||||
|
- **QR 2** (centro): "Tour Virtual 360°"
|
||||||
|
- **QR 3** (abajo): "Guarda Mi Contacto"
|
||||||
|
|
||||||
|
**Ventaja**: Cliente elige la acción que prefiere hacer
|
||||||
|
|
||||||
|
### **3. Código QR + Realidad Aumentada**
|
||||||
|
|
||||||
|
Para lanzamientos y emprendimientos:
|
||||||
|
|
||||||
|
- Código QR lleva a app de RA
|
||||||
|
- Cliente apunta celular y ve el edificio terminado
|
||||||
|
- Visualiza departamento decorado
|
||||||
|
- ¡Extremadamente impactante!
|
||||||
|
|
||||||
|
### **4. Campañas de Temporada**
|
||||||
|
|
||||||
|
Crea códigos QR específicos para:
|
||||||
|
|
||||||
|
- **Enero**: "Planifica este año - Compra tu inmueble"
|
||||||
|
- **Junio**: "Vacaciones en tu Nuevo Hogar"
|
||||||
|
- **Noviembre**: "Black Friday Inmobiliaria"
|
||||||
|
- **Diciembre**: "Empieza el Año en Casa Propia"
|
||||||
|
|
||||||
|
### **5. Alianzas Estratégicas**
|
||||||
|
|
||||||
|
Distribuye etiquetas con código QR en:
|
||||||
|
|
||||||
|
- Tiendas de materiales de construcción
|
||||||
|
- Oficinas de arquitectura
|
||||||
|
- Gestorías y escribanías
|
||||||
|
- Gimnasios y restaurantes del barrio
|
||||||
|
- Edificios comerciales (tablero de avisos)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Modelos de Etiquetas Adhesivas Profesionales
|
||||||
|
|
||||||
|
### **Modelo 1: Etiqueta Minimalista (5x5cm)**
|
||||||
|
|
||||||
|
```
|
||||||
|
┌─────────────────┐
|
||||||
|
│ [CÓDIGO QR] │
|
||||||
|
│ │
|
||||||
|
│ Juan Silva │
|
||||||
|
│ Matrícula 12345 │
|
||||||
|
│ (555) 123-4567 │
|
||||||
|
└─────────────────┘
|
||||||
|
```
|
||||||
|
|
||||||
|
### **Modelo 2: Etiqueta con Destaque (7x7cm)**
|
||||||
|
|
||||||
|
```
|
||||||
|
┌─────────────────────┐
|
||||||
|
│ VENDE TU INMUEBLE │
|
||||||
|
│ SIN BUROCRACIA │
|
||||||
|
│ │
|
||||||
|
│ [CÓDIGO QR] │
|
||||||
|
│ │
|
||||||
|
│ "Escanea y habla │
|
||||||
|
│ directo conmigo" │
|
||||||
|
│ │
|
||||||
|
│ Juan Silva │
|
||||||
|
│ Corredor Mat. XXXX │
|
||||||
|
└─────────────────────┘
|
||||||
|
```
|
||||||
|
|
||||||
|
### **Modelo 3: Etiqueta Tour Virtual (10x10cm)**
|
||||||
|
|
||||||
|
```
|
||||||
|
┌───────────────────────────┐
|
||||||
|
│ TOUR VIRTUAL 360° │
|
||||||
|
│ Visita este inmueble │
|
||||||
|
│ ¡sin salir del sofá! │
|
||||||
|
│ │
|
||||||
|
│ [CÓDIGO QR GRANDE] │
|
||||||
|
│ │
|
||||||
|
│ 📱 Apunta tu cámara │
|
||||||
|
│ │
|
||||||
|
│ Inmobiliaria Success │
|
||||||
|
│ (555) 123-4567 │
|
||||||
|
└───────────────────────────┘
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Mejores Prácticas de Impresión
|
||||||
|
|
||||||
|
### **Materiales Recomendados**
|
||||||
|
|
||||||
|
**Para carteles externos:**
|
||||||
|
- **Vinilo adhesivo resistente a UV**
|
||||||
|
- **Lona con impresión UV**
|
||||||
|
- **ACM (Aluminio Compuesto)**
|
||||||
|
|
||||||
|
Duración: 2-3 años expuestos al sol
|
||||||
|
|
||||||
|
**Para etiquetas adhesivas:**
|
||||||
|
- **Papel BOPP (Polipropileno)**
|
||||||
|
- **Vinilo blanco brillante**
|
||||||
|
- **Papel couché con laminación**
|
||||||
|
|
||||||
|
Duración: 6-12 meses
|
||||||
|
|
||||||
|
**Para volantes:**
|
||||||
|
- **Couché 115g o 150g**
|
||||||
|
- **Barniz localizado en el código QR** (destaque)
|
||||||
|
|
||||||
|
### **Pruebas Antes de Imprimir en Masa**
|
||||||
|
|
||||||
|
⚠️ **SIEMPRE haz esto:**
|
||||||
|
|
||||||
|
1. Imprime 1 muestra en tamaño real
|
||||||
|
2. Prueba con 5 celulares diferentes
|
||||||
|
3. Prueba a diferentes distancias
|
||||||
|
4. Prueba con poca luz
|
||||||
|
5. Solo entonces imprime grandes cantidades
|
||||||
|
|
||||||
|
**Celulares para probar:**
|
||||||
|
- iPhone (iOS actualizado)
|
||||||
|
- Samsung (Android)
|
||||||
|
- Xiaomi o Motorola (Android popular)
|
||||||
|
|
||||||
|
### **Dónde Imprimir**
|
||||||
|
|
||||||
|
**Imprentas rápidas locales:**
|
||||||
|
- Etiquetas adhesivas: consulta precios en tu zona
|
||||||
|
- Volantes A5: consulta precios en tu zona
|
||||||
|
|
||||||
|
**Online (más económico):**
|
||||||
|
- Marketplaces locales
|
||||||
|
- Imprentas con pedido online
|
||||||
|
|
||||||
|
**Consejo**: ¡Pide presupuesto en 3 lugares diferentes!
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Errores Comunes que Corredores Deben Evitar
|
||||||
|
|
||||||
|
### ❌ **Error 1: Código QR Muy Pequeño**
|
||||||
|
|
||||||
|
**Problema**: En carteles de calle vistos de lejos, QR pequeño no funciona
|
||||||
|
|
||||||
|
**Solución**: Mínimo 15x15cm para carteles externos
|
||||||
|
|
||||||
|
### ❌ **Error 2: Colores con Bajo Contraste**
|
||||||
|
|
||||||
|
**Problema**: QR amarillo en fondo blanco no escanea
|
||||||
|
|
||||||
|
**Solución**: Usa siempre colores oscuros en fondo claro (o viceversa)
|
||||||
|
|
||||||
|
### ❌ **Error 3: No Probar Antes de Imprimir**
|
||||||
|
|
||||||
|
**Problema**: Imprime 1000 volantes y descubre que QR no funciona
|
||||||
|
|
||||||
|
**Solución**: Siempre prueba impresión piloto
|
||||||
|
|
||||||
|
### ❌ **Error 4: URL Rota o Temporal**
|
||||||
|
|
||||||
|
**Problema**: Link del inmueble expira, QR queda inútil
|
||||||
|
|
||||||
|
**Solución**: Usa URLs permanentes o QR dinámico editable
|
||||||
|
|
||||||
|
### ❌ **Error 5: Sin Instrucción de Uso**
|
||||||
|
|
||||||
|
**Problema**: Persona mayor no sabe qué hacer con el QR
|
||||||
|
|
||||||
|
**Solución**: Agrega "Apunta la cámara del celular aquí"
|
||||||
|
|
||||||
|
### ❌ **Error 6: Código QR Único para Todos los Inmuebles**
|
||||||
|
|
||||||
|
**Problema**: No sabes qué inmueble generó el lead
|
||||||
|
|
||||||
|
**Solución**: Crea QR específico para cada propiedad
|
||||||
|
|
||||||
|
### ❌ **Error 7: Material de Baja Calidad**
|
||||||
|
|
||||||
|
**Problema**: Etiqueta se desvanece en 1 mes al sol
|
||||||
|
|
||||||
|
**Solución**: Invierte en material UV resistente
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Casos de Éxito
|
||||||
|
|
||||||
|
### **Caso 1: Corredor en zona urbana**
|
||||||
|
|
||||||
|
**Estrategia**: Colocó código QR en todos los 12 carteles de inmuebles
|
||||||
|
|
||||||
|
**Resultado:**
|
||||||
|
- 98 escaneos en el primer mes
|
||||||
|
- 28 conversaciones en WhatsApp
|
||||||
|
- 7 visitas agendadas
|
||||||
|
- 2 ventas cerradas
|
||||||
|
|
||||||
|
**ROI**: Invirtió en etiquetas, facturó comisiones significativas
|
||||||
|
|
||||||
|
### **Caso 2: Inmobiliaria en ciudad grande**
|
||||||
|
|
||||||
|
**Estrategia**: Volantes con QR para tour virtual de lanzamiento
|
||||||
|
|
||||||
|
**Resultado:**
|
||||||
|
- 3.000 volantes distribuidos
|
||||||
|
- 645 accesos al tour virtual
|
||||||
|
- 112 registros de interesados
|
||||||
|
- 18 departamentos vendidos en preventa
|
||||||
|
|
||||||
|
### **Caso 3: Corredor Autónomo**
|
||||||
|
|
||||||
|
**Estrategia**: Etiquetas adhesivas en establecimientos asociados
|
||||||
|
|
||||||
|
**Resultado:**
|
||||||
|
- 150 etiquetas distribuidas en 30 locales
|
||||||
|
- 52 nuevos contactos en 3 meses
|
||||||
|
- 9 evaluaciones de inmuebles agendadas
|
||||||
|
- 2 captaciones exclusivas
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Preguntas Frecuentes
|
||||||
|
|
||||||
|
### **¿Necesito pagar para crear código QR?**
|
||||||
|
|
||||||
|
¡No! En QR Rapido creas códigos QR ilimitados gratuitamente. Solo pagas si quieres recursos premium como rastreo avanzado.
|
||||||
|
|
||||||
|
### **¿El código QR funciona para siempre?**
|
||||||
|
|
||||||
|
Códigos QR estáticos (gratuitos) funcionan para siempre, pero no pueden ser editados. Códigos QR dinámicos (pagos) pueden ser editados incluso después de impresos.
|
||||||
|
|
||||||
|
### **¿Qué tipo de QR usar en carteles de inmuebles?**
|
||||||
|
|
||||||
|
Recomiendo **WhatsApp** con mensaje pre-llenado. Así el cliente ya inicia la conversación sabiendo de qué inmueble se trata.
|
||||||
|
|
||||||
|
### **¿Puedo colocar logo de la inmobiliaria en el QR?**
|
||||||
|
|
||||||
|
Sí, ¡pero con cuidado! Logos muy grandes pueden dificultar la lectura. Mantén el logo pequeño (máximo 20% del QR).
|
||||||
|
|
||||||
|
### **¿Cuántas personas escanean QR en carteles?**
|
||||||
|
|
||||||
|
Según investigaciones, entre 5-15% de las personas que ven el cartel escanean el QR. En áreas movimentadas, esto puede generar decenas de leads por mes.
|
||||||
|
|
||||||
|
### **¿El código QR funciona de noche?**
|
||||||
|
|
||||||
|
Sí, siempre que haya alguna iluminación (poste de calle, luz de la pantalla del celular ya ayuda). Para mejor resultado, ilumina el cartel.
|
||||||
|
|
||||||
|
### **¿Puedo usar el mismo QR en varios materiales?**
|
||||||
|
|
||||||
|
Puedes, pero no es recomendado. Crea códigos QR diferentes para saber de dónde viene cada lead (cartel, volante, etiqueta, etc).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Checklist del Corredor Profesional
|
||||||
|
|
||||||
|
Antes de imprimir, verifica:
|
||||||
|
|
||||||
|
- [ ] Código QR probado en al menos 3 celulares diferentes
|
||||||
|
- [ ] Tamaño adecuado para la distancia de escaneo
|
||||||
|
- [ ] Alto contraste entre QR y fondo
|
||||||
|
- [ ] Llamada a la acción clara ("Escanea aquí")
|
||||||
|
- [ ] Información de contacto visible (nombre, matrícula, teléfono)
|
||||||
|
- [ ] URL corta si es link (más fácil de escanear)
|
||||||
|
- [ ] Material de impresión resistente (especialmente externo)
|
||||||
|
- [ ] Margen de seguridad alrededor del QR (mínimo 1cm)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Conclusión
|
||||||
|
|
||||||
|
Los códigos QR son la **herramienta más económica y eficaz** para corredores modernos captar leads calificados. Con una pequeña inversión en etiquetas y volantes, puedes:
|
||||||
|
|
||||||
|
✅ Captar leads 24 horas al día
|
||||||
|
✅ Facilitar el contacto instantáneo vía WhatsApp
|
||||||
|
✅ Mostrar tours virtuales impresionantes
|
||||||
|
✅ Rastrear qué materiales generan más resultado
|
||||||
|
✅ Destacarte de la competencia conservadora
|
||||||
|
|
||||||
|
**El mercado inmobiliario está cada vez más digital. Quien no se adapta, queda atrás.**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ¡Empieza Ahora!
|
||||||
|
|
||||||
|
**Crea tu primer código QR para corredor gratuitamente:**
|
||||||
|
|
||||||
|
1. [Generar Código QR de WhatsApp](/) - Para carteles de inmuebles
|
||||||
|
2. [Generar Código QR vCard](/) - Para tarjetas de visita
|
||||||
|
3. [Generar Código QR de URL](/) - Para tour virtual
|
||||||
|
|
||||||
|
**¡Transforma tus carteles y volantes en máquinas de captar leads!** 🏠📱🚀
|
||||||
@ -16,7 +16,6 @@ namespace QRRapidoApp.Controllers
|
|||||||
}
|
}
|
||||||
|
|
||||||
[Route("Developer/docs")]
|
[Route("Developer/docs")]
|
||||||
[Route("es-PY/Developer/docs")]
|
|
||||||
[Route("es/Developer/docs")]
|
[Route("es/Developer/docs")]
|
||||||
[Route("en/Developer/docs")]
|
[Route("en/Developer/docs")]
|
||||||
public async Task<IActionResult> Index()
|
public async Task<IActionResult> Index()
|
||||||
@ -28,7 +27,6 @@ namespace QRRapidoApp.Controllers
|
|||||||
}
|
}
|
||||||
|
|
||||||
[Route("Developer/docs/{slug}")]
|
[Route("Developer/docs/{slug}")]
|
||||||
[Route("es-PY/Developer/docs/{slug}")]
|
|
||||||
[Route("es/Developer/docs/{slug}")]
|
[Route("es/Developer/docs/{slug}")]
|
||||||
[Route("en/Developer/docs/{slug}")]
|
[Route("en/Developer/docs/{slug}")]
|
||||||
public async Task<IActionResult> Article(string slug)
|
public async Task<IActionResult> Article(string slug)
|
||||||
@ -56,7 +54,6 @@ namespace QRRapidoApp.Controllers
|
|||||||
private string GetCulture()
|
private string GetCulture()
|
||||||
{
|
{
|
||||||
var path = Request.Path.Value ?? "";
|
var path = Request.Path.Value ?? "";
|
||||||
if (path.StartsWith("/es-PY", StringComparison.OrdinalIgnoreCase)) return "es-PY";
|
|
||||||
if (path.StartsWith("/es/", StringComparison.OrdinalIgnoreCase) ||
|
if (path.StartsWith("/es/", StringComparison.OrdinalIgnoreCase) ||
|
||||||
string.Equals(path, "/es", StringComparison.OrdinalIgnoreCase)) return "es";
|
string.Equals(path, "/es", StringComparison.OrdinalIgnoreCase)) return "es";
|
||||||
if (path.StartsWith("/en/", StringComparison.OrdinalIgnoreCase) ||
|
if (path.StartsWith("/en/", StringComparison.OrdinalIgnoreCase) ||
|
||||||
|
|||||||
@ -8,7 +8,6 @@ namespace QRRapidoApp.Controllers
|
|||||||
{
|
{
|
||||||
[Authorize]
|
[Authorize]
|
||||||
[Route("Developer")]
|
[Route("Developer")]
|
||||||
[Route("es-PY/Developer")]
|
|
||||||
[Route("es/Developer")]
|
[Route("es/Developer")]
|
||||||
[Route("en/Developer")]
|
[Route("en/Developer")]
|
||||||
public class DeveloperController : Controller
|
public class DeveloperController : Controller
|
||||||
@ -143,7 +142,6 @@ namespace QRRapidoApp.Controllers
|
|||||||
private string GetCulture()
|
private string GetCulture()
|
||||||
{
|
{
|
||||||
var path = Request.Path.Value ?? "";
|
var path = Request.Path.Value ?? "";
|
||||||
if (path.StartsWith("/es-PY", StringComparison.OrdinalIgnoreCase)) return "es-PY";
|
|
||||||
if (path.StartsWith("/es/", StringComparison.OrdinalIgnoreCase) ||
|
if (path.StartsWith("/es/", StringComparison.OrdinalIgnoreCase) ||
|
||||||
string.Equals(path, "/es", StringComparison.OrdinalIgnoreCase)) return "es";
|
string.Equals(path, "/es", StringComparison.OrdinalIgnoreCase)) return "es";
|
||||||
if (path.StartsWith("/en/", StringComparison.OrdinalIgnoreCase) ||
|
if (path.StartsWith("/en/", StringComparison.OrdinalIgnoreCase) ||
|
||||||
@ -154,7 +152,6 @@ namespace QRRapidoApp.Controllers
|
|||||||
private string GetDevUrl(string action = "")
|
private string GetDevUrl(string action = "")
|
||||||
{
|
{
|
||||||
var base_ = GetCulture() switch {
|
var base_ = GetCulture() switch {
|
||||||
"es-PY" => "/es-PY/Developer",
|
|
||||||
"es" => "/es/Developer",
|
"es" => "/es/Developer",
|
||||||
"en" => "/en/Developer",
|
"en" => "/en/Developer",
|
||||||
_ => "/Developer"
|
_ => "/Developer"
|
||||||
|
|||||||
@ -35,10 +35,10 @@ namespace QRRapidoApp.Controllers
|
|||||||
|
|
||||||
// Home page routes
|
// Home page routes
|
||||||
// "/" → Portuguese (canonical)
|
// "/" → Portuguese (canonical)
|
||||||
// "/es-PY" → Spanish
|
// "/es" → Spanish
|
||||||
[HttpGet]
|
[HttpGet]
|
||||||
[Route("/")]
|
[Route("/")]
|
||||||
[Route("es-PY")]
|
[Route("es")]
|
||||||
[Route("en")]
|
[Route("en")]
|
||||||
public async Task<IActionResult> Index(string? qrType = null)
|
public async Task<IActionResult> Index(string? qrType = null)
|
||||||
{
|
{
|
||||||
@ -113,47 +113,47 @@ namespace QRRapidoApp.Controllers
|
|||||||
|
|
||||||
// Dedicated SEO Routes - Landing pages for each QR type
|
// Dedicated SEO Routes - Landing pages for each QR type
|
||||||
// Portuguese (default): /pix, /wifi, etc. (no culture prefix)
|
// Portuguese (default): /pix, /wifi, etc. (no culture prefix)
|
||||||
// Spanish: /es-PY/pix, /es-PY/wifi, etc.
|
// Spanish: /es/pix, /es/wifi, etc.
|
||||||
|
|
||||||
[Route("pix")]
|
[Route("pix")]
|
||||||
[Route("es-PY/pix")]
|
[Route("es/pix")]
|
||||||
[Route("en/pix")]
|
[Route("en/pix")]
|
||||||
public async Task<IActionResult> Pix() => await Index("pix");
|
public async Task<IActionResult> Pix() => await Index("pix");
|
||||||
|
|
||||||
[Route("wifi")]
|
[Route("wifi")]
|
||||||
[Route("es-PY/wifi")]
|
[Route("es/wifi")]
|
||||||
[Route("en/wifi")]
|
[Route("en/wifi")]
|
||||||
public async Task<IActionResult> Wifi() => await Index("wifi");
|
public async Task<IActionResult> Wifi() => await Index("wifi");
|
||||||
|
|
||||||
[Route("vcard")]
|
[Route("vcard")]
|
||||||
[Route("es-PY/vcard")]
|
[Route("es/vcard")]
|
||||||
[Route("en/vcard")]
|
[Route("en/vcard")]
|
||||||
public async Task<IActionResult> VCard() => await Index("vcard");
|
public async Task<IActionResult> VCard() => await Index("vcard");
|
||||||
|
|
||||||
[Route("whatsapp")]
|
[Route("whatsapp")]
|
||||||
[Route("es-PY/whatsapp")]
|
[Route("es/whatsapp")]
|
||||||
[Route("en/whatsapp")]
|
[Route("en/whatsapp")]
|
||||||
public async Task<IActionResult> WhatsApp() => await Index("whatsapp");
|
public async Task<IActionResult> WhatsApp() => await Index("whatsapp");
|
||||||
|
|
||||||
[Route("email")]
|
[Route("email")]
|
||||||
[Route("es-PY/email")]
|
[Route("es/email")]
|
||||||
[Route("en/email")]
|
[Route("en/email")]
|
||||||
public async Task<IActionResult> Email() => await Index("email");
|
public async Task<IActionResult> Email() => await Index("email");
|
||||||
|
|
||||||
[Route("sms")]
|
[Route("sms")]
|
||||||
[Route("es-PY/sms")]
|
[Route("es/sms")]
|
||||||
[Route("en/sms")]
|
[Route("en/sms")]
|
||||||
public async Task<IActionResult> Sms() => await Index("sms");
|
public async Task<IActionResult> Sms() => await Index("sms");
|
||||||
|
|
||||||
[Route("texto")]
|
[Route("texto")]
|
||||||
[Route("text")]
|
[Route("text")]
|
||||||
[Route("es-PY/texto")]
|
[Route("es/texto")]
|
||||||
[Route("es-PY/text")]
|
[Route("es/text")]
|
||||||
[Route("en/text")]
|
[Route("en/text")]
|
||||||
public async Task<IActionResult> Text() => await Index("text");
|
public async Task<IActionResult> Text() => await Index("text");
|
||||||
|
|
||||||
[Route("url")]
|
[Route("url")]
|
||||||
[Route("es-PY/url")]
|
[Route("es/url")]
|
||||||
[Route("en/url")]
|
[Route("en/url")]
|
||||||
public async Task<IActionResult> UrlType() => await Index("url");
|
public async Task<IActionResult> UrlType() => await Index("url");
|
||||||
|
|
||||||
@ -334,7 +334,7 @@ namespace QRRapidoApp.Controllers
|
|||||||
|
|
||||||
// Core entry points
|
// Core entry points
|
||||||
AppendUrl("/", "daily", "1.0");
|
AppendUrl("/", "daily", "1.0");
|
||||||
AppendUrl("/es-PY", "daily", "0.9");
|
AppendUrl("/es", "daily", "0.9");
|
||||||
|
|
||||||
// Tools (Landing Pages)
|
// Tools (Landing Pages)
|
||||||
var tools = new[] { "pix", "wifi", "vcard", "whatsapp", "email", "sms", "texto", "url" };
|
var tools = new[] { "pix", "wifi", "vcard", "whatsapp", "email", "sms", "texto", "url" };
|
||||||
@ -342,7 +342,7 @@ namespace QRRapidoApp.Controllers
|
|||||||
foreach (var tool in tools)
|
foreach (var tool in tools)
|
||||||
{
|
{
|
||||||
AppendUrl($"/{tool}", "weekly", "0.9");
|
AppendUrl($"/{tool}", "weekly", "0.9");
|
||||||
AppendUrl($"/es-PY/{tool}", "weekly", "0.8");
|
AppendUrl($"/es/{tool}", "weekly", "0.8");
|
||||||
}
|
}
|
||||||
|
|
||||||
// Informational pages
|
// Informational pages
|
||||||
@ -359,7 +359,7 @@ namespace QRRapidoApp.Controllers
|
|||||||
foreach (var page in informationalPages)
|
foreach (var page in informationalPages)
|
||||||
{
|
{
|
||||||
AppendUrl($"/{page.Path}", page.ChangeFreq, page.Priority);
|
AppendUrl($"/{page.Path}", page.ChangeFreq, page.Priority);
|
||||||
AppendUrl($"/es-PY/{page.Path}", page.ChangeFreq, page.Priority);
|
AppendUrl($"/es/{page.Path}", page.ChangeFreq, page.Priority);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Dynamic tutorial pages from Markdown
|
// Dynamic tutorial pages from Markdown
|
||||||
@ -379,7 +379,7 @@ namespace QRRapidoApp.Controllers
|
|||||||
|
|
||||||
var tutorialPath = article.Culture == "pt-BR"
|
var tutorialPath = article.Culture == "pt-BR"
|
||||||
? $"/tutoriais/{encodedSlug}"
|
? $"/tutoriais/{encodedSlug}"
|
||||||
: $"/es-PY/tutoriais/{encodedSlug}";
|
: $"/es/tutoriais/{encodedSlug}";
|
||||||
|
|
||||||
var lastMod = article.LastMod.ToString("yyyy-MM-dd");
|
var lastMod = article.LastMod.ToString("yyyy-MM-dd");
|
||||||
AppendUrl(tutorialPath, "weekly", "0.8", lastMod);
|
AppendUrl(tutorialPath, "weekly", "0.8", lastMod);
|
||||||
|
|||||||
@ -28,10 +28,9 @@ namespace QRRapidoApp.Controllers
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Portuguese: /tutoriais/{slug} (canonical, no prefix)
|
// Portuguese: /tutoriais/{slug} (canonical, no prefix)
|
||||||
// Spanish: /es-PY/tutoriais/{slug}
|
// Spanish: /es/tutoriais/{slug}
|
||||||
// English: /en/tutoriais/{slug}
|
// English: /en/tutoriais/{slug}
|
||||||
[Route("tutoriais/{slug}")]
|
[Route("tutoriais/{slug}")]
|
||||||
[Route("es-PY/tutoriais/{slug}")]
|
|
||||||
[Route("es/tutoriais/{slug}")]
|
[Route("es/tutoriais/{slug}")]
|
||||||
[Route("en/tutoriais/{slug}")]
|
[Route("en/tutoriais/{slug}")]
|
||||||
public async Task<IActionResult> Article(string slug, string? culture = null)
|
public async Task<IActionResult> Article(string slug, string? culture = null)
|
||||||
@ -40,9 +39,8 @@ namespace QRRapidoApp.Controllers
|
|||||||
{
|
{
|
||||||
// Determine culture from URL path if not provided
|
// Determine culture from URL path if not provided
|
||||||
var reqPath = Request.Path.Value ?? "";
|
var reqPath = Request.Path.Value ?? "";
|
||||||
culture ??= reqPath.StartsWith("/es-PY", StringComparison.OrdinalIgnoreCase) ? "es-PY"
|
culture ??= reqPath.StartsWith("/es/", StringComparison.OrdinalIgnoreCase) ? "es"
|
||||||
: reqPath.StartsWith("/es/", StringComparison.OrdinalIgnoreCase) ? "es"
|
: reqPath.StartsWith("/en/", StringComparison.OrdinalIgnoreCase) ? "en"
|
||||||
: reqPath.StartsWith("/en/", StringComparison.OrdinalIgnoreCase) ? "en"
|
|
||||||
: "pt-BR";
|
: "pt-BR";
|
||||||
|
|
||||||
var article = await _markdownService.GetArticleAsync(slug, culture);
|
var article = await _markdownService.GetArticleAsync(slug, culture);
|
||||||
@ -91,10 +89,9 @@ namespace QRRapidoApp.Controllers
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Portuguese: /tutoriais (canonical, no prefix)
|
// Portuguese: /tutoriais (canonical, no prefix)
|
||||||
// Spanish: /es-PY/tutoriais
|
// Spanish: /es/tutoriais
|
||||||
// English: /en/tutoriais
|
// English: /en/tutoriais
|
||||||
[Route("tutoriais")]
|
[Route("tutoriais")]
|
||||||
[Route("es-PY/tutoriais")]
|
|
||||||
[Route("es/tutoriais")]
|
[Route("es/tutoriais")]
|
||||||
[Route("en/tutoriais")]
|
[Route("en/tutoriais")]
|
||||||
public async Task<IActionResult> Index(string? culture = null)
|
public async Task<IActionResult> Index(string? culture = null)
|
||||||
@ -103,9 +100,8 @@ namespace QRRapidoApp.Controllers
|
|||||||
{
|
{
|
||||||
// Determine culture from URL path if not provided
|
// Determine culture from URL path if not provided
|
||||||
var reqPath = Request.Path.Value ?? "";
|
var reqPath = Request.Path.Value ?? "";
|
||||||
culture ??= reqPath.StartsWith("/es-PY", StringComparison.OrdinalIgnoreCase) ? "es-PY"
|
culture ??= reqPath.StartsWith("/es/", StringComparison.OrdinalIgnoreCase) ? "es"
|
||||||
: reqPath.StartsWith("/es/", StringComparison.OrdinalIgnoreCase) ? "es"
|
: reqPath.StartsWith("/en/", StringComparison.OrdinalIgnoreCase) ? "en"
|
||||||
: reqPath.StartsWith("/en/", StringComparison.OrdinalIgnoreCase) ? "en"
|
|
||||||
: "pt-BR";
|
: "pt-BR";
|
||||||
|
|
||||||
var articles = await _markdownService.GetAllArticlesAsync(culture);
|
var articles = await _markdownService.GetAllArticlesAsync(culture);
|
||||||
|
|||||||
@ -9,7 +9,7 @@ namespace QRRapidoApp.Middleware
|
|||||||
/// Comportamento:
|
/// Comportamento:
|
||||||
/// - "/" → Retorna 200 OK em Português (canonical)
|
/// - "/" → Retorna 200 OK em Português (canonical)
|
||||||
/// - "/pt-BR" ou "/pt-BR/*" → Redireciona 301 para "/" ou "/*" (sem prefixo)
|
/// - "/pt-BR" ou "/pt-BR/*" → Redireciona 301 para "/" ou "/*" (sem prefixo)
|
||||||
/// - "/es-PY" ou "/es-PY/*" → Retorna 200 OK em Espanhol (mantém URL)
|
/// - "/es" ou "/es/*" → Retorna 200 OK em Espanhol (mantém URL)
|
||||||
/// - "/en" ou "/en/*" → Retorna 200 OK em Inglês (mantém URL)
|
/// - "/en" ou "/en/*" → Retorna 200 OK em Inglês (mantém URL)
|
||||||
/// - "/pix", "/wifi", etc. → Retorna 200 OK em Português (sem redirect)
|
/// - "/pix", "/wifi", etc. → Retorna 200 OK em Português (sem redirect)
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@ -17,7 +17,7 @@ namespace QRRapidoApp.Middleware
|
|||||||
{
|
{
|
||||||
private readonly RequestDelegate _next;
|
private readonly RequestDelegate _next;
|
||||||
private readonly ILogger<LanguageRedirectionMiddleware> _logger;
|
private readonly ILogger<LanguageRedirectionMiddleware> _logger;
|
||||||
private readonly string[] _supportedCultures = { "pt-BR", "es-PY", "es", "en" };
|
private readonly string[] _supportedCultures = { "pt-BR", "es", "en" };
|
||||||
private const string DefaultCulture = "pt-BR";
|
private const string DefaultCulture = "pt-BR";
|
||||||
private const string CookieName = ".AspNetCore.Culture";
|
private const string CookieName = ".AspNetCore.Culture";
|
||||||
|
|
||||||
@ -69,14 +69,6 @@ namespace QRRapidoApp.Middleware
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Supported: es-PY
|
|
||||||
if (string.Equals(firstSegment, "es-PY", StringComparison.OrdinalIgnoreCase))
|
|
||||||
{
|
|
||||||
SetCulture(context, "es-PY");
|
|
||||||
await _next(context);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Supported: es (Spanish neutral)
|
// Supported: es (Spanish neutral)
|
||||||
if (string.Equals(firstSegment, "es", StringComparison.OrdinalIgnoreCase))
|
if (string.Equals(firstSegment, "es", StringComparison.OrdinalIgnoreCase))
|
||||||
{
|
{
|
||||||
@ -117,7 +109,7 @@ namespace QRRapidoApp.Middleware
|
|||||||
{
|
{
|
||||||
// Map known aliases to canonical forms
|
// Map known aliases to canonical forms
|
||||||
if (string.Equals(firstSegment, "es-py", StringComparison.OrdinalIgnoreCase))
|
if (string.Equals(firstSegment, "es-py", StringComparison.OrdinalIgnoreCase))
|
||||||
return RedirectToLanguage(context, "es-PY", segments);
|
return RedirectToLanguage(context, "es", segments);
|
||||||
|
|
||||||
if (string.Equals(firstSegment, "en-us", StringComparison.OrdinalIgnoreCase) ||
|
if (string.Equals(firstSegment, "en-us", StringComparison.OrdinalIgnoreCase) ||
|
||||||
string.Equals(firstSegment, "en-gb", StringComparison.OrdinalIgnoreCase))
|
string.Equals(firstSegment, "en-gb", StringComparison.OrdinalIgnoreCase))
|
||||||
|
|||||||
@ -224,7 +224,6 @@ builder.Services.Configure<RequestLocalizationOptions>(options =>
|
|||||||
var supportedCultures = new[]
|
var supportedCultures = new[]
|
||||||
{
|
{
|
||||||
new CultureInfo("pt-BR"),
|
new CultureInfo("pt-BR"),
|
||||||
new CultureInfo("es-PY"),
|
|
||||||
new CultureInfo("es"),
|
new CultureInfo("es"),
|
||||||
new CultureInfo("en"),
|
new CultureInfo("en"),
|
||||||
};
|
};
|
||||||
@ -464,7 +463,7 @@ app.MapHealthChecks("/healthcheck");
|
|||||||
// Language routes (must be first for WEB)
|
// Language routes (must be first for WEB)
|
||||||
app.MapControllerRoute(
|
app.MapControllerRoute(
|
||||||
name: "localized",
|
name: "localized",
|
||||||
pattern: "{culture:regex(^(pt-BR|es-PY|es|en)$)}/{controller=Home}/{action=Index}/{id?}");
|
pattern: "{culture:regex(^(pt-BR|es|en)$)}/{controller=Home}/{action=Index}/{id?}");
|
||||||
|
|
||||||
app.MapControllerRoute(
|
app.MapControllerRoute(
|
||||||
name: "api_v1",
|
name: "api_v1",
|
||||||
|
|||||||
@ -6,10 +6,10 @@ namespace QRRapidoApp.Providers
|
|||||||
{
|
{
|
||||||
public Task<ProviderCultureResult?> DetermineProviderCultureResult(HttpContext httpContext)
|
public Task<ProviderCultureResult?> DetermineProviderCultureResult(HttpContext httpContext)
|
||||||
{
|
{
|
||||||
// First check if the middleware has already determined the culture (e.g. for static routes like /es-PY/pix)
|
// First check if the middleware has already determined the culture (e.g. for static routes like /es/pix)
|
||||||
if (httpContext.Items.TryGetValue("Culture", out var cultureItem) && cultureItem is string cultureFromMiddleware)
|
if (httpContext.Items.TryGetValue("Culture", out var cultureItem) && cultureItem is string cultureFromMiddleware)
|
||||||
{
|
{
|
||||||
var supportedCultures = new[] { "pt-BR", "es-PY", "en" };
|
var supportedCultures = new[] { "pt-BR", "es", "en" };
|
||||||
if (supportedCultures.Contains(cultureFromMiddleware))
|
if (supportedCultures.Contains(cultureFromMiddleware))
|
||||||
{
|
{
|
||||||
return Task.FromResult<ProviderCultureResult?>(new ProviderCultureResult(cultureFromMiddleware, cultureFromMiddleware));
|
return Task.FromResult<ProviderCultureResult?>(new ProviderCultureResult(cultureFromMiddleware, cultureFromMiddleware));
|
||||||
@ -24,7 +24,7 @@ namespace QRRapidoApp.Providers
|
|||||||
if (!string.IsNullOrEmpty(culture))
|
if (!string.IsNullOrEmpty(culture))
|
||||||
{
|
{
|
||||||
// Map the supported cultures
|
// Map the supported cultures
|
||||||
var supportedCultures = new[] { "pt-BR", "es-PY", "en" };
|
var supportedCultures = new[] { "pt-BR", "es", "en" };
|
||||||
if (supportedCultures.Contains(culture))
|
if (supportedCultures.Contains(culture))
|
||||||
{
|
{
|
||||||
return Task.FromResult<ProviderCultureResult?>(new ProviderCultureResult(culture, culture));
|
return Task.FromResult<ProviderCultureResult?>(new ProviderCultureResult(culture, culture));
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@ -4,8 +4,8 @@
|
|||||||
Layout = "~/Views/Shared/_Layout.cshtml";
|
Layout = "~/Views/Shared/_Layout.cshtml";
|
||||||
|
|
||||||
var isEn = (ViewBag.Culture as string) == "en";
|
var isEn = (ViewBag.Culture as string) == "en";
|
||||||
var isEs = (ViewBag.Culture as string) == "es-PY" || (ViewBag.Culture as string) == "es";
|
var isEs = (ViewBag.Culture as string) == "es";
|
||||||
var devBase = isEn ? "/en/Developer" : isEs ? "/es-PY/Developer" : "/Developer";
|
var devBase = isEn ? "/en/Developer" : isEs ? "/es/Developer" : "/Developer";
|
||||||
var slug = ViewBag.Slug as string;
|
var slug = ViewBag.Slug as string;
|
||||||
|
|
||||||
string T(string pt, string es, string en) => isEn ? en : isEs ? es : pt;
|
string T(string pt, string es, string en) => isEn ? en : isEs ? es : pt;
|
||||||
|
|||||||
@ -4,8 +4,8 @@
|
|||||||
Layout = "~/Views/Shared/_Layout.cshtml";
|
Layout = "~/Views/Shared/_Layout.cshtml";
|
||||||
|
|
||||||
var isEn = (ViewBag.Culture as string) == "en";
|
var isEn = (ViewBag.Culture as string) == "en";
|
||||||
var isEs = (ViewBag.Culture as string) == "es-PY" || (ViewBag.Culture as string) == "es";
|
var isEs = (ViewBag.Culture as string) == "es";
|
||||||
var devBase = isEn ? "/en/Developer" : isEs ? "/es-PY/Developer" : "/Developer";
|
var devBase = isEn ? "/en/Developer" : isEs ? "/es/Developer" : "/Developer";
|
||||||
|
|
||||||
string T(string pt, string es, string en) => isEn ? en : isEs ? es : pt;
|
string T(string pt, string es, string en) => isEn ? en : isEs ? es : pt;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -13,8 +13,8 @@
|
|||||||
|
|
||||||
var baseUrl = Context.Request.Scheme + "://" + Context.Request.Host;
|
var baseUrl = Context.Request.Scheme + "://" + Context.Request.Host;
|
||||||
var isEn = (ViewBag.Culture as string) == "en";
|
var isEn = (ViewBag.Culture as string) == "en";
|
||||||
var isEs = (ViewBag.Culture as string) == "es-PY" || (ViewBag.Culture as string) == "es";
|
var isEs = (ViewBag.Culture as string) == "es";
|
||||||
var docsBase = isEn ? "/en/Developer" : isEs ? "/es-PY/Developer" : "/Developer";
|
var docsBase = isEn ? "/en/Developer" : isEs ? "/es/Developer" : "/Developer";
|
||||||
|
|
||||||
string T(string pt, string es, string en = null) => isEn && en != null ? en : isEs ? es : pt;
|
string T(string pt, string es, string en = null) => isEn && en != null ? en : isEs ? es : pt;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -6,8 +6,8 @@
|
|||||||
var currentTier = ViewBag.CurrentTier as ApiPlanTier? ?? ApiPlanTier.Free;
|
var currentTier = ViewBag.CurrentTier as ApiPlanTier? ?? ApiPlanTier.Free;
|
||||||
var errorMsg = TempData["Error"] as string;
|
var errorMsg = TempData["Error"] as string;
|
||||||
var isEn = (ViewBag.Culture as string) == "en";
|
var isEn = (ViewBag.Culture as string) == "en";
|
||||||
var isEs = (ViewBag.Culture as string) == "es-PY" || (ViewBag.Culture as string) == "es";
|
var isEs = (ViewBag.Culture as string) == "es";
|
||||||
var devBase = isEn ? "/en/Developer" : isEs ? "/es-PY/Developer" : "/Developer";
|
var devBase = isEn ? "/en/Developer" : isEs ? "/es/Developer" : "/Developer";
|
||||||
|
|
||||||
string T(string pt, string es, string en = null) => isEn && en != null ? en : isEs ? es : pt;
|
string T(string pt, string es, string en = null) => isEn && en != null ? en : isEs ? es : pt;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -4,6 +4,10 @@
|
|||||||
@{
|
@{
|
||||||
ViewData["Title"] = "Comprar Créditos";
|
ViewData["Title"] = "Comprar Créditos";
|
||||||
Layout = "~/Views/Shared/_Layout.cshtml";
|
Layout = "~/Views/Shared/_Layout.cshtml";
|
||||||
|
|
||||||
|
var reqPath = Context.Request.Path.Value ?? "";
|
||||||
|
var isBrazilian = !reqPath.StartsWith("/en", StringComparison.OrdinalIgnoreCase)
|
||||||
|
&& !reqPath.StartsWith("/es", StringComparison.OrdinalIgnoreCase);
|
||||||
}
|
}
|
||||||
|
|
||||||
<div class="container py-5">
|
<div class="container py-5">
|
||||||
@ -34,10 +38,13 @@
|
|||||||
|
|
||||||
<!-- Preços Duplos -->
|
<!-- Preços Duplos -->
|
||||||
<div class="bg-light rounded p-3 mb-4">
|
<div class="bg-light rounded p-3 mb-4">
|
||||||
<div class="d-flex justify-content-between align-items-center mb-2">
|
@if (isBrazilian)
|
||||||
<span class="text-muted"><i class="fas fa-bolt text-warning"></i> PIX</span>
|
{
|
||||||
<span class="h4 text-success mb-0 fw-bold">R$ @package.PricePix.ToString("F2")</span>
|
<div class="d-flex justify-content-between align-items-center mb-2">
|
||||||
</div>
|
<span class="text-muted"><i class="fas fa-bolt text-warning"></i> PIX</span>
|
||||||
|
<span class="h4 text-success mb-0 fw-bold">R$ @package.PricePix.ToString("F2")</span>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
<div class="d-flex justify-content-between align-items-center">
|
<div class="d-flex justify-content-between align-items-center">
|
||||||
<span class="text-muted"><i class="fas fa-credit-card"></i> Cartão</span>
|
<span class="text-muted"><i class="fas fa-credit-card"></i> Cartão</span>
|
||||||
<span class="h5 text-secondary mb-0">R$ @package.PriceCard.ToString("F2")</span>
|
<span class="h5 text-secondary mb-0">R$ @package.PriceCard.ToString("F2")</span>
|
||||||
@ -53,10 +60,13 @@
|
|||||||
@if (User.Identity.IsAuthenticated)
|
@if (User.Identity.IsAuthenticated)
|
||||||
{
|
{
|
||||||
<div class="d-grid gap-2 mt-auto">
|
<div class="d-grid gap-2 mt-auto">
|
||||||
<button class="btn btn-outline-success btn-pix-checkout"
|
@if (isBrazilian)
|
||||||
data-package-id="@package.Id">
|
{
|
||||||
<i class="fas fa-qrcode me-2"></i> Pagar com PIX
|
<button class="btn btn-outline-success btn-pix-checkout"
|
||||||
</button>
|
data-package-id="@package.Id">
|
||||||
|
<i class="fas fa-qrcode me-2"></i> Pagar com PIX
|
||||||
|
</button>
|
||||||
|
}
|
||||||
<button class="btn @(package.IsPopular ? "btn-primary" : "btn-outline-primary") btn-card-checkout"
|
<button class="btn @(package.IsPopular ? "btn-primary" : "btn-outline-primary") btn-card-checkout"
|
||||||
data-package-id="@package.Id">
|
data-package-id="@package.Id">
|
||||||
<i class="fas fa-credit-card me-2"></i> Pagar com Cartão
|
<i class="fas fa-credit-card me-2"></i> Pagar com Cartão
|
||||||
|
|||||||
@ -20,18 +20,17 @@
|
|||||||
|
|
||||||
// SEO: Determine current culture from URL
|
// SEO: Determine current culture from URL
|
||||||
var requestPath = Context.Request.Path.Value ?? "/";
|
var requestPath = Context.Request.Path.Value ?? "/";
|
||||||
var isSpanish = requestPath.StartsWith("/es-PY", StringComparison.OrdinalIgnoreCase)
|
var isSpanish = requestPath.StartsWith("/es/", StringComparison.OrdinalIgnoreCase)
|
||||||
|| requestPath.StartsWith("/es/", StringComparison.OrdinalIgnoreCase)
|
|
||||||
|| string.Equals(requestPath, "/es", StringComparison.OrdinalIgnoreCase);
|
|| string.Equals(requestPath, "/es", StringComparison.OrdinalIgnoreCase);
|
||||||
var isEnglish = requestPath.StartsWith("/en/", StringComparison.OrdinalIgnoreCase)
|
var isEnglish = requestPath.StartsWith("/en/", StringComparison.OrdinalIgnoreCase)
|
||||||
|| string.Equals(requestPath, "/en", StringComparison.OrdinalIgnoreCase);
|
|| string.Equals(requestPath, "/en", StringComparison.OrdinalIgnoreCase);
|
||||||
|
|
||||||
// Get path without culture prefix for building alternate URLs
|
// Get path without culture prefix for building alternate URLs
|
||||||
var pathWithoutCulture = requestPath;
|
var pathWithoutCulture = requestPath;
|
||||||
if (requestPath.StartsWith("/es-PY", StringComparison.OrdinalIgnoreCase))
|
if (requestPath.StartsWith("/es/", StringComparison.OrdinalIgnoreCase))
|
||||||
pathWithoutCulture = requestPath.Length > 6 ? requestPath.Substring(6) : "/";
|
|
||||||
else if (requestPath.StartsWith("/es/", StringComparison.OrdinalIgnoreCase))
|
|
||||||
pathWithoutCulture = requestPath.Length > 3 ? requestPath.Substring(3) : "/";
|
pathWithoutCulture = requestPath.Length > 3 ? requestPath.Substring(3) : "/";
|
||||||
|
else if (string.Equals(requestPath, "/es", StringComparison.OrdinalIgnoreCase))
|
||||||
|
pathWithoutCulture = "/";
|
||||||
else if (requestPath.StartsWith("/en/", StringComparison.OrdinalIgnoreCase))
|
else if (requestPath.StartsWith("/en/", StringComparison.OrdinalIgnoreCase))
|
||||||
pathWithoutCulture = requestPath.Length > 3 ? requestPath.Substring(3) : "/";
|
pathWithoutCulture = requestPath.Length > 3 ? requestPath.Substring(3) : "/";
|
||||||
if (string.IsNullOrEmpty(pathWithoutCulture)) pathWithoutCulture = "/";
|
if (string.IsNullOrEmpty(pathWithoutCulture)) pathWithoutCulture = "/";
|
||||||
@ -40,16 +39,16 @@
|
|||||||
var canonicalUrl = isEnglish
|
var canonicalUrl = isEnglish
|
||||||
? $"https://qrrapido.site/en{(pathWithoutCulture == "/" ? "" : pathWithoutCulture)}"
|
? $"https://qrrapido.site/en{(pathWithoutCulture == "/" ? "" : pathWithoutCulture)}"
|
||||||
: isSpanish
|
: isSpanish
|
||||||
? $"https://qrrapido.site/es-PY{(pathWithoutCulture == "/" ? "" : pathWithoutCulture)}"
|
? $"https://qrrapido.site/es{(pathWithoutCulture == "/" ? "" : pathWithoutCulture)}"
|
||||||
: $"https://qrrapido.site{pathWithoutCulture}";
|
: $"https://qrrapido.site{pathWithoutCulture}";
|
||||||
|
|
||||||
// Alternate URLs for hreflang
|
// Alternate URLs for hreflang
|
||||||
var ptUrl = $"https://qrrapido.site{pathWithoutCulture}";
|
var ptUrl = $"https://qrrapido.site{pathWithoutCulture}";
|
||||||
var esUrl = $"https://qrrapido.site/es-PY{(pathWithoutCulture == "/" ? "" : pathWithoutCulture)}";
|
var esUrl = $"https://qrrapido.site/es{(pathWithoutCulture == "/" ? "" : pathWithoutCulture)}";
|
||||||
var enUrl = $"https://qrrapido.site/en{(pathWithoutCulture == "/" ? "" : pathWithoutCulture)}";
|
var enUrl = $"https://qrrapido.site/en{(pathWithoutCulture == "/" ? "" : pathWithoutCulture)}";
|
||||||
|
|
||||||
// Culture prefix for internal links
|
// Culture prefix for internal links
|
||||||
var culturePrefix = isEnglish ? "/en" : isSpanish ? "/es-PY" : "";
|
var culturePrefix = isEnglish ? "/en" : isSpanish ? "/es" : "";
|
||||||
|
|
||||||
if (User?.Identity?.IsAuthenticated == true)
|
if (User?.Identity?.IsAuthenticated == true)
|
||||||
{
|
{
|
||||||
@ -90,7 +89,7 @@
|
|||||||
|
|
||||||
<!-- Hreflang for multilingual SEO -->
|
<!-- Hreflang for multilingual SEO -->
|
||||||
<link rel="alternate" hreflang="pt-BR" href="@ptUrl">
|
<link rel="alternate" hreflang="pt-BR" href="@ptUrl">
|
||||||
<link rel="alternate" hreflang="es-PY" href="@esUrl">
|
<link rel="alternate" hreflang="es" href="@esUrl">
|
||||||
<link rel="alternate" hreflang="en" href="@enUrl">
|
<link rel="alternate" hreflang="en" href="@enUrl">
|
||||||
<link rel="alternate" hreflang="x-default" href="@ptUrl">
|
<link rel="alternate" hreflang="x-default" href="@ptUrl">
|
||||||
|
|
||||||
@ -324,7 +323,7 @@
|
|||||||
</button>
|
</button>
|
||||||
<ul class="dropdown-menu">
|
<ul class="dropdown-menu">
|
||||||
<li><a class="dropdown-item" href="#" data-lang="pt-BR">🇧🇷 Português (Brasil)</a></li>
|
<li><a class="dropdown-item" href="#" data-lang="pt-BR">🇧🇷 Português (Brasil)</a></li>
|
||||||
<li><a class="dropdown-item" href="#" data-lang="es-PY">🇵🇾 Español (Paraguay)</a></li>
|
<li><a class="dropdown-item" href="#" data-lang="es">🌎 Español</a></li>
|
||||||
<li><a class="dropdown-item" href="#" data-lang="en">🇺🇸 English</a></li>
|
<li><a class="dropdown-item" href="#" data-lang="en">🇺🇸 English</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@ -3,7 +3,7 @@
|
|||||||
Layout = "~/Views/Shared/_Layout.cshtml";
|
Layout = "~/Views/Shared/_Layout.cshtml";
|
||||||
ViewData["Title"] = Model.Metadata.Title;
|
ViewData["Title"] = Model.Metadata.Title;
|
||||||
var isEn = (ViewBag.Culture as string) == "en";
|
var isEn = (ViewBag.Culture as string) == "en";
|
||||||
var isEs = (ViewBag.Culture as string) == "es-PY" || (ViewBag.Culture as string) == "es";
|
var isEs = (ViewBag.Culture as string) == "es";
|
||||||
string T(string pt, string es, string en) => isEn ? en : isEs ? es : pt;
|
string T(string pt, string es, string en) => isEn ? en : isEs ? es : pt;
|
||||||
var baseUrl = "https://qrrapido.site";
|
var baseUrl = "https://qrrapido.site";
|
||||||
var articleUrl = $"{baseUrl}/{ViewBag.Culture}/tutoriais/{ViewBag.Slug}";
|
var articleUrl = $"{baseUrl}/{ViewBag.Culture}/tutoriais/{ViewBag.Slug}";
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
@model List<QRRapidoApp.Models.ArticleMetadata>
|
@model List<QRRapidoApp.Models.ArticleMetadata>
|
||||||
@{
|
@{
|
||||||
var isEn = (ViewBag.Culture as string) == "en";
|
var isEn = (ViewBag.Culture as string) == "en";
|
||||||
var isEs = (ViewBag.Culture as string) == "es-PY" || (ViewBag.Culture as string) == "es";
|
var isEs = (ViewBag.Culture as string) == "es";
|
||||||
string T(string pt, string es, string en) => isEn ? en : isEs ? es : pt;
|
string T(string pt, string es, string en) => isEn ? en : isEs ? es : pt;
|
||||||
|
|
||||||
ViewData["Title"] = T("Tutoriais QR Code", "Tutoriales Código QR", "QR Code Tutorials");
|
ViewData["Title"] = T("Tutoriais QR Code", "Tutoriales Código QR", "QR Code Tutorials");
|
||||||
|
|||||||
@ -1,22 +1,22 @@
|
|||||||
// Language switching functionality for QR Rapido
|
// Language switching functionality for QR Rapido
|
||||||
// SEO Strategy:
|
// SEO Strategy:
|
||||||
// - Portuguese (pt-BR): URLs without prefix (/, /pix, /wifi, etc.) - canonical
|
// - Portuguese (pt-BR): URLs without prefix (/, /pix, /wifi, etc.) - canonical
|
||||||
// - Spanish (es-PY): URLs with /es-PY prefix (/es-PY, /es-PY/pix, etc.)
|
// - Spanish (es): URLs with /es prefix (/es, /es/pix, etc.)
|
||||||
// - English (en): URLs with /en prefix (/en, /en/pix, etc.)
|
// - English (en): URLs with /en prefix (/en, /en/pix, etc.)
|
||||||
|
|
||||||
document.addEventListener('DOMContentLoaded', function () {
|
document.addEventListener('DOMContentLoaded', function () {
|
||||||
const languageDropdownItems = document.querySelectorAll('.dropdown-item[data-lang]');
|
const languageDropdownItems = document.querySelectorAll('.dropdown-item[data-lang]');
|
||||||
const currentLangSpan = document.getElementById('current-lang');
|
const currentLangSpan = document.getElementById('current-lang');
|
||||||
|
|
||||||
// Cultures that use a URL prefix
|
// Cultures that use a URL prefix
|
||||||
const prefixedCultures = ['es-PY', 'en'];
|
const prefixedCultures = ['es', 'en'];
|
||||||
|
|
||||||
// Get current culture from URL
|
// Get current culture from URL
|
||||||
function getCurrentCulture() {
|
function getCurrentCulture() {
|
||||||
const pathSegments = window.location.pathname.split('/').filter(segment => segment);
|
const pathSegments = window.location.pathname.split('/').filter(segment => segment);
|
||||||
if (pathSegments.length > 0) {
|
if (pathSegments.length > 0) {
|
||||||
const first = pathSegments[0].toLowerCase();
|
const first = pathSegments[0].toLowerCase();
|
||||||
if (first === 'es-py') return 'es-PY';
|
if (first === 'es-py' || first === 'es') return 'es';
|
||||||
if (first === 'en') return 'en';
|
if (first === 'en') return 'en';
|
||||||
}
|
}
|
||||||
return 'pt-BR'; // Default — no prefix
|
return 'pt-BR'; // Default — no prefix
|
||||||
@ -26,7 +26,7 @@ document.addEventListener('DOMContentLoaded', function () {
|
|||||||
function updateCurrentLanguageDisplay(culture) {
|
function updateCurrentLanguageDisplay(culture) {
|
||||||
const langMap = {
|
const langMap = {
|
||||||
'pt-BR': 'PT',
|
'pt-BR': 'PT',
|
||||||
'es-PY': 'ES',
|
'es': 'ES',
|
||||||
'en': 'EN'
|
'en': 'EN'
|
||||||
};
|
};
|
||||||
if (currentLangSpan) {
|
if (currentLangSpan) {
|
||||||
@ -44,7 +44,7 @@ document.addEventListener('DOMContentLoaded', function () {
|
|||||||
let pathSegments = currentPath.split('/').filter(segment => segment);
|
let pathSegments = currentPath.split('/').filter(segment => segment);
|
||||||
if (pathSegments.length > 0) {
|
if (pathSegments.length > 0) {
|
||||||
const first = pathSegments[0].toLowerCase();
|
const first = pathSegments[0].toLowerCase();
|
||||||
if (first === 'es-py' || first === 'pt-br' || first === 'en') {
|
if (first === 'es-py' || first === 'es' || first === 'pt-br' || first === 'en') {
|
||||||
pathSegments.shift();
|
pathSegments.shift();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user