Creating a New Shipping Method In Magento 2

Configuring custom shipping methods is essential for stores that deliver physical products. This guide walks you through building a complete custom shipping method in Magento 2.

Summary

  • Step 1: Create a Custom Module
  • Step 2: Create the System Configuration
  • Step 3: Add Default Config Values
  • Step 4: Create the Shipping Model

Step 1: Create a Custom Module

Create the module declaration files:

module.xml


<?xml version="1.0"?>
<module name="Hikmadh_Shipping" setup_version="1.0.0">
    <sequence>
        <module name="Magento_Shipping"/>
    </sequence>
</module>
    

registration.php


<?php
use Magento\Framework\Component\ComponentRegistrar;

ComponentRegistrar::register(
    ComponentRegistrar::MODULE,
    'Hikmadh_Shipping',
    __DIR__
);
    

Enable Module

php bin/magento setup:upgrade

Step 2: Create System Configuration (Admin Form)

Create system.xml file:


<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:noNamespaceSchemaLocation="urn:magento:framework:Config/etc/system_file.xsd">

  <system>
    <section id="carriers">
      <group id="hikmadh_shipping">
        <label>Hikmadh Custom Shipping</label>

        <field id="active" type="select">
          <label>Enabled</label>
          <source_model>Magento\Config\Model\Config\Source\Yesno</source_model>
        </field>

        <field id="title" type="text">
          <label>Title</label>
        </field>

        <field id="name" type="text">
          <label>Method Name</label>
        </field>

        <field id="price" type="text">
          <label>Shipping Price</label>
        </field>

      </group>
    </section>
  </system>
</config>
    

Step 3: Create config.xml (Default Values)


<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:noNamespaceSchemaLocation="urn:magento:framework:App/etc/config.xsd">

  <default>
    <carriers>
      <hikmadh_shipping>
        <active>1</active>
        <title>Hikmadh Shipping</title>
        <name>Custom Shipping Method</name>
        <price>20.00</price>
      </hikmadh_shipping>
    </carriers>
  </default>

</config>
    

Step 4: Create Shipping Model


<?php
namespace Hikmadh\Shipping\Model\Carrier;

use Magento\Quote\Model\Quote\Address\RateRequest;
use Magento\Shipping\Model\Rate\ResultFactory;
use Magento\Shipping\Model\Rate\Result\MethodFactory;

class Custom extends \Magento\Shipping\Model\Carrier\AbstractCarrier
{
    protected $_code = 'hikmadh_shipping';

    public function __construct(
        \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig,
        ResultFactory $rateResultFactory,
        MethodFactory $rateMethodFactory,
        array $data = []
    ) {
        $this->rateResultFactory = $rateResultFactory;
        $this->rateMethodFactory = $rateMethodFactory;
        parent::__construct($scopeConfig, $data);
    }

    public function collectRates(RateRequest $request)
    {
        if (!$this->getConfigFlag('active')) {
            return false;
        }

        $result = $this->rateResultFactory->create();
        $method = $this->rateMethodFactory->create();

        $method->setCarrier($this->_code);
        $method->setCarrierTitle($this->getConfigData('title'));

        $method->setMethod($this->_code);
        $method->setMethodTitle($this->getConfigData('name'));

        $price = $this->getConfigData('price');
        $method->setPrice($price);
        $method->setCost($price);

        $result->append($method);
        return $result;
    }

    public function getAllowedMethods()
    {
        return [$this->_code => $this->getConfigData('name')];
    }
}
    

Final Step: Flush Cache

php bin/magento cache:flush