LOVABLE · BOLT · BASE44 → FUNCIONES NATIVAS
Funciones nativas para apps de Lovable, Bolt y Base44: prompts para pegar
Actualizado el 3 de noviembre de 2026
Antes de pegar un prompt
Cada función es un plugin de tu proyecto de SaasToStore. El prompt cambia tu sitio; el plugin pone la función en la app.
Añade el plugin y lanza un nuevo build
Abre la biblioteca de plugins de tu proyecto, añade el plugin y lanza un nuevo build: una app construida antes de añadirlo no tiene la función. Los plugins funcionan en los builds Android nativos (Android Build (Native), Android TV) y en las apps iOS. No están en el Android Build (Web) (TWA) ni en el build de prueba gratuito, que muestra tu sitio como app, sin plugins.
Prueba en la app, no en la vista previa del editor
La vista previa de Lovable, Bolt y Base44 muestra tu sitio en un marco del editor, y los plugins solo funcionan en tu app, nunca en un marco. Ahí no pasa nada, y es lo esperado: los prompts mantienen tu sitio funcionando sin ellos. Publica tu sitio y abre tu app en un teléfono.
Tu sitio cambia, la app lo sigue
La app carga tu sitio publicado. Cuando el plugin ya está en la app, un cambio que publicas en Lovable, Bolt o Base44 llega a la app sin un nuevo build.
Dónde pegar el prompt
Cada prompt es independiente: pega uno cada vez, revisa el resultado y pasa al siguiente. La IA adapta los nombres de archivo a tu proyecto.
Lovable
Pégalo en el chat de tu proyecto. Cuando el cambio esté hecho, haz clic en Publish: la app carga tu sitio publicado, no la vista previa.
Bolt
Pégalo en el chat de Bolt y vuelve a desplegar, con el botón de despliegue de Bolt o en tu propio hosting. La app carga la dirección desplegada.
Base44
Pégalo en el chat de IA de tu app y publica. La app carga la dirección pública de tu app.
Respuesta háptica
Vibraciones cortas que confirman un toque, un éxito o un error. Sin ventana de permiso. Lo que siente la persona depende de su teléfono y de su ajuste de vibración; en Android, un dispositivo que no puede vibrar (la mayoría de tabletas y televisores) no hace nada.
Prompt · respuesta háptica
Añade respuesta háptica a mi proyecto, con el puente de app de SaasToStore.
Contexto: mi sitio también funciona dentro de una app móvil nativa creada con SaasToStore. Dentro de esa app, `window.saastostore.haptics` hace vibrar el teléfono un instante. En un navegador normal, y en la vista previa del editor, no existe, y el sitio debe seguir funcionando exactamente como hoy. No cambies nada más.
1. Si mi proyecto aún no tiene `src/lib/saastostore.ts`, créalo (`.js` si mi proyecto no usa TypeScript); si ya existe, añade solo lo que falte:
- `isInApp()`: devuelve `typeof window !== "undefined" && navigator.userAgent.includes("SaasToStoreApp")`.
- `bridge()`: devuelve `typeof window !== "undefined" ? window.saastostore : undefined`. No leas nunca `window.saastostore` durante el renderizado en el servidor.
- el tipo TypeScript de `window.saastostore` (opcional), con este miembro opcional:
`haptics?: { impact(o?: { style?: "light" | "medium" | "heavy" }): Promise<{ ok: boolean; error?: string } | null>; notification(o?: { type?: "success" | "warning" | "error" }): Promise<{ ok: boolean; error?: string } | null>; selection(): Promise<{ ok: boolean; error?: string } | null> }`
2. En el mismo archivo, añade tres funciones que no hacen nada fuera de la app y nunca esperan el resultado:
- `tapFeedback()`: llama a `bridge()?.haptics?.impact({ style: "light" })`.
- `successFeedback()`: llama a `bridge()?.haptics?.notification({ type: "success" })`.
- `errorFeedback()`: llama a `bridge()?.haptics?.notification({ type: "error" })`.
Sus promesas nunca se rechazan. Ignora un resultado con `ok: false` (por ejemplo `not_available` en un teléfono que no puede vibrar): nunca se lo muestres a la persona.
3. Llama a `tapFeedback()` al tocar [MIS BOTONES PRINCIPALES], a `successFeedback()` cuando [UN FORMULARIO, POR EJEMPLO EL PAGO] sale bien y a `errorFeedback()` cuando falla.
4. No hagas vibrar al desplazarse, con cada tecla pulsada ni varias veces seguidas.Sustituye los valores entre [CORCHETES] antes de pegarlo. Añade el plugin en tu proyecto y lanza un nuevo build.
Escáner de códigos QR
Un botón Escanear que lee un código QR o de barras con la cámara: una entrada, un producto, un enlace. En Android, el lector es el de Google (servicios de Google Play) y tu app no pide permiso de cámara; los teléfonos sin servicios de Google Play, como Amazon Fire y Huawei, no lo tienen. En iOS, la app abre su propio lector y pide la cámara la primera vez. Pruébalo con un código real en un teléfono real antes de publicar.
Prompt · escáner de códigos QR
Añade un escáner de códigos QR a mi proyecto, con el puente de app de SaasToStore.
Contexto: mi sitio también funciona dentro de una app móvil nativa creada con SaasToStore. Dentro de esa app, `window.saastostore.barcode` abre el lector de códigos del teléfono. En un navegador normal, y en la vista previa del editor, no existe, y el sitio debe seguir funcionando exactamente como hoy. No cambies nada más.
1. Si mi proyecto aún no tiene `src/lib/saastostore.ts`, créalo (`.js` si mi proyecto no usa TypeScript); si ya existe, añade solo lo que falte:
- `isInApp()`: devuelve `typeof window !== "undefined" && navigator.userAgent.includes("SaasToStoreApp")`.
- `bridge()`: devuelve `typeof window !== "undefined" ? window.saastostore : undefined`. No leas nunca `window.saastostore` durante el renderizado en el servidor.
- el tipo TypeScript de `window.saastostore` (opcional), con este miembro opcional:
`barcode?: { isAvailable(): Promise<{ available: boolean; reason?: string } | null>; scan(o?: { formats?: string[]; prompt?: string }): Promise<{ scanned: true; value: string; format: string } | { scanned: false; error: string } | null> }`
2. En [LA PÁGINA DONDE SE ESCANEA], muestra un botón «Escanear un código» solo si `isInApp()` es true y `bridge()?.barcode?.isAvailable()` responde `available: true`. Si no, deja la página como está hoy (por ejemplo un campo para escribir el código).
3. Al tocar el botón, llama a `bridge().barcode.scan({ formats: ["qr"], prompt: "[TEXTO SOBRE EL VISOR, 200 CARACTERES MÁX.]" })`. Su promesa nunca se rechaza:
- `scanned: true`: usa `value` para [QUÉ HACER CON EL CÓDIGO, POR EJEMPLO ABRIR LA ENTRADA].
- `error: "cancelled"`: no hagas nada, la persona cerró el lector.
- `error: "not_allowed"` (iOS, cámara rechazada): explica que la cámara se puede permitir en los ajustes del teléfono.
- cualquier otro error: muestra un mensaje corto.
4. `value` es texto de origen desconocido: compruébalo antes de usarlo, no lo insertes nunca en la página como HTML y no lo abras nunca como enlace sin comprobar que apunta a [MI DOMINIO].Sustituye los valores entre [CORCHETES] antes de pegarlo. Añade el plugin en tu proyecto y lanza un nuevo build.
Notificaciones locales (recordatorios)
Un botón Recuérdamelo que programa una notificación en el teléfono, mostrada a la hora elegida aunque la app esté cerrada: una cita, una sesión que empieza, un carrito abandonado. No interviene ningún servidor: no es push y no llega a todos tus usuarios a la vez. Android muestra el recordatorio con unos minutos de margen; iOS es puntual. Los recordatorios sobreviven a un reinicio del teléfono. Límites: 64 recordatorios pendientes, hasta 366 días de antelación.
Prompt · notificaciones locales
Añade recordatorios (notificaciones locales) a mi proyecto, con el puente de app de SaasToStore.
Contexto: mi sitio también funciona dentro de una app móvil nativa creada con SaasToStore. Dentro de esa app, `window.saastostore.localNotifications` programa notificaciones en el propio teléfono, sin servidor. En un navegador normal, y en la vista previa del editor, no existe, y el sitio debe seguir funcionando exactamente como hoy. No cambies nada más.
1. Si mi proyecto aún no tiene `src/lib/saastostore.ts`, créalo (`.js` si mi proyecto no usa TypeScript); si ya existe, añade solo lo que falte:
- `isInApp()`: devuelve `typeof window !== "undefined" && navigator.userAgent.includes("SaasToStoreApp")`.
- `bridge()`: devuelve `typeof window !== "undefined" ? window.saastostore : undefined`. No leas nunca `window.saastostore` durante el renderizado en el servidor.
- el tipo TypeScript de `window.saastostore` (opcional), con este miembro opcional:
`localNotifications?: { requestPermission(): Promise<{ granted: boolean; status: "granted" | "denied" | "prompt"; error?: string } | null>; schedule(o: { id?: number; title: string; body?: string; at?: number | string; in?: number; data?: object }): Promise<{ scheduled: true; id: number; at: number } | { scheduled: false; error: string; status?: string } | null>; cancel(o: { id: number }): Promise<{ ok: boolean; error?: string } | null>; getLastOpened(): Promise<{ notification: { id: number; title: string; body: string; at: number; data: object } | null } | null> }`
2. En [EL ELEMENTO QUE MERECE UN RECORDATORIO, POR EJEMPLO UNA RESERVA], muestra un botón «Recuérdamelo» solo si `isInApp()` es true y `bridge()?.localNotifications` existe.
3. Al tocar el botón (nunca al cargar la página):
- llama primero a `bridge().localNotifications.requestPermission()`. Si `granted` es false, explica que las notificaciones se pueden permitir en los ajustes del teléfono, y detente.
- después llama a `bridge().localNotifications.schedule({ id: [UN NÚMERO PROPIO DE ESTE ELEMENTO], title: [TÍTULO, 200 CARACTERES MÁX.], body: [TEXTO CORTO], at: [LA HORA, EN MILISEGUNDOS O date.toISOString()], data: { [EL ID DEL ELEMENTO] } })`. Muestra «Recordatorio programado» cuando `scheduled` es true, y un mensaje corto si no.
Estas promesas nunca se rechazan.
4. Cuando la persona toque la notificación, abre [LA PÁGINA DEL ELEMENTO] con el id que viene en `data`:
- escucha `window.addEventListener("s2s:localNotifications", (e) => …)` y actúa cuando `e.detail.type === "tap"`, con `e.detail.data`;
- llama también una vez a `bridge()?.localNotifications?.getLastOpened()` al iniciar la app: si la app estaba cerrada, el evento salió antes de que la página escuchara. Devuelve `{ notification }` una vez y luego `{ notification: null }`.
5. Cuando el elemento se cancele o el recordatorio ya no sirva, llama a `bridge()?.localNotifications?.cancel({ id })`.Sustituye los valores entre [CORCHETES] antes de pegarlo. Añade el plugin en tu proyecto y lanza un nuevo build.
Comprueba el resultado
- En un navegador normal: la página se ve y funciona como antes, sin ningún botón que no haga nada.
- En tu app, construida después de añadir el plugin: el botón aparece y hace su trabajo.
- Cierra el menú de compartir o el escáner sin elegir nada: no aparece ningún mensaje de error.
- Rechaza una vez el permiso (notificaciones; cámara en iOS): la página dice qué hacer en lugar de fallar en silencio.
Preguntas frecuentes
¿El mismo prompt funciona en Lovable, Bolt y Base44?+
Sí. Cada prompt describe el cambio, no una herramienta: el mismo texto funciona en el chat de Lovable, Bolt y Base44, y en otras herramientas de IA que editan el código de tu sitio. La IA elige los nombres de archivo adecuados para tu proyecto.
¿Por qué no pasa nada en la vista previa del editor?+
La vista previa muestra tu sitio en un marco del editor. Los plugins solo funcionan en el marco principal de tu app, nunca en un marco ni en un navegador: ahí window.saastostore no existe. Los prompts mantienen tu sitio funcionando sin él. Para probar una función, publica tu sitio y abre tu app en un teléfono.
¿Necesito un nuevo build después de pegar un prompt?+
Solo para añadir el plugin. Los plugins se escriben en la app al construirla: añade el plugin en la biblioteca de plugins de tu proyecto y lanza un nuevo build. Después, un cambio que publicas en tu sitio llega a la app sin un nuevo build, porque la app carga tu sitio publicado.
¿Estos plugins están incluidos en mi plan?+
Los plugins estándar están incluidos en los planes de pago, sin licencia por plugin: añade tantos como tu app necesite. El build de prueba gratuito (Android, con el logo de SaasToStore) muestra tu sitio como app, sin plugins.
¿Mi app pedirá nuevos permisos?+
Compartir y la respuesta háptica no piden nada. El escáner de QR pide la cámara en iOS, la primera vez que escanea; en Android usa el lector de Google y no pide nada. Las notificaciones locales piden permiso en Android 13 y posteriores y en iOS, cuando tu sitio llama a requestPermission() desde un botón.
¿Puedo enviar una notificación a todos mis usuarios?+
No con estos prompts. Una notificación local la programa tu página en un solo teléfono, sin servidor. Un mensaje enviado desde tu servidor a tus usuarios es push, otro plugin.
Guías relacionadas
Añade la función a tu app
Pega la URL de tu sitio, añade los plugins en tu proyecto y lanza el build. Tu sitio sigue funcionando en el navegador.
Crear mi app