Connect LouderLines with Pipedream, a developer-friendly automation platform with powerful code capabilities and generous free tier.
What You’ll Need
- A LouderLines account on selected paid plans
- A Pipedream account (free tier includes 10,000 invocations/month)
- Your LouderLines API key
Part 1: Getting Your LouderLines API Key
- Log in to your LouderLines account
- Go to Integrations in the sidebar
- Click Create Key
- Name it “Pipedream Integration”
- Select Live environment
- Click Create Key
- Copy the key immediately!
Part 2: Setting Up Webhook Triggers
Pipedream can receive webhooks from LouderLines in real-time.
Step 1: Create a New Workflow
- Go to pipedream.com
- Click New → Workflow
- Give it a name like “LouderLines Events”
Step 2: Add HTTP Trigger
- For the trigger, select HTTP / Webhook
- Choose HTTP Requests (Most Popular)
- Pipedream will generate a unique URL:
https://eoxxxxxxx.m.pipedream.net - Copy this URL
Step 3: Configure LouderLines Webhook
- Go to LouderLines → Integrations
- Click Add Webhook
- Paste your Pipedream URL
- Select your events:
subscriber.createdsubscriber.unsubscribedanswer.publishedcustom_post.published
- Click Create Webhook
- Save the signing secret for verification
Step 4: Test the Webhook
- In LouderLines, click Test next to your webhook
- Return to Pipedream – you should see the event
- Click on the event to inspect the data structure
Step 5: Add Signature Verification
Add a code step to verify webhook signatures:
- Click + to add a step
- Select Run Node.js code
- Add this code:
import crypto from 'crypto';
export default defineComponent({
async run({ steps, $ }) {
const signature = steps.trigger.event.headers['x-louderlines-signature'];
const secret = process.env.LOUDERLINES_WEBHOOK_SECRET;
const payload = JSON.stringify(steps.trigger.event.body);
const expected = 'sha256=' + crypto
.createHmac('sha256', secret)
.update(payload)
.digest('hex');
if (signature !== expected) {
throw new Error('Invalid signature');
}
return steps.trigger.event.body;
},
});
- Add your secret as an environment variable:
- Go to Settings → Environment Variables
- Add
LOUDERLINES_WEBHOOK_SECRETwith your secret
Part 3: Storing Your API Key
Before making API calls, store your key securely:
- Go to Settings → Environment Variables
- Add:
LOUDERLINES_API_KEY=ll_live_YOUR_KEY
Part 4: Making API Requests
Use Pipedream’s HTTP action or Node.js code.
Using HTTP Action (No-Code)
- Add step → HTTP Request
- Configure:
- Method: GET
- URL:
https://www.louderlines.com/api/v1/subscribers - Headers:
Authorization:Bearer ${process.env.LOUDERLINES_API_KEY}Content-Type:application/json
Using Node.js Code
import { axios } from "@pipedream/platform";
export default defineComponent({
async run({ steps, $ }) {
const response = await axios($, {
method: "GET",
url: "https://www.louderlines.com/api/v1/subscribers",
headers: {
"Authorization": `Bearer ${process.env.LOUDERLINES_API_KEY}`,
"Content-Type": "application/json"
},
});
return response;
},
});
POST Request (Add Subscriber)
import { axios } from "@pipedream/platform";
export default defineComponent({
props: {
email: {
type: "string",
label: "Email",
},
firstName: {
type: "string",
label: "First Name",
optional: true,
},
},
async run({ steps, $ }) {
return await axios($, {
method: "POST",
url: "https://www.louderlines.com/api/v1/subscribers",
headers: {
"Authorization": `Bearer ${process.env.LOUDERLINES_API_KEY}`,
"Content-Type": "application/json"
},
data: {
email: this.email,
first_name: this.firstName,
},
});
},
});
Part 5: Example Workflows
Workflow 1: Tweet New Content
Trigger: HTTP Webhook (LouderLines answer.published)
Steps:
- Verify Signature (code step from above)
- Post to Twitter:
- Add step → Twitter → Create Tweet
- Connect your Twitter account
- Tweet text:
{{steps.trigger.event.body.data.title}} {{steps.trigger.event.body.data.content_plain.substring(0, 180)}}... {{steps.trigger.event.body.data.custom_link || steps.trigger.event.body.data.post_url}}
Workflow 2: Add to Google Sheets
Trigger: HTTP Webhook (LouderLines subscriber.created)
Steps:
- Google Sheets → Add Row
- Connect your Google account
- Select spreadsheet and sheet
- Column values:
- A:
{{steps.trigger.event.body.data.email}} - B:
{{steps.trigger.event.body.data.first_name}} - C:
{{steps.trigger.event.body.data.subscribed_at}} - D:
LouderLines
- A:
Workflow 3: Slack Notification
Trigger: HTTP Webhook
Steps:
- Slack → Send Message
- Connect Slack
- Channel:
#notifications - Message:
🎉 New LouderLines subscriber! *Email:* {{steps.trigger.event.body.data.email}} *Name:* {{steps.trigger.event.body.data.first_name || 'Not provided'}}
Workflow 4: Conditional Processing
Use code to handle different event types:
export default defineComponent({
async run({ steps, $ }) {
const event = steps.trigger.event.body;
const eventType = event.event_type;
switch (eventType) {
case 'subscriber.created':
$.export('action', 'add_to_crm');
$.export('data', event.data);
break;
case 'subscriber.unsubscribed':
$.export('action', 'update_crm');
$.export('data', { ...event.data, status: 'unsubscribed' });
break;
case 'answer.published':
case 'custom_post.published':
$.export('action', 'post_social');
$.export('data', event.data);
break;
default:
$.export('action', 'ignore');
}
return { eventType, action: $.export.action };
},
});
Then use Filter steps to route based on the action.
Workflow 5: Daily Digest Email
Trigger: Schedule (daily at 9 AM)
Steps:
- Get Recent Subscribers:
import { axios } from "@pipedream/platform";
export default defineComponent({
async run({ steps, $ }) {
const response = await axios($, {
url: "https://www.louderlines.com/api/v1/subscribers",
params: { since: "24h", status: "active" },
headers: {
"Authorization": `Bearer ${process.env.LOUDERLINES_API_KEY}`,
},
});
return {
count: response.data?.length || 0,
subscribers: response.data || [],
};
},
});
- Send Email:
- Add step → Email → Send Email
- To: Your email
- Subject:
LouderLines Daily Report - ${steps.get_subscribers.count} new subscribers - Body: Format the subscriber list
Workflow 6: Bulk Import from CSV
Trigger: HTTP Webhook (receive CSV data)
import { axios } from "@pipedream/platform";
export default defineComponent({
async run({ steps, $ }) {
const subscribers = steps.trigger.event.body.subscribers;
const results = [];
for (const sub of subscribers) {
try {
const response = await axios($, {
method: "POST",
url: "https://www.louderlines.com/api/v1/subscribers",
headers: {
"Authorization": `Bearer ${process.env.LOUDERLINES_API_KEY}`,
"Content-Type": "application/json"
},
data: {
email: sub.email,
first_name: sub.name,
},
});
results.push({ email: sub.email, status: 'success' });
} catch (error) {
results.push({ email: sub.email, status: 'failed', error: error.message });
}
// Rate limit protection
await new Promise(resolve => setTimeout(resolve, 100));
}
return results;
},
});
Part 6: Advanced Features
Using Props for Configurable Workflows
export default defineComponent({
props: {
apiKey: {
type: "string",
label: "LouderLines API Key",
secret: true,
},
eventTypes: {
type: "string[]",
label: "Event Types to Process",
options: [
"subscriber.created",
"subscriber.unsubscribed",
"answer.published",
"custom_post.published",
],
},
},
async run({ steps, $ }) {
// Use this.apiKey and this.eventTypes
},
});
Data Stores (Persistent Storage)
Store state between workflow runs:
export default defineComponent({
props: {
dataStore: { type: "data_store" },
},
async run({ steps, $ }) {
// Get last processed ID
const lastId = await this.dataStore.get("lastProcessedId") || 0;
// Process new items...
// Save new last ID
await this.dataStore.set("lastProcessedId", newLastId);
},
});
Concurrency & Queuing
For high-volume webhooks:
- Go to workflow settings
- Enable Concurrency controls
- Set max concurrent executions
Troubleshooting
“Unauthorized” API Errors
- Check environment variable is set correctly
- Ensure
Bearerprefix (with space) - Verify API key is active in LouderLines
Webhook Not Receiving Events
- Check webhook URL is correct in LouderLines
- Verify webhook is Active in LouderLines
- Use the Test button to send sample data
- Check Pipedream’s Event Inspector
Timeout Errors
- LouderLines API timeout is 30 seconds
- For bulk operations, process in smaller batches
- Add retry logic for transient failures
Expression Errors
- Use optional chaining:
steps.trigger.event.body?.data?.email - Check for null/undefined before accessing nested properties
- Log intermediate values to debug
Rate Limits
- Add delays between API calls:
await new Promise(r => setTimeout(r, 100)) - Process in batches
- Check response headers for rate limit info
Pipedream-Specific Tips
Free Tier Limits
- 10,000 invocations/month
- 30-second execution time
- 100KB memory per step
Using npm Packages
import lodash from 'lodash';
import moment from 'moment';
export default defineComponent({
async run({ steps, $ }) {
const grouped = lodash.groupBy(data, 'type');
const formatted = moment(date).format('MMMM Do YYYY');
},
});
Connecting to Databases
Pipedream has built-in connections for:
- PostgreSQL
- MySQL
- MongoDB
- Supabase
Use these for more complex data storage needs.
Need Help?
- LouderLines Support: support@louderlines.com
- Pipedream Docs: pipedream.com/docs
- Pipedream Community: pipedream.com/community
- Pipedream Slack: pipedream.com/slack
Last updated: January 2025
