Saltar al contenido principal

Documentation Index

Fetch the complete documentation index at: https://docs.revize.app/llms.txt

Use this file to discover all available pages before exploring further.

La API pública de cancelación te permite agregar cancelación de pedidos en autoservicio en cualquier lugar: correos posteriores a la compra, páginas de soporte, chatbots o formularios personalizados. No se requiere app embed.

Por qué usar la API de cancelación

Cancelación en cualquier lugar

Agrega botones de cancelación a correos, páginas de FAQ, flujos de chatbot o cualquier interfaz personalizada fuera de tu tienda.

Sin necesidad de app embed

Funciona independientemente del portal del cliente de Revize. Solo llama al endpoint de la API.

Tus reglas se aplican

La API respeta automáticamente tus ventanas de tiempo de cancelación y reglas de elegibilidad.

Integración simple

Un endpoint, formato de solicitud simple. Fácil de integrar con cualquier sistema o plataforma.

Endpoint de la API

POST https://revize.untechnickle.com/api/public/v1/{shop-domain-slug}/cancel_order
Parámetros:
  • shop-domain-slug — El dominio de tu tienda Shopify sin .myshopify.com (p. ej., my-store de my-store.myshopify.com)

Formato de solicitud

{
  "order_number": "#2667",
  "email": "customer@example.com"
}
CampoTipoRequeridoDescripción
order_numberstringEl número de pedido incluyendo el símbolo #
emailstringDirección de correo del cliente usada para el pedido

Códigos de respuesta

La API devuelve un campo status indicando el resultado:
EstadoDescripción
SUCCESSPedido cancelado exitosamente
ORDER_NOT_FOUNDEl pedido no existe o el correo no coincide
NOT_CANCELLABLEEl pedido no puede cancelarse (restricciones de política)
ORDER_FULFILLEDEl pedido ya fue cumplido, no puede cancelarse
NOT_EDITABLEEl pedido está bloqueado para edición
CANCEL_DISABLEDLa función de cancelación no está habilitada para esta tienda
APP_INACTIVELa app Revize no está activa
SHOP_NOT_FOUNDTienda no encontrada en el sistema
DOMAIN_MISSINGFalta el slug del dominio de la tienda en la solicitud
FAILEDError general de operación

Ejemplo de integración

Aquí tienes un ejemplo de JavaScript para llamar a la API:
async function cancelOrder(orderNumber, email) {
  const shopDomain = 'your-store'; // Without .myshopify.com
  const apiUrl = 'https://revize.untechnickle.com';
  
  try {
    const response = await fetch(
      `${apiUrl}/api/public/v1/${shopDomain}/cancel_order`,
      {
        method: 'POST',
        headers: {
          'Content-Type': 'application/json',
          'Accept': 'application/json'
        },
        body: JSON.stringify({
          order_number: orderNumber,
          email: email
        })
      }
    );
    
    const result = await response.json();
    
    if (result.success === true || result.status === 'SUCCESS') {
      console.log('Order cancelled successfully');
      return { success: true };
    } else {
      console.log('Cancellation failed:', result.status);
      return { success: false, status: result.status };
    }
  } catch (error) {
    console.error('Error:', error);
    return { success: false, status: 'FAILED' };
  }
}

Sección de tema de Shopify

Agrega un formulario de cancelación a cualquier página en tu tema de Shopify. Esta sección lista para usar maneja todas las llamadas a la API y muestra mensajes apropiados.
order-cancellation-form.liquid
<div class="order-cancel-section">
  <div class="order-cancel-container">
    <div class="order-cancel-form">
      {% if section.settings.show_heading %}
        <h2>{{ section.settings.heading }}</h2>
      {% endif %}
      
      {% if section.settings.show_description %}
        <p class="form-description">{{ section.settings.description }}</p>
      {% endif %}
      
      <form id="cancelOrderForm">
        <div class="form-group">
          <label for="orderNumber">{{ section.settings.order_label }}</label>
          <input 
            type="text" 
            id="orderNumber" 
            name="orderNumber" 
            required
            placeholder="{{ section.settings.order_placeholder }}"
          >
          <small>{{ section.settings.order_help_text }}</small>
        </div>
        
        <div class="form-group">
          <label for="email">{{ section.settings.email_label }}</label>
          <input 
            type="email" 
            id="email" 
            name="email" 
            required
            placeholder="{{ section.settings.email_placeholder }}"
          >
        </div>
        
        <button type="submit" id="submitBtn">{{ section.settings.button_text }}</button>
        <div id="message"></div>
      </form>
    </div>
  </div>
