
ReservPro: Activities & Rental Services
Whether you offer equipment rentals, guided activities, museum ticketing, or hourly services, ReservPro is designed to scale. Our platform allows for comprehensive availability management, per-person or duration pricing, QR ticket validation, and an integrated point of sale.
Hourly or daily rental
Rent equipment or spaces with automated scheduling, inventory, and duration rules.
Pricing by age group
Set your prices by age: adult, student, senior, child. Ideal for museums, spas, and family activities.
Personalized tickets & QR
Offer customizable tickets with name, date, and unique number. Validate at the entrance via mobile device.
Discounts and promotions
Offer discounts based on duration, number of people, days of the week, or activity combos.
Standalone POS station
Manage sales, payments and ticket validation on-site with our Clover and Android terminal-compatible solution.
Multi-services, one tool
Whether you rent kayaks, bikes, offer spas or shows, ReservPro adapts to your reality.
What ReservPro can do for you
-
Flexible pricingPrice depending on duration, type of client, number of people, etc.
-
Tickets and QR validationGenerate digital or printable tickets, scannable at the entrance.
-
Multi-activitiesManage multiple services or activities in a single interface.
-
Payment & BillingIntegrated terminal, printed receipt, accounting export, deposits.
-
Mobile POS & TabletsUse your existing devices as a sales station.
-
Quick assistanceQuebec technical support, human and available.

Assessment of your needs
'+textreturn+'
We're sorry, an error has occurred. Please try again.'+oldai); } equalizeHeight('egualheight'); $('.feature br, .response_buttons br, .getinfos br, #inscript_ai br, #btnoptions br, .getinfo br, .inscript_firststep br').remove(); $('.feature').next('br').remove(); $('.feature').next('br').remove(); $('.reply').next('br').remove(); } function execute_ai_pub(action='assistant_intro') { if($('.assist_aria').is(':visible')) action = 'assistant_aria'; grecaptcha.ready(function() { grecaptcha.execute('6Le8pCUrAAAAAN8VDkvng6dvQX3xl9HZ5lpPRLG6', {action: 'ubmit'}).then(function(token) { // You can now use this token to send it to your server if($('#question_ai').length) { // Example: Add in a hidden field then submit the form let form = document.getElementById('question_ai'); let input = document.createElement('input'); input.type = 'hidden'; input.id = 'g-recaptcha-response'; input.name = 'g-recaptcha-response'; input.value = token; form.appendChild(input); } if($('#question_ai_chat').length) { // Example: Add in a hidden field then submit the form let form = document.getElementById('question_ai_chat'); let input = document.createElement('input'); input.type = 'hidden'; input.id = 'g-recaptcha-response'; input.name = 'g-recaptcha-response'; input.value = token; form.appendChild(input); } execute_ai_final_pub(action); }); }); } function execute_ai_final_pub(action) { jQuery('.usrresponse').attr('placeholder','Your response...'); timreqfirst = new Date(); var aisess = 'evaluation'; //if(lastcode == '1' && first) { log = []; console.log('reset log'); first=false; } if(loading) { jQuery('.loader--text').html('There is already a loading in progress... Please wait'); } else { if($('#env_courriel').length > 0) { lastcode = 4; $('.assist_contact').removeClass('assist_contact'); } var name = ''; var fields = []; var haveinfo = false; if(action == 'assistant_aria') { var reqinfo = '#question_ai_chat .ariablock:last input, #question_ai_chat .ariablock:last textarea, #question_ai_chat .ariablock:last select'; aisess = 'aide'; rep = jQuery('#usrreponse_chat').val(); } else { rep = jQuery('#usrreponse').val(); jQuery('.user_response').show(); var reqinfo = '#question_ai input, #question_ai textarea, #question_ai select'; } $(reqinfo).each(function() { let id = $(this).attr("id"); let value = $(this).val(); let name = $(this).attr("name"); let type = $(this).attr("type"); // If it is an unchecked checkbox → on skip if (type === "checkbox" && !$(this).is(":checked")) { return true; // continue to the next element } if (!id) return true; if (id == 'Candidate name' && value != '') { name = value; } if(id == 'action' && value == 'evaluation') aisess = 'evaluation'; if (value != '') { fields.push({ id: id, value: value, name: name }); candidate' && id != 'g-recaptcha-response') { haveinfo = true; rep += '
' + id + ' : ' + value; } } }); if($('#employee').length > 0) var employee = $('#employee').val(); else var employee = ''; if(haveinfo && name != '') rep += '
Candidate name: '+name; console.log('aisess ' + aisess); console.log('rep ' + rep); jQuery.ajax({ url: '/en/ajax-pub?action='+action+'', type: 'post', data: { action: 'assistant', employee: employee, ai_sess: aisess, log: JSON.stringify(log), dataType: 'json', rep: rep, lastcode: lastcode, fields: JSON.stringify(fields) }, beforeSend: function() { //if(lastcode > 0) timreq = new Date(); log = log.concat({role:'user', content: rep}); loading=true; jQuery('.regen_ai').hide(); if(action == 'assistant_aria') { setTimeout(function() { jQuery('#question_ai_chat.assist_blocks').
' + rep + '
'); $('.assist_blocks').scrollTop($('.assist_blocks')[0].scrollHeight); }, 220); setTimeout(function() { jQuery('#question_ai_chat .assist_blocks').append('Please wait a few moments while I process your request...
Unable to send your message. '+html+ ' Try again?
');
}
}
}
});
}
}