# How to Build Your Own Ringless Voicemail System

> ⚠️ **Disclaimer:** Ringless voicemail is regulated under the TCPA and other telemarketing laws. Always ensure compliance before sending messages.

***

### Overview

Ringless voicemail allows you to **deliver pre-recorded audio messages directly to voicemail inboxes** without ringing the recipient's phone.

Using the **Drop Cowboy SDK**, you can:

* Programmatically send RVM messages
* Manage **number pools** and **caller IDs**
* Track delivery results via webhooks
* Stay compliant with telecom regulations

This approach lets you **build a system without provisioning your own VoIP/SIP infrastructure**, while still having programmatic control over campaigns.

***

### Step 1: Set Up Your SDK

1. Install the Drop Cowboy SDK:

   ```bash
   npm install dropcowboy
   ```
2. Initialize your Drop Cowboy client using your **Team ID** and **Secret**:&#x20;

   ```javascript
   import { DropCowboy } from "dropcowboy";

   const dropcowboy = new DropCowboy({
       teamId: process.env.DROPCOWBOY_TEAM_ID,
       secret: process.env.DROPCOWBOY_SECRET
   });
   ```

***

### Step 2: Select a Private Number Pool

Each RVM message must be sent from a number in a **private number pool** linked to an approved brand:

```javascript
const pools = await dropcowboy.listPools();
console.log(pools);
```

* Check `service_type` to make sure the pool is compatible with RVM
* Ensure `number_count > 0` before sending campaigns

***

### Step 3: Manage Your Audio Recordings

Upload or select approved audio recordings for delivery:

```javascript
const recordings = await dropcowboy.listRecordings({ api_allowed: true });
console.log(recordings);
```

* Supports static audio files hosted on Drop Cowboy or your servers
* Compatible with generative AI TTS messages

***

### Step 4: Send Ringless Voicemail Messages

Use the SDK to programmatically send messages:

```javascript
const rvm = await dropcowboy.sendRvm({
    brand_id: "00000000-0000-0000-0000-000000000000", 
    recording_id: "00000000-0000-0000-0000-000000000000", 
    phone_number: "+15552223333", 
    forwarding_number: "+15557778888", 
    foreign_id: "YOUR_DATABASE_RECORD_ID", 
    callback_url: "https://your.server.com"
});

console.log(rvm);
```

* Supports advanced options like explicit caller ID campaigns
* Automatically handles delivery tracking

***

### Step 5: Monitor Delivery via Webhooks

Receive callbacks for each RVM delivery:

```javascript
{
  "drop_id": "5c8eb7940a057a4ab0823e1a",
  "phone_number": "+15552224444",
  "attempt_date": "2025-03-17T21:10:26.000Z",
  "status": "success",
  "reason": "",
  "dnc": false,
  "product_cost": 0.099,
  "compliance_fee": 0.0029,
  "tts_fee": 0.03,
  "network": {
    "name": "Verizon Wireless:6006 - SVR/2",
    "type": "wireless"
  },
  "foreign_id": "<your system value>"
}
```

* Track success, failures, and debug issues
* Link webhook results back to your database for campaign analytics

***

### Step 6: Ensure Compliance

* Only message contacts who have **opted-in**
* Respect **TCPA and telemarketing regulations**
* Log all messages and delivery results for auditing

***

#### 💡 Pro Tips

> * Segment recipients for better deliverability
> * Test campaigns with small numbers before scaling
> * Use dynamic TTS for personalized messaging
> * Monitor delivery analytics to optimize campaigns

By following this guide, developers can **build their own RVM system** entirely on top of **Drop Cowboy’s API/SDK**, without needing to maintain a separate telephony stack. Allowing clients to save time while staying compliant and scalable.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://drop-cowboy.gitbook.io/drop-cowboy-docs/tutorials/how-to-build-your-own-ringless-voicemail-system.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
