diff --git a/src/Annotation/SmsGateway.php b/src/Annotation/SmsGateway.php
index 9e5b6f0..bd2b72e 100644
--- a/src/Annotation/SmsGateway.php
+++ b/src/Annotation/SmsGateway.php
@@ -50,4 +50,13 @@ class SmsGateway extends Plugin {
    */
   protected $schedule_aware;
 
+  /**
+   * Whether the gateway supports queries of current credit balance.
+   *
+   * @see \Drupal\sms\Entity\SmsGatewayInterface::supportsCreditBalanceQuery()
+   *
+   * @var boolean
+   */
+  protected $credit_balance_query;
+
 }
diff --git a/src/Entity/SmsGateway.php b/src/Entity/SmsGateway.php
index ade32ed..6fe9516 100644
--- a/src/Entity/SmsGateway.php
+++ b/src/Entity/SmsGateway.php
@@ -203,4 +203,13 @@ class SmsGateway extends ConfigEntityBase implements SmsGatewayInterface, Entity
     return !empty($definition['schedule_aware']);
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function supportsCreditBalanceQuery() {
+    $definition = $this->getPlugin()
+      ->getPluginDefinition();
+    return isset($definition['credit_balance_query']) ? (boolean) $definition['credit_balance_query'] : FALSE;
+  }
+
 }
diff --git a/src/Entity/SmsGatewayInterface.php b/src/Entity/SmsGatewayInterface.php
index ccc6e2c..e15cc8c 100644
--- a/src/Entity/SmsGatewayInterface.php
+++ b/src/Entity/SmsGatewayInterface.php
@@ -91,4 +91,14 @@ interface SmsGatewayInterface extends ConfigEntityInterface {
    */
   public function isScheduleAware();
 
+  /**
+   * Get whether this gateway supports credit balance queries.
+   *
+   * @return boolean
+   *   Whether this gateway supports credit balance queries.
+   *
+   * @see \Drupal\sms\Annotation\SmsGateway::credit_balance_query
+   */
+  public function supportsCreditBalanceQuery();
+
 }
diff --git a/src/Plugin/SmsGatewayPluginBase.php b/src/Plugin/SmsGatewayPluginBase.php
index d9e43ea..cfc8424 100644
--- a/src/Plugin/SmsGatewayPluginBase.php
+++ b/src/Plugin/SmsGatewayPluginBase.php
@@ -91,8 +91,8 @@ abstract class SmsGatewayPluginBase extends PluginBase implements SmsGatewayPlug
   /**
    * {@inheritdoc}
    */
-  public function balance() {
-    return 0;
+  public function getCreditsBalance() {
+    return NULL;
   }
 
   /**
diff --git a/src/Plugin/SmsGatewayPluginInterface.php b/src/Plugin/SmsGatewayPluginInterface.php
index 73823e6..27fe93a 100644
--- a/src/Plugin/SmsGatewayPluginInterface.php
+++ b/src/Plugin/SmsGatewayPluginInterface.php
@@ -125,9 +125,13 @@ interface SmsGatewayPluginInterface extends ConfigurablePluginInterface, PluginF
   /**
    * Returns the credit balance available on this gateway.
    *
-   * @return number
+   * The 'credit_balance_query' plugin annotation should be set to inform the
+   * framework whether this gateway supports balance queries.
+   *
+   * @return float|NULL
+   *   The credit balance of the gateway, or NULL if unknown.
    */
-  public function balance();
+  public function getCreditsBalance();
 
   /**
    * Parses incoming delivery reports and returns the created delivery reports.
diff --git a/tests/modules/sms_test_gateway/config/schema/sms_test_gateway.schema.yml b/tests/modules/sms_test_gateway/config/schema/sms_test_gateway.schema.yml
index 8875827..7abb3a9 100644
--- a/tests/modules/sms_test_gateway/config/schema/sms_test_gateway.schema.yml
+++ b/tests/modules/sms_test_gateway/config/schema/sms_test_gateway.schema.yml
@@ -29,3 +29,10 @@ sms_gateway.settings.memory_schedule_aware:
   mapping:
     gateway_id:
       type: string
+
+sms_gateway.settings.capabilities_default:
+  type: sms_gateway_settings
+  label: 'Default annotation capabilities'
+  mapping:
+    gateway_id:
+      type: string
diff --git a/tests/modules/sms_test_gateway/src/Plugin/SmsGateway/DefaultCapabilities.php b/tests/modules/sms_test_gateway/src/Plugin/SmsGateway/DefaultCapabilities.php
new file mode 100644
index 0000000..abfb760
--- /dev/null
+++ b/tests/modules/sms_test_gateway/src/Plugin/SmsGateway/DefaultCapabilities.php
@@ -0,0 +1,27 @@
+<?php
+
+namespace Drupal\sms_test_gateway\Plugin\SmsGateway;
+
+use Drupal\sms\Plugin\SmsGatewayPluginBase;
+use Drupal\sms\Message\SmsMessageInterface;
+
+/**
+ * Defines a gateway for testing default capabilities defined by annotation.
+ *
+ * This gateway does not provide any annotation details other than required
+ * properties: 'id' and 'label'.
+ *
+ * @SmsGateway(
+ *   id = "capabilities_default",
+ *   label = @Translation("Default annotation capabilities")
+ * )
+ */
+class DefaultCapabilities extends SmsGatewayPluginBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function send(SmsMessageInterface $sms) {
+  }
+
+}
diff --git a/tests/modules/sms_test_gateway/src/Plugin/SmsGateway/Memory.php b/tests/modules/sms_test_gateway/src/Plugin/SmsGateway/Memory.php
index 8a8f150..072cf62 100644
--- a/tests/modules/sms_test_gateway/src/Plugin/SmsGateway/Memory.php
+++ b/tests/modules/sms_test_gateway/src/Plugin/SmsGateway/Memory.php
@@ -27,6 +27,7 @@ use Symfony\Component\HttpFoundation\Response;
  *   label = @Translation("Memory"),
  *   outgoing_message_max_recipients = -1,
  *   schedule_aware = FALSE,
