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.
The Public Cancellation API lets you add self-service order cancellation anywhere—post-purchase emails, support pages, chatbots, or custom forms. No app embed required.
Why use the Cancellation API
Cancellation Anywhere Add cancel buttons to emails, FAQ pages, chatbot flows, or any custom interface outside your store.
No App Embed Needed Works independently of the Revize customer portal. Just call the API endpoint.
Your Rules Apply The API respects your cancellation time windows and eligibility rules automatically.
Simple Integration One endpoint, simple request format. Easy to integrate with any system or platform.
API endpoint
POST https://revize.untechnickle.com/api/public/v1/{shop-domain-slug}/cancel_order
Parameters:
shop-domain-slug — Your Shopify store’s domain without .myshopify.com (e.g., my-store from my-store.myshopify.com)
{
"order_number" : "#2667" ,
"email" : "customer@example.com"
}
Field Type Required Description order_numberstring Yes The order number including the # symbol emailstring Yes Customer’s email address used for the order
Response codes
The API returns a status field indicating the result:
Status Description SUCCESSOrder cancelled successfully ORDER_NOT_FOUNDOrder doesn’t exist or email doesn’t match NOT_CANCELLABLEOrder cannot be cancelled (policy restrictions) ORDER_FULFILLEDOrder already fulfilled, cannot cancel NOT_EDITABLEOrder is locked for editing CANCEL_DISABLEDCancellation feature not enabled for this store APP_INACTIVERevize app is not active SHOP_NOT_FOUNDShop not found in system DOMAIN_MISSINGShop domain slug missing from request FAILEDGeneral operation failure
Example integration
Here’s a JavaScript example for calling the 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' };
}
}
Shopify theme section
Add a cancellation form to any page in your Shopify theme. This ready-to-use section handles all API calls and displays appropriate messages.
Complete Shopify Section Code
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 : 1200 px ;
margin : 0 auto ;
padding : 0 20 px ;
}
.order-cancel-form {
max-width : {{ section . settings . form_width }} px;
margin : 0 auto ;
padding : {{ section . settings . form_padding }} px;
border : 1 px solid {{ section . settings . border_color }} ;
border-radius : {{ section . settings . border_radius }} px;
background : {{ section . settings . form_background }} ;
}
.order-cancel-form h2 {
margin-bottom : 10 px ;
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 : 24 px ;
color : {{ section . settings . description_color }} ;
text-align : {{ section . settings . text_align }} ;
}
.form-group {
margin-bottom : 20 px ;
text-align : left ;
}
.form-group label {
display : block ;
margin-bottom : 8 px ;
font-weight : 600 ;
font-size : 14 px ;
}
.form-group input {
width : 100 % ;
padding : 12 px ;
border : 1 px solid {{ section . settings . input_border_color }} ;
border-radius : 4 px ;
font-size : 14 px ;
box-sizing : border-box ;
}
.form-group small {
display : block ;
margin-top : 4 px ;
color : #666 ;
font-size : 12 px ;
}
button {
width : 100 % ;
padding : 14 px ;
background : {{ section . settings . button_background }} ;
color : {{ section . settings . button_text_color }} ;
border : none ;
border-radius : 4 px ;
font-size : 16 px ;
font-weight : 600 ;
cursor : pointer ;
}
button :disabled {
opacity : 0.5 ;
cursor : not-allowed ;
}
#message {
margin-top : 20 px ;
padding : 12 px ;
border-radius : 4 px ;
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 %}
Common use cases
Support Pages
Post-Purchase Emails
Chatbots
Self-service cancellation on FAQ/Help pages Add the cancellation form to your support or FAQ pages so customers can cancel orders without contacting support.
Reduces support tickets
24/7 availability
Instant processing
Cancel button in order confirmation emails Add a “Cancel Order” link in your transactional emails that opens a cancellation page on your store.
Convenient for customers
Catches impulse cancel requests early
Reduces “how do I cancel?” inquiries
Automated cancellation via chat Integrate the API with chatbots (Gorgias, Zendesk, etc.) to handle cancellation requests automatically.
Instant response
No agent involvement needed
Works 24/7
Setup requirements
The Public Cancellation API is an advanced feature that requires enablement by our team.
Configure refund settings
Set your refund method in Payments & Refunds —original payment method or store credit.
Get your integration details
We’ll provide your shop domain slug and any custom configuration needed for your use case.
Test with draft orders
Create test orders to verify the API works correctly before going live.
This feature is available on Pro plans. Contact us for pricing and setup assistance.
Frequently asked questions
Does the API respect my cancellation rules?
Yes. The API automatically applies your edit window settings, order restrictions, and refund policies. Orders outside the edit window or with blocking tags cannot be cancelled via API.
How are refunds processed?
Refunds are processed according to your Revize payment settings—either to the original payment method or as store credit, exactly like cancellations through the customer portal.
Can I use this for third-party integrations?
Absolutely. The API is designed for external integrations—chatbots, email service providers, custom apps, or any system that can make HTTP requests.
Is authentication required?
The API uses order number + email verification for security. No API keys are required, making integration simple while ensuring only order owners can cancel.
The Public Cancellation API extends self-service cancellation beyond the Revize portal. Use it to meet customers wherever they are—emails, support pages, or chatbots.