Dealt can be resumed as a service marketplace, on one side you have Customers that are looking for services and on the other side you have Experts that are ready to give services.
However there are three main differences with a traditionnal marketplace :
• Dealt is responsible for experts recruitment
• Your customers are automatically matched with the best experts available in their area
Here are the terms we're using through our services and guides, if everything is not crystal clear yet then this should help!
An expert is an individual or a company that is registered to our platform.
• They have to go through a complete and extensive qualification process.
• They are notified whenever they are selected by our matchmaking algorithm and have then to accept or the decline the offer.
A customer is... a customer 🙃
They will never be contacted by our services for marketing purposes, if fact, they don't even have proper "user account" on our side
• They will receive a tracking link as soon as they submit a mission
• If they need, our customer service is available via chat or phone to answer their questions and solve all of their problems
An offer is the equivalent of a product on a traditional product marketplace
• They are tailor made to your needs and are defined by our team
• The price will be defined by our team so it stay fair for everyone
A mission could be seen as an order on a classic e-commerce platform
• They have a price, a status, an adress...
• They have a dedicated tracking number that your customers will receive by text so they will be able to easily talk with their designated expert or contact our support
• They can be canceled using our API
Easy as cake
One production endoint
https://api.monsupervoisin.fr/graphql
One test endoint
https://api.test.monsupervoisin.fr/graphql
You should also be provided with two API Keys, one for each environement, they should remain private, so make sure to keep them safe :)
Also note that those API are server sides only and should not be called directly by your clients browsers
📣 INFO
Pro tip: by visiting those API endpoints with a web browser you will by able to live try our services using the integrated playground!
The easiest way to get stated is by exploring our guide to integrate Dealt.
Alternatively, our API server following GraphQL standards, you can explore the live documentation using GraphQL Playground
📣 INFO
Make sure to read and follow the Getting Started instructions first so you we'll be able to gasp the core principles of this service and get required details such as API Keys and service endpoints
1. You query our API to check for service availability and net service price
2. Based on the provided service price you apply your own margin before presenting the service to your customer
3. You charge your customer for the service and call our API to purchase the service and submit a mission
4. We charge you the service price and your customer is matched with our best available expert in his area and receive a tracking link
5. as well as a voucher code via SMS
6. Our expert call your customer to arrange a rendez-vous
7. On the arranged date our expert provide the service to your customer
8. Your customer provide the voucher code to our expert
You'll probably want to display Offer to your visitors directly on products pages.
To do so, we suggest you to add optionnal fields, such as msv_offer_id, to your products so you'll be able to promote the offer directly on product pages.
Since availability and price informations depends on geographic location, if you want to display them to your visitors, you'll need to ask them for at bare minimum a zip code so you can query our services and retrive the informations.
Fortunately this is quite easy, we suggest you to integrate a zip code input calling our services on submit
Here are code exemples that should allow you to do so, make sure to replace placeholders values with the appropriate ones
PHP Using Guzzle
$query = <<<GQL query OfferAvailability($offerId: UUID!, $zipCode: String!, $apiKey: String!) { offerAvailability( offerId: $offerId address: { zipCode: $zipCode } apiKey: $apiKey ) { __typename ... on OfferAvailabilityQuery_Success { available netPrice { amount currency } } ... on OfferAvailabilityQuery_Failure { reason } } } GQL; $variables = [ 'offerId' => __OFFER_ID__, 'zipCode' => __VISITOR_ZIPCODE__, 'apiKey' => __API_KEY__ ] $client = new \GuzzleHttp\Client(); $response = $client->request( 'POST', 'https://api.test.monsupervoisin.fr/graphql', [ 'json' => [ 'query' => $query, 'variables' => $variables ] ] ); $json = $response->getBody()->getContents(); $body = json_decode($json); $data = $body->data; if ($data->offerAvailability->__typename == 'OfferAvailabilityQuery_Failure') { // handle failure here throw new Exception('OfferAvailabilityQuery_Failure: {$data->offerAvailability->reason}'); } if ($data->offerAvailability->available == false) { echo 'The offer is not available' } else { echo 'The offer is available and is priced at {$data->offerAvailability->netPrice->amount} excluding VAT' }
Raw GraphQL
query OfferAvailability($offerId: UUID!, $zipCode: String!, $apiKey: String!) { offerAvailability( offerId: $offerId address: { zipCode: $zipCode } apiKey: $apiKey ) { __typename ... on OfferAvailabilityQuery_Success { available netPrice { amount currency } } ... on OfferAvailabilityQuery_Failure { reason } } }
📣 INFOS
Since zip code are not as precise as full addresses, an offer that might be marked as available for a zip code might not be available when providing the full address.
Make sure to check the offer availability during checkout once the user provided it's full address
After collecting the customer address you can call our API to check if the offer is available in their area and if it is display it to your customer
Here are code exemples that should allow you to do so, make sure to replace placeholders values with the appropriate ones
PHP Using Guzzle
$query = <<<GQL query OfferAvailability( $apiKey: String! $offerId: UUID! $address: OfferAvailabilityQuery_AddressInput! ) { offerAvailability(offerId: $offerId, address: $address, apiKey: $apiKey) { __typename ... on OfferAvailabilityQuery_Success { available netPrice { amount currency } vat { amount currency } grossPrice { amount currency } } ... on OfferAvailabilityQuery_Failure { reason } } } GQL; $variables = [ 'offerId' => __OFFER_ID__, 'zipCode' => __VISITOR_ZIPCODE__, 'apiKey' => __API_KEY__ ] $client = new \GuzzleHttp\Client(); $response = $client->request( 'POST', 'https://api.test.monsupervoisin.fr/graphql', [ 'json' => [ 'query' => $query, 'variables' => $variables ] ] ); $json = $response->getBody()->getContents(); $body = json_decode($json); $data = $body->data; if ($data->offerAvailability->__typename == 'OfferAvailabilityQuery_Failure') { // handle failure here throw new Exception('OfferAvailabilityQuery_Failure: {$data->offerAvailability->reason}'); } if ($data->offerAvailability->available == false) { echo 'The offer is not available' } else { echo 'The offer is available and is priced at {$data->offerAvailability->grossPrice->amount} including VAT' }
Raw GraphQL
query OfferAvailability( $apiKey: String! $offerId: UUID! $address: OfferAvailabilityQuery_AddressInput! ) { offerAvailability(offerId: $offerId, address: $address, apiKey: $apiKey) { __typename ... on OfferAvailabilityQuery_Success { available netPrice { amount currency } vat { amount currency } grossPrice { amount currency } } ... on OfferAvailabilityQuery_Failure { reason } } }
📣 INFOS
This is the price that you will be charged, they are provided excluding VAT with the netPrice value and including VAT with the grossPrice value, make sure to pick the right one depending on your needs
Finaly, after checkout, if the customer choose and paid for our services, simply call our API to submit the Mission, you customer should then quickly receive a text message with a tracking link and a voucher code You might want to store your customer mission id so you'll be able to provide your customers a tracking link or to programatically cancel missions in case of order cancelation for exemple.
PHP Using Guzzle
$query = <<<GQL mutation SubmitMission( $apiKey: String! $offerId: UUID! $customer: SubmitMissionMutation_CustomerInput! $address: SubmitMissionMutation_AddressInput! ) { submitMission( offerId: $offerId customer: $customer apiKey: $apiKey address: $address ) { __typename ... on SubmitMissionMutation_Success { mission { id } } ... on SubmitMissionMutation_Failure { reason } } } GQL; $extraDetails = <<MD ### [Fiche thechnique du produit a installer](https://user-guide.com) ### Date de livraison éstimée: 14 Décembre 2024 ### Outils requis - Perceuse - Marteau - Niveau MD; $variables = [ 'offerId' => __OFFER_ID__, 'address' => [ 'line1' => __CUSTOMER_ADRESSS_LINE1__, 'zipCode' => __CUSTOMER_ZIPCODE__, 'city' => __CUSTOMER_CITY__, ] 'customer' => [ 'emailAddress' => __CUSTOMER_EMAIL_ADDRESS__, 'firstName' => __CUSTOMER_EMAIL_ADDRESS__, 'lastName' => __CUSTOMER_EMAIL_ADDRESS__, 'phoneNumber' => __CUSTOMER_PHONE_NUMBER__, ] 'extraDetails' => extraDetails, 'apiKey' => __API_KEY__ ] $client = new \GuzzleHttp\Client(); $response = $client->request( 'POST', 'https://api.test.monsupervoisin.fr/graphql', [ 'json' => [ 'query' => $query, 'variables' => $variables ] ] ); $json = $response->getBody()->getContents(); $body = json_decode($json); $data = $body->data; if ($data->submitMission->__typename == 'SubmitMissionMutation_Failure') { // handle failure here throw new Exception('SubmitMissionMutation_Failure: {$data->submitMission->reason}'); } echo 'The mission id is {$data->submitMission->mission->id}'
Raw GraphQL
mutation SubmitMission( $apiKey: String! $offerId: UUID! $customer: SubmitMissionMutation_CustomerInput! $address: SubmitMissionMutation_AddressInput! ) { submitMission( offerId: $offerId customer: $customer apiKey: $apiKey address: $address ) { __typename ... on SubmitMissionMutation_Success { mission { id } } ... on SubmitMissionMutation_Failure { reason } } }
📣 INFOS
Please note the extraDetails field, it will be formated using markdown and displayed to our experts
It's optionnal but we highly recommend you to provide as much information as possible about the job to be done such as product tech specs, delivery estmations...
You can even add an extra input in your checkout flow so your customers could provide even more informations
As almost any e-commerce website, you probably have to deal with order cancelation
To keep a clear track of ongoing missions, and to help our experts known, when an order is canceled we highly suggest you to also cancel the linked mission
PHP Using Guzzle
$query = <<<GQL mutation CancelMission( $apiKey: String! $missionId: UUID! ) { cancelMission( apiKey: $apiKey missionId: $missionId ) { __typename ... on CancelMissionMutation_Success { mission { id } } ... on CancelMissionMutation_Failure { reason } } } GQL; $variables = [ 'apiKey' => __API_KEY__, 'missionId' => __MISSION_ID__ ] $client = new \GuzzleHttp\Client(); $response = $client->request( 'POST', 'https://api.test.monsupervoisin.fr/graphql', [ 'json' => [ 'query' => $query, 'variables' => $variables ] ] ); $json = $response->getBody()->getContents(); $body = json_decode($json); $data = $body->data; if ($data->cancelMission->__typename == 'CancelMissionMutation_Failure') { // handle failure here throw new Exception('CancelMissionMutation_Failure: {$data->cancelMission->reason}'); } echo 'Successfully canceled mission {$data->submitMission->mission->id}'
Raw GraphQL
mutation CancelMission($apiKey: String!, $missionId: UUID!) { cancelMission(apiKey: $apiKey, missionId: $missionId) { __typename ... on CancelMissionMutation_Success { mission { id } } ... on CancelMissionMutation_Failure { reason } } }
1. You redirect your user to our marketplace
2. Your user reserve his service through our marketplace choosing to pay online on our platform or directly in person to our expert
3. Our expert call your customer to arrange a rendez-vous
4. On the arranged date our expert provide the service to your user
Simply redirect your user to the following link https://[retailer-slug].monsupervoisin.fr/offer-selection-funnel/[store-slug]/[point-of-sale-slug]
You can also optionnaly provide us your user post code and redirect him to https://[retailer-slug].monsupervoisin.fr/offer-selection-funnel/[store-slug]/[point-of-sale-slug]?post_code=[customer-post-code]