</div>

<script>
document.getElementById('cancelOrderForm').addEventListener('submit', async (e) => {
  e.preventDefault();
  
  const submitBtn = document.getElementById('submitBtn');
  const messageDiv = document.getElementById('message');
  
  submitBtn.disabled = true;
  submitBtn.textContent = 'Processing...';
  messageDiv.textContent = '';
  messageDiv.className = '';
  
  const orderNumber = document.getElementById('orderNumber').value.trim();
  const email = document.getElementById('email').value.trim();
  
  const shopDomain = {{ shop.permanent_domain | json }};
  const domainSlug = shopDomain.replace('.myshopify.com', '');
  const apiUrl = {{ section.settings.api_url | json }};
  
  const statusMessages = {
    'SUCCESS': {{ section.settings.msg_success | json }},
    'ORDER_NOT_FOUND': {{ section.settings.msg_order_not_found | json }},
    'NOT_CANCELLABLE': {{ section.settings.msg_not_cancellable | json }},
    'ORDER_FULFILLED': {{ section.settings.msg_order_fulfilled | json }},
    'NOT_EDITABLE': {{ section.settings.msg_not_editable | json }},
    'CANCEL_DISABLED': {{ section.settings.msg_cancel_disabled | json }},
    'APP_INACTIVE': {{ section.settings.msg_app_inactive | json }},
    'FAILED': {{ section.settings.msg_failed | json }}
  };
  
  const buttonText = {{ section.settings.button_text | json }};
  
  try {
    const response = await fetch(`${apiUrl}/api/public/v1/${domainSlug}/cancel_order`, {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
        'Accept': 'application/json'
      },
      body: JSON.stringify({
        order_number: orderNumber,
        email: email
      })
    });
    
    const result = await response.json();
    
    if (result.success === true || result.status === 'SUCCESS') {
      messageDiv.className = 'success';
      messageDiv.textContent = statusMessages['SUCCESS'];
      document.getElementById('cancelOrderForm').reset();
    } else {
      messageDiv.className = 'error';
      messageDiv.textContent = statusMessages[result.status] || statusMessages['FAILED'];
    }
    
  } catch (error) {
    console.error('Error:', error);
    messageDiv.className = 'error';
    messageDiv.textContent = statusMessages['FAILED'];
  } finally {
    submitBtn.disabled = false;
    submitBtn.textContent = buttonText;
  }
});
</script>

<style>
.order-cancel-section {
  padding: {{ section.settings.section_padding_top }}px 0 {{ section.settings.section_padding_bottom }}px;
  background: {{ section.settings.background_color }};
}

.order-cancel-container {
  max-width: 1200px;
  margin: 0 auto;
  padding: 0 20px;
}

.order-cancel-form {
  max-width: {{ section.settings.form_width }}px;
  margin: 0 auto;
  padding: {{ section.settings.form_padding }}px;
  border: 1px solid {{ section.settings.border_color }};
  border-radius: {{ section.settings.border_radius }}px;
  background: {{ section.settings.form_background }};
}

.order-cancel-form h2 {
  margin-bottom: 10px;
  font-size: {{ section.settings.heading_size }}px;
  color: {{ section.settings.heading_color }};
  text-align: {{ section.settings.text_align }};
}

.order-cancel-form .form-description {
  margin-bottom: 24px;
  color: {{ section.settings.description_color }};
  text-align: {{ section.settings.text_align }};
}

.form-group {
  margin-bottom: 20px;
  text-align: left;
}

.form-group label {
  display: block;
  margin-bottom: 8px;
  font-weight: 600;
  font-size: 14px;
}

.form-group input {
  width: 100%;
  padding: 12px;
  border: 1px solid {{ section.settings.input_border_color }};
  border-radius: 4px;
  font-size: 14px;
  box-sizing: border-box;
}

.form-group small {
  display: block;
  margin-top: 4px;
  color: #666;
  font-size: 12px;
}

