Developer

👉 Introduction

What is this service about ?

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


Lexicon

Here are the terms we're using through our services and guides, if everything is not crystal clear yet then this should help!


Expert

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.


Customer

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


Offer

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


Mission

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


Production and test environments

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


NEXT

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



👉 E-Commerce Integration Guide


How it works


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


How to integrate it


Display offers on products pages


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.

Product page


(Optionnal) Display offers availability and price on products 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
    }
  }
}



Display offers availability and price at checkout


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
    }
  }
}



Submitting the mission


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
    }
  }
}



(Optionnal) Canceling a mission


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
    }
  }
}




👉 Marketplace Integration Guide


How it works


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


How to integrate it


Redirect your user to our platform


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]