+ *   credit_balance_query = TRUE,
  * )
  */
 class Memory extends SmsGatewayPluginBase implements SmsGatewayPluginIncomingInterface{
@@ -161,4 +162,11 @@ class Memory extends SmsGatewayPluginBase implements SmsGatewayPluginIncomingInt
     return $reports;
   }
 
+  /**
+   * @inheritdoc
+   */
+  public function getCreditsBalance() {
+    return 13.36;
+  }
+
 }
diff --git a/tests/src/Kernel/SmsFrameworkGatewayEntityTest.php b/tests/src/Kernel/SmsFrameworkGatewayEntityTest.php
index 06f2129..f5fa258 100644
--- a/tests/src/Kernel/SmsFrameworkGatewayEntityTest.php
+++ b/tests/src/Kernel/SmsFrameworkGatewayEntityTest.php
@@ -72,13 +72,76 @@ class SmsFrameworkGatewayEntityTest extends SmsFrameworkKernelBase {
   }
 
   /**
+   * Tests max outgoing recipients annotation custom value.
+   */
+  public function testGetMaxRecipientsOutgoingCustom() {
+    $gateway = $this->createGateway([
+      'plugin' => 'memory',
+    ]);
+    $this->assertEquals(-1, $gateway->getMaxRecipientsOutgoing());
+  }
+
+  /**
+   * Tests max outgoing recipients annotation default value.
+   */
+  public function testGetMaxRecipientsOutgoingDefault() {
+    $gateway = $this->createGateway([
+      'plugin' => 'capabilities_default',
+    ]);
+    $this->assertEquals(1, $gateway->getMaxRecipientsOutgoing());
+  }
+
+  /**
+   * Tests schedule aware annotation custom value.
+   */
+  public function testIsScheduleAwareCustom() {
+    $gateway = $this->createGateway([
+      'plugin' => 'memory_schedule_aware',
+    ]);
+    $this->assertTrue($gateway->isScheduleAware());
+  }
+
+  /**
+   * Tests schedule aware annotation default value.
+   */
+  public function testIsScheduleAwareDefault() {
+    $gateway = $this->createGateway([
+      'plugin' => 'capabilities_default',
+    ]);
+    $this->assertFalse($gateway->isScheduleAware());
+  }
+
+  /**
+   * Tests schedule aware annotation custom value.
+   */
+  public function testSupportsCreditBalanceQueryCustom() {
+    $gateway = $this->createGateway([
+      'plugin' => 'memory',
+    ]);
+    $this->assertTrue($gateway->supportsCreditBalanceQuery());
+  }
+
+  /**
+   * Tests schedule aware annotation default value.
+   */
+  public function testSupportsCreditBalanceQueryDefault() {
+    $gateway = $this->createGateway([
+      'plugin' => 'capabilities_default',
+    ]);
+    $this->assertFalse($gateway->supportsCreditBalanceQuery());
+  }
+
+  /**
    * Create a new gateway.
    *
+   * @param array $values
+   *   Custom values to pass to the gateway.
+   *
    * @return \Drupal\sms\Entity\SmsGatewayInterface
    *   An unsaved gateway config entity.
    */
-  protected function createGateway() {
-    return SmsGateway::create([
+  protected function createGateway($values = []) {
+    return SmsGateway::create($values + [
       'plugin' => 'memory',
     ]);
   }