button {
  width: 100%;
  padding: 14px;
  background: {{ section.settings.button_background }};
  color: {{ section.settings.button_text_color }};
  border: none;
  border-radius: 4px;
  font-size: 16px;
  font-weight: 600;
  cursor: pointer;
}

button:disabled {
  opacity: 0.5;
  cursor: not-allowed;
}

#message {
  margin-top: 20px;
  padding: 12px;
  border-radius: 4px;
  text-align: center;
}

#message.success {
  background: #d4edda;
  color: #155724;
}

#message.error {
  background: #f8d7da;
  color: #721c24;
}
</style>

{% schema %}
{
  "name": "Order Cancellation Form",
  "settings": [
    {
      "type": "text",
      "id": "api_url",
      "label": "API URL",
      "default": "https://revize.untechnickle.com"
    },
    {
      "type": "text",
      "id": "heading",
      "label": "Heading",
      "default": "Cancel Your Order"
    },
    {
      "type": "textarea",
      "id": "description",
      "label": "Description",
      "default": "Enter your order number and email to cancel your order"
    },
    {
      "type": "text",
      "id": "button_text",
      "label": "Button Text",
      "default": "Cancel Order"
    },
    {
      "type": "textarea",
      "id": "msg_success",
      "label": "Success Message",
      "default": "Your order has been cancelled successfully!"
    },
    {
      "type": "textarea",
      "id": "msg_order_not_found",
      "label": "Order Not Found",
      "default": "We couldn't find an order with that number and email."
    },
    {
      "type": "textarea",
      "id": "msg_not_cancellable",
      "label": "Not Cancellable",
      "default": "This order cannot be cancelled due to our cancellation policy."
    },
    {
      "type": "textarea",
      "id": "msg_order_fulfilled",
      "label": "Order Fulfilled",
      "default": "This order has already been fulfilled and cannot be cancelled."
    },
    {
      "type": "textarea",
      "id": "msg_failed",
      "label": "General Error",
      "default": "Unable to process your request. Please try again."
    }
  ],
  "presets": [{ "name": "Order Cancellation Form" }]
}
{% endschema %}

Casos de uso comunes

Cancelación en autoservicio en páginas de FAQ/AyudaAgrega el formulario de cancelación a tus páginas de soporte o FAQ para que los clientes puedan cancelar pedidos sin contactar a soporte.
  • Reduce los tickets de soporte
  • Disponibilidad 24/7
  • Procesamiento instantáneo

Requisitos de configuración

La API pública de cancelación es una función avanzada que requiere habilitación por parte de nuestro equipo.
1

Contáctanos para habilitar

Contacta a nuestro equipo para habilitar la API pública de cancelación para tu tienda.
2

Configurar ajustes de reembolso

Establece tu método de reembolso en Pagos & Reembolsos: método de pago original o crédito de tienda.
3

Obtén tus detalles de integración

Te proporcionaremos tu slug de dominio de tienda y cualquier configuración personalizada necesaria para tu caso de uso.
4

Prueba con pedidos borrador

Crea pedidos de prueba para verificar que la API funcione correctamente antes de salir en vivo.
Esta función está disponible en los planes Pro. Contáctanos para precios y asistencia de configuración.

Preguntas frecuentes

Sí. La API aplica automáticamente la configuración de tu ventana de edición, las restricciones de pedido y las políticas de reembolso. Los pedidos fuera de la ventana de edición o con etiquetas de bloqueo no se pueden cancelar vía API.
Los reembolsos se procesan según tu configuración de pagos de Revize, ya sea al método de pago original o como crédito de tienda, exactamente como las cancelaciones a través del portal del cliente.
Absolutamente. La API está diseñada para integraciones externas: chatbots, proveedores de servicios de correo, apps personalizadas o cualquier sistema que pueda hacer solicitudes HTTP.
La API usa verificación por número de pedido + correo electrónico para seguridad. No se requieren claves API, lo que hace que la integración sea simple mientras se asegura que solo los propietarios del pedido puedan cancelar.
La API pública de cancelación extiende la cancelación en autoservicio más allá del portal de Revize. Úsala para encontrarte con los clientes donde estén: correos, páginas de soporte o chatbots.

Funciones relacionadas