To use Reddit Ads with V0, generate your campaign analytics UI in V0, then create a Next.js API route at app/api/reddit-ads/route.ts that authenticates with Reddit's OAuth2 API and fetches ad campaign performance data. Store your Reddit App Client ID and Client Secret in Vercel environment variables. Reddit Ads API uses OAuth2 with Client Credentials for read-only data access.
Building a Reddit Ads Analytics Dashboard with V0
Reddit Ads is the underutilized channel in many marketers' toolkits — its community-based targeting reaches highly engaged niche audiences that are difficult to find on other platforms. If you run Reddit campaigns to target developer communities, gaming subreddits, finance enthusiasts, or any of Reddit's thousands of interest communities, building a custom analytics dashboard with V0 gives you visibility into campaign performance without manually logging into the Reddit Ads Manager.
The Reddit Ads API uses OAuth2, which makes authentication relatively straightforward compared to older OAuth 1.0a-based APIs. For read-only access to your own ad account's campaign data, you can use the Client Credentials grant type — no user login flow required. Your server obtains an application access token using your Client ID and Client Secret, then uses that token to call the Reddit Ads API endpoints for account data, campaign lists, and performance metrics.
An important distinction from other ad platforms: Reddit's community-based targeting model means your campaign analytics will show performance broken down by subreddit community alongside standard metrics. Understanding which subreddits your ads perform best in is uniquely valuable data that Reddit Ads surfaces. Your V0 dashboard can highlight this community dimension in ways that the standard Reddit Ads Manager interface does not always make prominent. V0 cannot validate live Reddit API connections in its preview sandbox, so you will build, deploy to Vercel, and test from the live deployment.
Integration method
V0 generates your ad analytics dashboard UI while a Next.js API route handles Reddit OAuth2 authentication and Reddit Ads API requests server-side. The API route fetches campaign performance data — impressions, clicks, spend, and conversions — and transforms it for your V0 dashboard components. All API calls go through your server to keep credentials out of the browser.
Prerequisites
- A V0 account with a Next.js project generated at v0.dev
- A Reddit Ads account at ads.reddit.com with at least one campaign
- A Reddit developer application registered at reddit.com/prefs/apps with your ad account credentials
- Your Reddit App Client ID and Client Secret from the Reddit app settings
- A Vercel account with your V0 project deployed via GitHub
Step-by-step guide
Register a Reddit Application for API Access
Register a Reddit Application for API Access
Reddit requires a registered application to use its API. Go to reddit.com/prefs/apps (you need to be logged in with the Reddit account that manages your Ads account) and scroll to the bottom. Click 'Create App' or 'Create Another App'. Fill in the form: Name your app descriptively (e.g., 'My V0 Ads Dashboard'). Select 'script' as the app type — this is for personal use scripts and allows Client Credentials OAuth flow, which is what you need for server-to-server API access. For the redirect URI, enter http://localhost:8080 (it is required but not actually used for the script/Client Credentials flow). For the about URL, you can leave it blank or enter your Vercel deployment URL. After creating the app, Reddit shows you the app settings with a client ID (a short alphanumeric string displayed under the app name) and a client secret (shown as 'secret' in the settings). Copy both of these — the client ID and client secret are what your Next.js API route uses to authenticate. Critical note about Reddit Ads API access: the standard Reddit API (via reddit.com/prefs/apps) gives access to the general Reddit API including posts and subreddits. For the Reddit Ads API specifically, you also need to contact Reddit's Business API team at ads-api@reddit.com and request access, particularly for production use. During development and testing with your own account's data, the standard app credentials may work for basic read operations, but full Ads API access for campaign management requires explicit approval.
Pro tip: Use the same Reddit account that has access to your Reddit Ads account when creating the developer application. The OAuth tokens generated by this app will have access to the same ad accounts as the account that owns the app.
Expected result: A Reddit developer application exists with a Client ID and Client Secret. These credentials are associated with a Reddit account that has access to your Reddit Ads account.
Generate the Ads Dashboard UI in V0
Generate the Ads Dashboard UI in V0
Use V0 to generate the analytics dashboard front-end. Reddit Ads has some unique metrics compared to other ad platforms — notably the upvote count and comment count on promoted posts, which reflect Reddit community engagement rather than just click behavior. Including these Reddit-specific metrics in your dashboard gives you insight that standard ad reports often miss. For a standard campaign performance dashboard, V0 generates excellent layouts with metric summary cards and sortable data tables. When prompting V0, specify the exact data fields you want to display. Standard metrics like impressions, clicks, CTR, spend, and CPC are universal. Reddit-specific metrics include upvotes on promoted posts and subreddit-level performance breakdowns. Consider the time dimension in your dashboard design. Daily trend lines showing how performance changes over a 7 or 30-day period are more actionable than aggregate totals alone. V0 can generate Recharts components for area charts or bar charts showing daily metrics. Ask explicitly for a time-series chart to get this in the initial generation. The dashboard should fetch data when the page loads, or when the user changes the date range filter. Since the data is dynamic and user-controlled, generate this as a 'use client' component with useEffect for data fetching. V0 handles this pattern well — explicitly mention 'use client' and 'fetch on mount' in your prompt to get the right code pattern.
Create a Reddit Ads analytics dashboard with 'use client'. Add a date range selector (7 days, 30 days, 90 days) that triggers a refetch. Show 4 stat cards: Total Spend ($), Total Impressions, Total Clicks, Overall CTR%. Below, a sortable table of campaigns (Name, Status, Daily Budget, Impressions, Clicks, CTR%, CPC$, Spend$). Below that, a Recharts AreaChart showing daily spend for the selected period. Show skeleton loading state while fetching. Fetch from /api/reddit-ads/campaigns?days={days}.
Paste this in V0 chat
Pro tip: Ask V0 to use a neutral color palette for the dashboard — Reddit's brand orange (#FF4500) can be used as an accent color for headings and key metrics to give the dashboard a recognizable Reddit identity.
Expected result: V0 generates a dashboard page with a date range selector, stat cards, a campaign table, and a time-series chart. The component fetches from the API route and updates when the date range changes.
Create the Reddit Ads API Route
Create the Reddit Ads API Route
Create the server-side API route that authenticates with Reddit OAuth2 and fetches campaign data. Reddit's OAuth2 Client Credentials flow is similar to eBay's: your server requests an access token by POSTing to Reddit's token endpoint with your credentials, then uses that token for subsequent API calls. The Reddit OAuth token endpoint is https://www.reddit.com/api/v1/access_token. Authentication uses HTTP Basic Auth with your Client ID as the username and Client Secret as the password. The request body contains grant_type=client_credentials. Reddit requires a descriptive User-Agent header that includes your app name, version, and Reddit username — this is a hard requirement and requests with generic User-Agent strings are rejected. Once you have the token, Reddit Ads API calls go to https://ads-api.reddit.com/api/v2.0/ with a Bearer authorization header. The main endpoints for campaign data are /accounts/{account_id}/campaigns for listing campaigns and /accounts/{account_id}/campaigns/{campaign_id}/stats for performance metrics. Finding your Reddit Ads Account ID: log in to ads.reddit.com and look at the URL. When you are on the campaigns overview, the account ID appears in the URL as a t2_ prefixed value (for example, t2_abc123). You will need this for all Ads API calls. Token caching is important here too — Reddit access tokens are valid for one hour and rate limits apply to token requests. Implement a module-level cache similar to the eBay pattern: store the token and expiry time, check the cache before requesting a new token. For high-traffic dashboards, use Upstash Redis for distributed caching.
Create a Next.js API route at app/api/reddit-ads/route.ts that handles GET requests with a days query parameter. Authenticate with Reddit OAuth2 using Client Credentials (REDDIT_CLIENT_ID and REDDIT_CLIENT_SECRET env vars). Fetch campaigns from the Reddit Ads API for account REDDIT_ADS_ACCOUNT_ID. Return campaigns with id, name, status, dailyBudget, impressions, clicks, spend, ctr, and cpc fields. Cache the OAuth token in memory.
Paste this in V0 chat
1import { NextRequest, NextResponse } from 'next/server';23interface TokenCache {4 token: string;5 expiresAt: number;6}78let tokenCache: TokenCache | null = null;910async function getRedditToken(): Promise<string> {11 if (tokenCache && Date.now() < tokenCache.expiresAt - 60_000) {12 return tokenCache.token;13 }1415 const clientId = process.env.REDDIT_CLIENT_ID!;16 const clientSecret = process.env.REDDIT_CLIENT_SECRET!;17 const credentials = Buffer.from(`${clientId}:${clientSecret}`).toString('base64');1819 // Reddit requires a descriptive User-Agent or requests are rejected20 const userAgent = `web:my-v0-ads-dashboard:v1.0 (by /u/${process.env.REDDIT_USERNAME || 'myusername'})`;2122 const response = await fetch('https://www.reddit.com/api/v1/access_token', {23 method: 'POST',24 headers: {25 'Authorization': `Basic ${credentials}`,26 'Content-Type': 'application/x-www-form-urlencoded',27 'User-Agent': userAgent,28 },29 body: 'grant_type=client_credentials',30 });3132 if (!response.ok) {33 throw new Error(`Reddit token request failed: ${response.status}`);34 }3536 const data = await response.json();37 tokenCache = {38 token: data.access_token,39 expiresAt: Date.now() + data.expires_in * 1000,40 };4142 return data.access_token;43}4445export async function GET(request: NextRequest) {46 try {47 const { searchParams } = new URL(request.url);48 const days = parseInt(searchParams.get('days') || '7');49 const accountId = process.env.REDDIT_ADS_ACCOUNT_ID!;5051 const token = await getRedditToken();52 const userAgent = `web:my-v0-ads-dashboard:v1.0 (by /u/${process.env.REDDIT_USERNAME || 'myusername'})`;5354 // Fetch campaigns list55 const campaignsResponse = await fetch(56 `https://ads-api.reddit.com/api/v2.0/accounts/${accountId}/campaigns?limit=50`,57 {58 headers: {59 'Authorization': `Bearer ${token}`,60 'User-Agent': userAgent,61 },62 }63 );6465 if (!campaignsResponse.ok) {66 throw new Error(`Reddit Ads campaigns API error: ${campaignsResponse.status}`);67 }6869 const campaignsData = await campaignsResponse.json();70 const campaigns = campaignsData.data || [];7172 // Calculate date range73 const endDate = new Date();74 const startDate = new Date();75 startDate.setDate(startDate.getDate() - days);76 const startIso = startDate.toISOString().split('T')[0];77 const endIso = endDate.toISOString().split('T')[0];7879 // Fetch stats for each campaign80 const campaignsWithStats = await Promise.all(81 campaigns.slice(0, 20).map(async (campaign: Record<string, unknown>) => {82 try {83 const statsResponse = await fetch(84 `https://ads-api.reddit.com/api/v2.0/accounts/${accountId}/campaigns/${campaign.id}/stats?startDate=${startIso}&endDate=${endIso}`,85 {86 headers: {87 'Authorization': `Bearer ${token}`,88 'User-Agent': userAgent,89 },90 }91 );9293 const statsData = statsResponse.ok ? await statsResponse.json() : { data: [] };94 const stats = statsData.data?.[0] || {};9596 const impressions = stats.impressions || 0;97 const clicks = stats.clicks || 0;98 const spendCents = stats.spend || 0;99 const spend = (spendCents / 100).toFixed(2);100 const ctr = impressions > 0 ? ((clicks / impressions) * 100).toFixed(2) : '0.00';101 const cpc = clicks > 0 ? (spendCents / 100 / clicks).toFixed(2) : '0.00';102103 return {104 id: campaign.id,105 name: campaign.name,106 status: campaign.status,107 dailyBudget: campaign.dailyBudgetAmount108 ? (campaign.dailyBudgetAmount as number / 100).toFixed(2)109 : '0.00',110 impressions,111 clicks,112 spend,113 ctr,114 cpc,115 };116 } catch {117 return {118 id: campaign.id,119 name: campaign.name,120 status: campaign.status,121 dailyBudget: '0.00',122 impressions: 0,123 clicks: 0,124 spend: '0.00',125 ctr: '0.00',126 cpc: '0.00',127 };128 }129 })130 );131132 const totals = {133 spend: campaignsWithStats.reduce((sum, c) => sum + parseFloat(c.spend), 0).toFixed(2),134 impressions: campaignsWithStats.reduce((sum, c) => sum + c.impressions, 0),135 clicks: campaignsWithStats.reduce((sum, c) => sum + c.clicks, 0),136 };137138 return NextResponse.json({ campaigns: campaignsWithStats, totals });139 } catch (error) {140 console.error('Reddit Ads API error:', error);141 return NextResponse.json({ error: 'Failed to fetch Reddit Ads data' }, { status: 500 });142 }143}Pro tip: Reddit's Ads API returns monetary values in cents (not dollars) — divide by 100 for display. A daily budget of $50.00 is stored as 5000 in the API. Always convert before showing to users.
Expected result: The API route exists and, when called with a valid days parameter, authenticates with Reddit OAuth2, fetches campaigns and stats, and returns formatted JSON with impressions, clicks, CTR, and spend data.
Add Environment Variables to Vercel
Add Environment Variables to Vercel
Your API route needs four environment variables: REDDIT_CLIENT_ID, REDDIT_CLIENT_SECRET, REDDIT_ADS_ACCOUNT_ID, and optionally REDDIT_USERNAME for the required User-Agent header. Go to your Vercel Dashboard, open your project, click Settings, then Environment Variables. Add: REDDIT_CLIENT_ID: The Client ID from your Reddit app settings at reddit.com/prefs/apps. The Client ID is the short string displayed under your app name (before the 'secret' line). This is used as the Basic Auth username for token requests. REDDIT_CLIENT_SECRET: The Client Secret (labeled 'secret' in Reddit app settings). This is sensitive — never add a NEXT_PUBLIC_ prefix. Only accessible in server-side code. REDDIT_ADS_ACCOUNT_ID: Your Reddit Ads account ID. Find it in the ads.reddit.com URL when viewing your campaigns, or in the Account Settings section of Reddit Ads Manager. It typically starts with t2_. REDDIT_USERNAME: Your Reddit username (without the u/ prefix). This is used in the User-Agent header that Reddit requires. It is not sensitive but Reddit's API policy asks you to identify your account. Set all variables for Production, Preview, and Development. Add them to .env.local for local development as well. After saving, trigger a redeployment by pushing a commit or using the Redeploy button in Vercel's Deployments tab.
1# .env.local (local development only)2REDDIT_CLIENT_ID=your_client_id_here3REDDIT_CLIENT_SECRET=your_client_secret_here4REDDIT_ADS_ACCOUNT_ID=t2_youraccountid5REDDIT_USERNAME=your_reddit_usernamePro tip: Reddit's API will return 403 errors if your User-Agent header does not follow the required format: platform:appid:version (by /u/username). The REDDIT_USERNAME variable ensures this is set correctly without hardcoding your username in the source code.
Expected result: All four Reddit environment variables are saved in Vercel Dashboard. After redeployment, the API route authenticates with Reddit without errors.
Deploy and Test the Dashboard
Deploy and Test the Dashboard
Push your code to GitHub to trigger a Vercel deployment and test the complete integration. Navigate to your dashboard page on the deployed Vercel URL — not in V0's preview sandbox, since V0 cannot validate external API connections. Test the date range controls first to verify the campaigns table updates when you change the period. Then check that monetary values display correctly in dollar format rather than cents, that status badges show the right color (Active in green, Paused in yellow, Deleted in gray), and that CTR and CPC calculations look reasonable for your actual campaign data. For debugging, check three places: the Vercel Function logs for API errors, the Reddit Developer Dashboard at reddit.com/dev/api for rate limit status, and your browser's Network tab to see the exact request and response for each API call. A note on Reddit Ads API rate limits: the API allows 60 requests per minute per access token. If you are fetching stats for each campaign individually (as the route above does), a large number of campaigns can approach this limit. For accounts with 30 or more campaigns, fetch campaign list data and stats in batches or implement request queuing. Also cache the entire API response for 10 to 15 minutes on the server side to reduce calls for multiple users viewing the dashboard. For enterprise Reddit Ads management integrations — including creating campaigns, managing ad creative at scale, setting up conversion tracking, and building automated campaign optimization rules — the Reddit Ads API has the full range of CRUD operations. RapidDev's team can help implement production-grade Reddit Ads integrations with proper rate limit handling, batched requests, and automated reporting.
Add a CSV export button to the campaign table that downloads the current table data as a CSV file. The CSV should include all columns: Campaign Name, Status, Daily Budget, Impressions, Clicks, CTR%, CPC, Spend. Use client-side CSV generation without any external library.
Paste this in V0 chat
Pro tip: Reddit Ads data has a 24-48 hour reporting delay for complete stats. Very recent campaigns (last 2 days) may show lower numbers than actual. Add a note in your dashboard UI about this delay to prevent confusion.
Expected result: The deployed dashboard shows real Reddit Ads campaign data with accurate performance metrics. Date range changes update the displayed data. The CSV export downloads a properly formatted file.
Common use cases
Campaign Performance Overview
A growth marketer runs Reddit campaigns targeting developer and startup subreddits and needs a quick daily overview of performance across all campaigns. V0 generates the dashboard with stat cards and a campaign table. The API route fetches all active campaigns and their metrics for the past 7 days. The marketer checks this dashboard each morning instead of logging into Reddit Ads Manager.
Build a Reddit Ads performance dashboard with a header showing account name and 'Last 7 days' label. Show 4 stat cards at top: Total Spend ($), Total Impressions, Total Clicks, Average CTR. Below, display a table of campaigns with columns: Campaign Name, Status badge (Active/Paused/Draft), Daily Budget ($), Impressions, Clicks, CTR%, CPC ($), Spend ($). Sort by spend descending. Fetch from /api/reddit-ads/campaigns.
Copy this prompt to try it in V0
Subreddit Performance Breakdown
An advertiser wants to understand which subreddit communities their ads perform best in. V0 generates a breakdown table ranked by CTR or conversion rate per subreddit. The API route fetches post-level stats and groups them by subreddit. This helps the advertiser narrow targeting to the communities where their message resonates and cut spend in communities where it does not.
Create a subreddit performance breakdown page with a table showing each targeted subreddit community. Columns: Subreddit name (r/...), Impressions, Clicks, CTR%, Spend ($), CPC ($). Sort by CTR descending. Add a bar chart using Recharts showing the top 10 subreddits by impressions. Include a date range filter (7, 14, 30 days). Fetch from /api/reddit-ads/subreddit-breakdown.
Copy this prompt to try it in V0
Ad Creative Performance Comparison
A marketer runs A/B tests with different ad headlines and images on Reddit. V0 generates a comparison view showing each creative's performance metrics side by side. The API route fetches ad-level stats and groups them by creative. This surfaces which copy and creative format drives better engagement in Reddit communities, enabling faster iteration on what works.
Build an ad creative comparison page. Show cards for each ad variation with: ad title preview (first 80 chars), ad type badge (Image/Video/Text), impressions, clicks, CTR%, and upvote count (Reddit-specific metric). Highlight the best performer with a gold trophy icon. Add a toggle to compare by CTR vs CPC. Fetch from /api/reddit-ads/creatives.
Copy this prompt to try it in V0
Troubleshooting
API returns 403 with 'USER_REQUIRED' from Reddit
Cause: The OAuth Client Credentials flow is not authorized for the Reddit app type you created, or the app was created as a 'web app' type rather than 'script' type.
Solution: In Reddit app settings at reddit.com/prefs/apps, verify your app is set to type 'script'. The 'web app' type uses Authorization Code flow (requires user login). Edit the app and change the type to 'script' if needed, then regenerate your Client Secret.
All API requests return 429 Too Many Requests
Cause: You are hitting Reddit's rate limit of 60 requests per minute. This often happens when fetching individual campaign stats in parallel for accounts with many campaigns.
Solution: Implement request batching and add delays between requests. Instead of fetching stats for all campaigns simultaneously with Promise.all, process them in smaller batches with a small delay between batches. Also add server-side response caching to avoid redundant API calls.
1// Process campaigns in batches of 5 with delay between batches2async function fetchInBatches<T>(items: T[], batchSize: number, fetchFn: (item: T) => Promise<unknown>) {3 const results = [];4 for (let i = 0; i < items.length; i += batchSize) {5 const batch = items.slice(i, i + batchSize);6 const batchResults = await Promise.all(batch.map(fetchFn));7 results.push(...batchResults);8 if (i + batchSize < items.length) {9 await new Promise(resolve => setTimeout(resolve, 1000)); // 1s delay10 }11 }12 return results;13}Campaign stats return zero for all metrics even though campaigns ran
Cause: The date range format is incorrect, or the account ID is wrong, or the stats endpoint requires the campaign to have been running for at least 24 hours before data appears.
Solution: Verify your date format is YYYY-MM-DD. Check that REDDIT_ADS_ACCOUNT_ID is the correct account identifier. For recent campaigns, try extending the date range to include yesterday — Reddit Ads has a 24-48 hour reporting delay. Log the full stats API URL and response in your Vercel function logs to diagnose.
Reddit token request fails with 'invalid_grant' error
Cause: The REDDIT_CLIENT_ID or REDDIT_CLIENT_SECRET environment variable contains incorrect or stale credentials.
Solution: Go to reddit.com/prefs/apps, click 'edit' on your app, and verify the Client ID (shown under the app name in smaller text) and Client Secret match exactly what is in your Vercel environment variables. If in doubt, click 'regenerate' to create a new Client Secret and update your Vercel environment variable accordingly.
Best practices
- Always route Reddit API calls through a Next.js API route — never call Reddit's API directly from client-side components because CORS restrictions block it and credentials would be exposed.
- Include a descriptive User-Agent header in every Reddit API request with your app name, version, and Reddit username — Reddit can block requests with generic User-Agent strings.
- Cache OAuth access tokens for up to 55 minutes (slightly less than their 1-hour expiry) to reduce token request overhead and rate limit usage.
- Store REDDIT_CLIENT_SECRET without any NEXT_PUBLIC_ prefix to ensure it is never sent to the browser.
- Implement server-side response caching for dashboard data (10-15 minutes) to handle multiple team members using the dashboard without multiplying API calls.
- Handle Reddit's 24-48 hour reporting delay by displaying a data freshness notice and recommending users look at data for dates at least 2 days in the past for most accurate metrics.
- Process campaign stats fetches in small batches with delays between them to stay within Reddit's 60-requests-per-minute rate limit for accounts with many campaigns.
- Convert all monetary values from Reddit's cents format (divide by 100) before displaying — forgetting this shows numbers 100 times too large.
Alternatives
Twitter Ads is better for text and engagement-based targeting, while Reddit Ads excels at reaching specific interest communities and highly engaged niche audiences.
Pinterest Ads delivers better results for visual product discovery targeting shoppers in planning mode, whereas Reddit Ads targets users in information-seeking and community discussion mode.
LinkedIn Ads offers professional demographic and job-title targeting for B2B campaigns, while Reddit Ads provides interest and community-based targeting that often reaches similar professionals at lower CPMs.
Frequently asked questions
Does V0 have a native Reddit Ads integration?
V0 does not include Reddit Ads in its Marketplace integrations. You build the integration using V0 for the UI components and a Next.js API route for Reddit OAuth2 authentication and data fetching. V0 can generate both when you describe the requirements clearly in your prompts.
Do I need special API access to use the Reddit Ads API?
You need a Reddit developer application (created at reddit.com/prefs/apps) and a Reddit Ads account with active or past campaigns. For basic read access to your own account's data, standard developer credentials typically work. For production integrations or building third-party advertising tools, contact Reddit's API team through developer.reddit.com for elevated access.
How does Reddit Ads targeting differ from Twitter or Facebook Ads?
Reddit Ads target users based on the subreddit communities they participate in and their interest categories, rather than profile demographics or following graphs. This community-based targeting reaches users who are actively engaged in specific topics — a developer tool ad in r/programming reaches people who discuss programming, not just people who list it in their profile.
Can I create and manage Reddit Ads campaigns through the API?
Yes, the Reddit Ads API supports full campaign management including creating campaigns, ad groups, and creatives programmatically. Write operations require authenticated user-level OAuth (Authorization Code flow) rather than Client Credentials, as you need explicit user permission to create campaigns that spend money.
Why is my Reddit Ads data showing lower numbers than the Reddit Ads Manager dashboard?
Reddit Ads has a 24-48 hour reporting delay. Data for campaigns running in the last two days may be incomplete in the API while the Ads Manager dashboard may show more up-to-date (but still delayed) estimates. For accurate reporting, analyze data for dates at least two days in the past and display a data freshness timestamp in your dashboard.
How do I find my Reddit Ads Account ID?
Log in to ads.reddit.com and navigate to your campaigns overview. The account ID appears in the URL after /accounts/. It typically starts with t2_ followed by alphanumeric characters. You can also find it in the Account Settings section of Reddit Ads Manager.
Talk to an Expert
Our team has built 600+ apps. Get personalized help with your project.
Book a free consultation